マルチスレッドプログラミング相談室 その9

2014/03/15(土) 23:24:57.03ID:Jbm5xDHA
普通のリアルタイムではありえん
314313
垢版 |
2014/03/15(土) 23:26:35.57ID:Jbm5xDHA
訂正 以上です
2014/03/16(日) 01:00:35.01ID:67pIoXcC
リアルタイムシステムというのがRTOSを使っているという意味なら
送信側か他のタスクがwait入れてなくて書き込みタスクが動いていないとかってバグじゃないかな
>>313
時代は変わりCPUを使って圧縮したほうがIOが減って低レイテンシにできる
2014/03/16(日) 01:13:20.61ID:CvhR8B+T
リアルタイムっていうのは入力があってから何ms以内に応答を
返せなければならないみたいなシステムのことでしょ。
コンピュータ制御の工作機械で応答が遅くて削りすぎましたとか
許されないから。
2014/03/16(日) 01:14:58.23ID:Va0mC41/
>261だけど、概ね期待通りの動作になってきた
速度面でも、現在使用中のPCでシングルスレッドだと70時間ほど掛かってたから、
マルチスレッド化で6コアに分散して細部の調整込みで10時間切れれば恩の字と思ってたのに、なんと4時間半を切れたw
最新のCPUを使えば2時間も夢じゃないかも

あとは演算処理orデータのやり取りのバグを潰せばほぼ完成
(結果の個数が少し足りない)
2014/03/17(月) 12:29:47.16ID:iella/tJ
シングルスレッドのまま細部の調整とやらだけでどこまで行くのやら
2014/03/17(月) 15:11:57.25ID:ot8TfsyN
どんだけ時間がかかってるのやら。
320デフォルトの名無しさん
垢版 |
2014/06/13(金) 00:28:43.87ID:cRyKxN+T
共有/排他ができるロックと条件変数があるとき、これらを使って
共有から排他にエスカレーションできるロックを構成することってできる?
2014/06/13(金) 01:34:28.10ID:+YSiec3A
ロックとか条件変数って排他するものだよね。共有できるロックって何?
RCUのこと?
2014/06/13(金) 08:49:59.19ID:cRyKxN+T
ええと、いわゆるread-writeロックのこと。
323デフォルトの名無しさん
垢版 |
2014/11/06(木) 22:37:47.07ID:iaZsweTc
マルチスレッドは馬鹿には無理
馬鹿は使ったほうがいいところでマルチスレッドを使わずに
使わないほうがいいところっ使ってややこしくしたりする
2014/11/06(木) 23:24:42.11ID:ETjlkHcn
負荷分散とか難易度高なのにね
2014/11/09(日) 01:27:34.76ID:UGYkYxzf
スレッディング・ビルディング・ブロックについて勉強し始めた所なんだけど、どうなの?
理解して使うと安全で早くなりそうだとは思ったが、メモリ処理の効率とかどうなるんかな?
とか思ってる所なんだけど・・・
2014/11/09(日) 07:37:34.59ID:SGm17f1c
安全にするには、ある程度やった人しか...
2014/11/09(日) 22:48:01.80ID:wyNvyEnQ
メモリ処理の効率って具体的にどういう点?
mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?
2014/11/10(月) 09:36:09.81ID:W8sKwQAR
オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな

>>325
コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ
2014/11/12(水) 14:11:39.04ID:nS55KI9v
基礎的な質問で申し訳ないのですが
同じ変数に複数のスレッドがアクセスしてはいけないのはわかりますが
同じコードに複数のスレッドがアクセスするのはいいのでしょうか?
例えば何の変数にもアクセスしない関数を複数のスレッドが同時実行するのはいいのでしょうか?
2014/11/12(水) 14:21:32.89ID:Tjo57cUc
ダメな理由でも探してるの?
2014/11/12(水) 14:31:27.32ID:nS55KI9v
>>330
今書いているプログラムで
C#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って
2014/11/12(水) 14:35:31.55ID:Tjo57cUc
C#のシグナルってよーしらんけど
エラーが出るってことは、質問の内容と違うことやってるんじゃないの
2014/11/12(水) 15:18:29.39ID:ghkKScBM
同期オブジェクトを保持している変数を上書きしていそうな気がするんだが
2014/11/12(水) 16:32:42.96ID:yNtQ/r84
いろいろ分かってないだけだろう
2014/11/13(木) 06:29:27.90ID:w/Cn+ODk
ライブラリがマルチスレッドに対応してないだけかと
2014/11/13(木) 06:35:25.00ID:4ACzZkWI
/MT
2014/11/13(木) 13:44:55.73ID:t6y7WFqt
C#ならエラーメッセージやスタックトレースが出てるだろ
2014/11/15(土) 11:02:51.29ID:JwZZHuNb
>>329
同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数とstatic変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ
2014/11/16(日) 00:17:15.94ID:lWtIBSfv
同じ変数に複数のスレッドがアクセスするならクリティカルセクションが楽だ
340デフォルトの名無しさん
垢版 |
2014/11/16(日) 19:55:00.63ID:9ZsvKJox
linuxですがスレッドで同じファイルに書き込む場合、競合することってありますかね?
2014/11/16(日) 20:11:07.08ID:1qsvk//V
勿論。
2014/11/16(日) 21:20:39.95ID:4XTrCB2a
論外
2014/11/16(日) 21:40:57.77ID:Kyr5+wjo
>>339
もう win32 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?
344デフォルトの名無しさん
垢版 |
2014/11/30(日) 17:47:06.48ID:H8djdLBQ
複数のスレッドがひとつのミューテックスのアンロックを待っていた場合、
つぎにどのスレッドがミューテックスを取得するかはランダムですか
2014/11/30(日) 18:09:41.22ID:ddtepLmv
はい
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
2014/12/01(月) 00:39:51.39ID:Az7+Eliy
いいえ
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
2014/12/08(月) 19:13:20.61ID:PHJZbN+V
スレッドとミューテックスだけ覚えたけど
なにを作ったらいいのかわからんたい
2014/12/08(月) 22:37:39.16ID:PHJZbN+V
チャット作ることにしました
2014/12/08(月) 22:57:10.96ID:x3KHTevM
consumerとproducerみたいのがいいんじゃないのかなと思ったけど、
チャット作ることにしたのね
がんばってください
2014/12/08(月) 23:08:56.71ID:PHJZbN+V
>>349
チャットで詰まったら気分変えてConsumer-Producerにも挑戦してみます
あざす
351350
垢版 |
2014/12/09(火) 00:23:00.21ID:MJarMgeM
>>349
いや、ありがとうございます
2015/05/29(金) 22:45:34.32ID:gXnjRwZ6
Win8.1 Cygwin64bit g++のpthreadなんですが、マルチコアCPUなのに性能改善しません。
なにか特別なコンパイルオプションがあるとか
特別なライブラリをリンクしなければいけないとかあるのでしょうか。
-lpthreadはつけてます。
2015/05/30(土) 20:09:50.25ID:WwgHsNSJ
エスパー能力はありません
2015/05/30(土) 20:21:35.33ID:h4Yx63EK
そこをなんとかスーパーエスパーでお願いします
2015/05/30(土) 21:18:52.04ID:iD4l02SZ
誠意を見せてください
2015/06/15(月) 23:17:16.10ID:SZnUF3Ky
DISKへのアクセスって並列にしたって意味ないですか?

・・・
FileA読み込み(::ReadFile) 10秒
FileB読み込み(::ReadFile) 20秒
・・・

で30秒以上掛かりますが、
之をスレッドを起こしても意味無い?
2015/06/16(火) 00:49:42.46ID:s9cfeU7N
よくわかってないけどDISKの特性によるのかなぁとかいってみる。
2015/06/16(火) 01:06:01.70ID:ILaOeTTR
どういった特性ならどうなるのですか?
2015/06/16(火) 01:31:46.58ID:ZNZkvIJW
読み込みながら処理をしてみたいにな状態でない限りスレッド分けてファイル読むと遅くなるよ(デバイスが別であればまた違うのだが)
純粋にバイナリデータとしてファイルをメモリに丸ごと読み込むのであればスレッド分ける意味ない(CPUとメモリの方がディスクよりも遙かに速い)
2015/06/16(火) 01:39:58.55ID:ILaOeTTR
遅くなる理由はなんですか?
2015/06/16(火) 09:26:39.31ID:gU9w5dQ4
俺様の質問に答えろとさ
2015/06/16(火) 22:30:15.77ID:45Me4wJl
まともに答えるとまた暴れだすだろ
2015/06/20(土) 17:07:37.08ID:2GjEDXn2
>>360
FileAとFileBが同一のディスクに存在するとして、FileAがFileBが以下の
内容である場合、論理的に近いデータ(青森県と岩手県)は論理的に遠いデータ
(宮城県と長崎県)よりも物理的にディスクの近い位置に存在する可能性が
高いので、02→03→…→07→40→41→…→46という順番で読み込むほうが
02→40→03→41→…07→46という順番で読み込むよりも速く完了する可能性が
あります。

[FileA]
02青森県
03岩手県
04宮城県
05秋田県
06山形県
07福島県

[FileB]
40福岡県
41佐賀県
42長崎県
43熊本県
44大分県
45宮崎県
46鹿児島県
2015/08/25(火) 15:16:47.83ID:f9VpmzI5
いまどきのディスクはインターリーブなんか考慮しても意味無いぞ
2015/08/25(火) 23:23:52.89ID:SuXh7n4E
>>364
インターリーブってCPUが遅い時代の話だろ?
セクタリードの後でCPUが処理している間に次に読むべきディスク上の物理セクタが通り過ぎてしまうからシーケンシャルなセクタ処理でなくインターリーブした順序付けのセクタ使うって奴
2015/10/10(土) 23:10:25.42ID:bMLX+QzX
趣味プログラムでInterlockedCompareExchange
で値が交換できた時だけそのスレッドが処理を進められるような感じで
作りこんでいるんだけど、何かこれだと問題ある?
一般的にはクリティカルセクションを使った方がいい的な話を聞くんだけど
sizeof(CRITICAL_SECTION)がチョット大きすぎるので使うのをためらってしまう
2015/10/11(日) 01:12:22.19ID:DeMvW0Ba
>>366
レースする可能性があるくらいじゃね?
まあ、ほとんど問題ないと思うけど。
2015/10/11(日) 01:16:20.15ID:DeMvW0Ba
>>367
間違えた。
レースじゃなくてスタベーションだった。
2015/10/11(日) 10:38:15.80ID:P9PvwsgL
2016/02/06(土) 07:43:27.68ID:DtUiRvEm
int iで++iにミューテックスが必要ってことはiを同時に2つのスレッドが足しても2増えるだけで必要ないと思うんですけど?1しか増えないってこともあるんですか?
2016/02/06(土) 08:26:40.76ID:DtUiRvEm
CPUによってアトムが違うから必要ってことですねわかりました。
2016/02/06(土) 08:57:53.38ID:AVvIsuem
御茶ノ水の博士の設計
2016/03/07(月) 00:30:59.08ID:jKz+oF2h
>>370
Aスレッド:iから1を読み込んで++して2を代入
Bスレッド:iから1を読み込んで++して2を代入
答えは1増える
2016/03/08(火) 01:40:29.32ID:YkHc2UTm
レース状態のことやね
2016/03/20(日) 12:54:59.05ID:upopZnIF
同じcondition_variableでブロックしているスレッドが複数ある場合に、
notify_oneをしたら、どのスレッドが起床するのだろうか。
376デフォルトの名無しさん
垢版 |
2016/03/29(火) 08:51:54.17ID:/c8bAcK4
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
2016/05/20(金) 22:39:11.46ID:/6R1fTEV
>>375
リファレンス読め
378デフォルトの名無しさん
垢版 |
2016/05/23(月) 02:01:11.63ID:xOdUGJqd
CAS命令でロックしている部分を
_xbegin _xend やら xxx_HLEAcquireで代用すればCAS命令分のWaitをチャラにできるかと思ったんだけど
結果微妙に遅くなっただけだった
使い方間違っているのかなTSX
379デフォルトの名無しさん
垢版 |
2016/12/09(金) 07:26:48.14ID:WzSsU1Dc
マルチスレッドにおける変数の排他処理についてなんだけど、
排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?
読み取り最中に書き換えたり、書き換え最中に読み取った場合にデータが破壊されるというだけの話だよね?

例えば2byteの変数があって、スレッドAが1byte目を読み込んだ時点でスレッドBが2byte目を書き換え、
そこでスレッドAが2byte目を読み取った場合に、
データが上位1byteと下位1byteで別のデータを読み取ったことになっておかしくなるってことだよね?

ということは何らかのフラグで下位1bitのみを利用するような変数であれば、
上記のような状況は起きないから排他処理しなくても大丈夫って認識でOK?
2016/12/09(金) 09:38:28.68ID:uxrmDz9Z
馬鹿乙
2016/12/09(金) 13:52:04.09ID:GFY666CI
>>379
>>マルチスレッドにおける変数の排他処理についてなんだけど、
>>排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?

変数というだけでは分からない。
構造体とかC++の変数とかはそちらから見ても明らかに問題のはず。

>>ということは何らかのフラグで下位1bitのみを利用するような変数であれば、
>>上記のような状況は起きないから排他処理しなくても大丈夫って認識でOK?

1bit(あるいは1バイト、1ワード)がアトミックにアクセスできる
ことはシステムによって保証されていることが多い。

だから、その1bitの読み書きは出来る。
しかし大丈夫とか問題ないかということは、何を問題とするかを
書かないと答えようがない。

1bitはこれ以上分割できないので1ビットの半分だけ違う値になる、
ということはありえない。そういう心配をしてるなら大丈夫
382デフォルトの名無しさん
垢版 |
2016/12/09(金) 16:50:23.32ID:WzSsU1Dc
ありがとう!
大丈夫かどうかというのは、
排他制御が行われていない変数へのアクセスそのものが原因となってソフトウェアがクラッシュしたり、
OSやハードウェアレベルの問題は起きたりしないよね?って意味

C言語で下位1bitしか使わない排他処理が行われてない変数があり、その1bitをif文で判定して処理を2通りに分ける場合、
必ずその2通りのどちらかになることは保証されるよね?
できるだけ高速化したいから、できるだけ排他処理はしたくない。
2016/12/09(金) 18:10:37.82ID:uxrmDz9Z
やっぱりアホか
384デフォルトの名無しさん
垢版 |
2016/12/09(金) 18:37:52.31ID:R3c5DqP6
>>382
馬鹿が書くと機械的に壊れることもあります
ソレノイドが焼損とか日常茶飯事
385デフォルトの名無しさん
垢版 |
2016/12/09(金) 21:27:34.75ID:WzSsU1Dc
>>384
どのパーツのソレノイド?
説明してくれ。
パソコンは自作やら修理やらよく頼まれ続けてきてるから専門的な話OKだ。
386デフォルトの名無しさん
垢版 |
2016/12/10(土) 23:59:30.12ID:mx8/lQPw
すいません質問します。
Matlobで、
例えば5000×5000の行列をAとして
その10×10の区分行列をBとします。
Aの対角線上にあるBだけを取り出して他が0行列の行列を作るにはどうすればいいですか?
また、各Bの対角要素だけ取り出すにはどうすればいいですか?
387デフォルトの名無しさん
垢版 |
2016/12/11(日) 00:44:10.55ID:pm6ghExK
・とりあえず全てのパラメータから0を1つずつ取り除く
・Aは500×500の行列
・Bはたった1つの要素で、インデックスは i = j
 それが500個ある
・つまり、「i==jであれば取り出す」それ以外は0にする。
・では、それを10倍したら?「 i ÷ 10 == j ÷ 10 」であれば、
 取り出す(但し余りは全て切り捨てる)それ以外は全て 0
・但し i jの上限はインデックスが0からとして、4999までとする。
・俺はMatlabは使ったことが無いので具体的な実装は知らない。

・その次
・i と jの上限は 4999
・対角の部分行列は簡単、「i == jならば」取り出す。
・その右は、「i == j + 10 」も該当
・同様に、「i == j + 20, 30 ... 10*n ... 10*499」も該当
・同様に、「 i + 10 == 」も該当
・「i + 20, 30 ... 10*n ... 10*499 == j 」も該当
・「該当しなかったもの」はその都度0を代入する
2016/12/11(日) 09:12:59.03ID:nmNJ+GHK
アホ
389デフォルトの名無しさん
垢版 |
2016/12/11(日) 10:53:35.53ID:PFNTM+nw
>>387
ありがとうございます。やってみます。
2016/12/17(土) 10:53:31.14ID:WxRoohcq
>>381
ウソ乙
391デフォルトの名無しさん
垢版 |
2017/03/29(水) 21:36:43.88ID:QetAZaUg
【OS】OSX 10.8.5、Core i5
【言語】 C, C++
【実行環境】 XCode5.1, pthread

pthread を使って for ループを分割して実行するプログラムを書いたのですが、直列処理の方が速いです。
tbbやOpenMP でもやってみたのですが、直列の方が速いです。

上記の環境ではマルチスレッドで効率化を図るには、何か設定が必要なのでしょうか。
ざっくりした質問ですがヒントになるようなことでも教えて下さい。
2017/03/29(水) 22:31:24.61ID:urajtArt
マカーか
2017/03/29(水) 23:09:26.86ID:TE60yoif
>>391
プログラムを見ないと分からない。
マカーじゃないから見ても分からないかもしれないけど。

大前提として、マルチスレッド化して速くなるようなジョブなんだよね?
スレッドを作るのもjoinするのもスイッチするのも時間が掛かるので、
それらがペイしないと意味がない。

ちゃんと作っていて遅いのなら、キャッシュの競合の可能性があるかも
394デフォルトの名無しさん
垢版 |
2017/04/02(日) 18:18:24.01ID:mBDn/7kD
tbbのくっそ初心者です。
下記のコードを試したのですが、直列実行した方が速かったです。
これってそもそも並列化しても速くならない類の処理なのでしょうか?

int main( int argc, const char * argv[] ) {
tbb::task_scheduler_init init( 4 ); // 物理2スレ、論理4スレ core i5
PrimeCounter counter;
tbb::parallel_reduce( tbb::blocked_range< int >( 0, count__, count__ / 4 ), counter, tbb::simple_partitioner() );
}

他所のヘッダにて、

bool isPrime( int n ) { // この処理がアホみたいなのはわざとです
if ( n < 2 ) return false;
if ( n == 2 ) return true;
for ( int j = 3; j < n; ++j ) { if ( n % j == 0 ) { return false; } }
return true;
}

class PrimeCounter {
public:
int count;
PrimeCounter() : count( 0 ) {}
PrimeCounter( const PrimeCounter& instance, tbb::split ) : count( 0 ) {}
void operator() ( const tbb::blocked_range< int >& range ) {
for ( int i = range.begin(), end = range.end(); i < end; ++I ) {
if ( isPrime( i ) ) { ++count; } }
}
void join( const PrimeCounter& pc ) { count += pc.count; }
};
395デフォルトの名無しさん
垢版 |
2017/04/02(日) 18:29:20.77ID:mBDn/7kD
書き忘れ >>391 のマカーです。
2017/04/02(日) 18:45:45.15ID:mBDn/7kD
度々すみません、タイポありました。(多分本筋と関係ないですが)
関数 bool isPrime( int n ) のループ。
 誤 for ( int j = 3; j < n; ++j )
 正 for ( int j = 2; j < n; ++j )
2017/05/03(水) 16:23:24.52ID:E3YCeKkn
RelativisticProgrammingを日本語で解説してるとこ、ないかな?
2017/05/04(木) 03:11:44.69ID:N/fwOcUx
++j
2017/09/17(日) 19:09:14.78ID:iyMogwhx
#include <stddef.h>
offsetof(type, member-designator);
400デフォルトの名無しさん
垢版 |
2018/05/23(水) 21:43:17.32ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

4DXJZ
401デフォルトの名無しさん
垢版 |
2018/07/05(木) 00:17:03.60ID:RfoszcD2
Z1B
2018/10/28(日) 23:21:28.63ID:bVjvgsxo
>>394
超亀レスだしテキトーだけど、counterがシングルトンなら
countのインクリメントでシリアライズされるんじゃね?
403デフォルトの名無しさん
垢版 |
2019/01/13(日) 12:43:26.12ID:P4nmFhbL
Intelのハイパースレッドでスケールするか否かのアルゴやデータ構造のパターンとか、評価基準をまとめた本なりサイトなり御存じでしたら教えてください。
404デフォルトの名無しさん
垢版 |
2019/01/26(土) 17:42:01.46ID:stTjLhtD
400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに掛かってスケールしないと思うんですが、boolの配列(newしたもの)でやるとある程度スケールします。
何でですか?
2019/01/26(土) 18:19:40.68ID:yUYodqfD
>>404
bool の配列が、例えば、8個の bool 値をまとめて 1バイトとして格納している場合で、
for ( i =0; i < 100000; i++ ) {
dst[i] = src[i];
}
のように書いて、かつ、コンパイラがこのループを「そこまでの」最適化はしなかった場合、
32BIT 環境の場合なら、32回のループで 1 DWORD 分の実メモリやキャッシュ・メモリへの
転送が生じるだけになるかも知れない。その他のメモリアクセスは、基本、code の
fetch だけになり、全てCPU内部のキャッシュ・メモリに乗ってしまう。

だから、マルチスレッドでこのループを分割して行えば、32スレッドまでなら、
高速化が起きる気がする。

そういう問題でなくて?
2019/01/26(土) 18:25:13.78ID:VVr2JTND
>>404
あ、あと
>400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに
>掛かってスケールしないと思う

これだけど、以外に高速化されたりするかもしれない。
実際の CPUはそんなに賢くないので。

色々複雑。
2019/01/27(日) 00:13:20.29ID:UeSsBKpf
チップセットや DDR DRAM、バス・アービタなどの事はそんなに詳しくは無いけど、
「ブロック転送命令」みたいなのがあるかも知れない。そして、
CPU で、rep movsd などが実行されるとき、CPU は、自分で転送せずに
チップセットと連携してバス・アービタにその命令を発行し、すぐに次の命令
から実行を再開したりするかも知れない。昔で言う「バスマスタ転送」や「DMA転送」
に似たようなやり方。

なんでそう思うかというと、主記憶(外部メモリ)はCPUのクロック速度にはついていけない
はずなのに、以外に CPU のブロック転送が速い気がするから。

確認は取ってない。
408デフォルトの名無しさん
垢版 |
2019/01/27(日) 19:38:20.44ID:0CxMXTRb
返信ありがとう。
DMA転送できるものをコンパイラが探知できるか疑問に思ってました。CPU機能としてのブロック転送は関係ありそうですね。
ワード単位処理は確かにやってそうです。

マルチコアでスケールできる処理って割りと限られてますね(汗。
2019/01/27(日) 19:45:29.93ID:upukWAKG
バイナリ見れば済む話だよね^^
2019/01/27(日) 19:45:46.51ID:UADZfhGv
>>408
[追加]

DMAでなくとも、CPU自身が命令実行の処理とは独立して主記憶の間で
転送をする仕組みは当然あるので、ブロック転送の予約みたいな事で、
実際の転送処理が終わってなくても次の命令に進んだりするようなことは
あるかも知れないと想像してみる。

無いかもしれないけど。
2019/01/27(日) 19:48:31.17ID:UeSsBKpf
>>409
いや。例えば、バイナリだと、
rep movsd
の1命令がそこにあるだけで、命令表を見ればブロック転送をする命令とあって、
擬似命令レベルでの処理までは書かれているが、バス転送レベルでそれをCPUが
どう処理してるかまでは分からない。
412デフォルトの名無しさん
垢版 |
2019/01/28(月) 03:22:00.62ID:3CrwaDYk
double 1GBをコピー元のデータを加工してからコピーする場合は、どうやってもスケールしないんですかね、この話の感じからして。
書き込みタイミングが結果論でずらせるので、並列化で多少は見込みアルのかな。ーー自分で実験した方が良いですね。
2019/01/28(月) 11:26:24.99ID:jKaiFfBH
>>412
1. 「加工」が単純に N 個に分割して処理できるものなら、N core の CPU の場合は、
  大体 N 倍高速化できる可能性がある。

2. 加工の処理を大体同じ時間がかかる N 回のステージに分割できる場合、1つずつの
  ステージを別々のCore で処理すれば、上手くすれば、大体 N 倍高速化できる。
  ステージ 1 の出力をステージ2の入力にして、ステージ2の出力をステージ3の
  入力にして・・・、という具合にするが、N が十分大きければ、高速化できる。
  CPU 内部のスーパー・パイプラインも同じ考え方で、1つの命令をなるべく
  たくさんのステージに分割することで、1つずつのステージの処理自体は軽く
  されている。処理が軽ければロジックの入力から出力結果が出るまでの時間が
  短く出来るのでクロック数を上げることができる。これと同じことが、ソフトウェア
  の世界でも成り立つ。。

3. コピーの処理が完全に終わるのを待つ必要が無いなら、コピーを Sub Core で行えば、
  Main Core は、待ち時間 0 で次の命令の実行に移れる。コピー後のデータを読み取る
  必要が出てきた場所で初めて、同期オブジェクトの WaitForSingleObject()、
  SetEvent() などで Main Core が Sub Core の処理が終わるまで待機すれば良い。
414デフォルトの名無しさん
垢版 |
2019/01/31(木) 02:15:04.55ID:1/qzJ5j1
キャッシュにデータを書き込むけどメモリに書き込まない、とか
キャッシュのデータをメモリに書き込む動作をC++など言語で実装できないでしょうか。
勘でやる他ないのでしょうか。
2019/01/31(木) 13:32:39.64ID:OGxiQZdZ
>>414
自分で inline アセンブラか、単体のアセンブラを使えば出来る。
ただし、VC++ の inline アセンブラを使う場合は、結局、どんなコード
になるか分からない部分があるので、アセンブリ・ソース出力オプションか、
または、IDE の逆アセンブラでコードを確認する必要があると思うが。

ただ、個人的には、それ以上に、IA32のキャッシュ制御命令は、大量の
文書を読んで理解するのが大変に思うけれど。
416デフォルトの名無しさん
垢版 |
2019/04/02(火) 09:07:07.70ID:KCTAV4Kj
>>414
intelの大体i5以上の新しい石だと
_xbegin _xend 等の1次キャッシュから下位のメモリへの
ストアタイミングをコントロールできるTSX命令群がそれっぽいかと思う
2019/04/02(火) 12:22:49.68ID:ZD2r0ERn
確か、もっと古いCPUでも、
mfence や、movxxxxx 系の命令でも色々出来たと思う。

物凄い複雑なので、ちゃんと理解してないけど。
2019/04/02(火) 12:29:24.16ID:LpV8NoZ4
以下のようなものも関係している。複雑すぎて理解してない。

https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-429.html

・WBINVD, PREFETCHh, CLFLUSH, CLFLUSHOPT,
・非一時的な移動命令(MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS,
 MOVNTPD, INVD)
・第3レベルのキャッシュ無効化フラグ(IA32_MISC_ENABLE MSRのビット6)
419デフォルトの名無しさん
垢版 |
2019/07/19(金) 00:38:16.38ID:eyVpHwMv
質問:
ある資源を生成破棄するメーカースレッドがひとつと、その資源を使うユーザースレッドが複数ある。
メーカースレッドとユーザースレッドは排他的に資源にアクセスするが、ユーザースレッド同士は排他的でない。
どのように排他処理を実装すればよいか。
2019/07/19(金) 02:31:14.72ID:jdncuoqE
>>419
Producer-Consumerパターンか
間にChannel挟めばちゃんと動くよ
2019/07/19(金) 03:55:47.52ID:J62Ms8NU
課題
2019/07/19(金) 20:31:45.43ID:XW48gDPw
2コア4スレッドってCPUだと
4スレッド同時に動くの?
2019/07/19(金) 21:19:16.26ID:oxWniFkv
動くよ
ただしハードウェアリソース的に余裕がある部分(SSEとか)位しかあまり効果がないな
マルチスレッドではやや分がある
というのはコンテキストスイッチの負荷が純粋に1/2になる
レジスタの内容をメモリに退避する回数が1/2になればそりゃ軽くなるよね
整数演算ではあまり期待しない方がいい
2019/07/19(金) 22:46:03.30ID:tF13LP95
同時に動いてないなら排他制御しなくていいみたいな勘違いしてそうな質問だ。
2019/07/19(金) 23:08:15.01ID:JGHPeX3b
そこまで深くは考えてなかったんだけど。
CPUコアひとつなのにどうやって2スレッド同時に動くのか不思議だったから。
2019/07/20(土) 10:22:32.66ID:aCn5nh8Q
実際に鯖用CPUではHT切ってあるもんな
かえってパフォーマンスが低下するとかで
最近の例の脆弱性との絡みもある
その代わり最初からコアいっぱい積んでいる
2019/07/20(土) 10:23:03.60ID:aCn5nh8Q
×切ってある
◯BIOSで自分で切っている
2019/07/20(土) 12:15:42.11ID:D7d7RY7Z
on/offをアプリ側で指定できないし、
性能が線形に上がらない時点でHTを考慮した設計は面倒すぎる。
2019/07/20(土) 13:01:11.01ID:aCn5nh8Q
マルチスレッド・デザインパターンの本にあった例だけど
ワーカースレッド(スレッドプール)を実装せよ
なお言語は自由とする
2019/07/20(土) 22:48:42.36ID:xFVhhGJz
マルチスレッドの解説本はいくつもあるけど
マルチプロセッサのプログラミングって参考書ないのかね。
2019/07/21(日) 00:29:38.70ID:9qa3Jnjy
マルチスレッドの解説本でカバー出来ないくらいのマルチプロセッサのプログラミングだと
かなりマニアックというかプロセッサ固有の問題の割合が大きくなると思うので
そういう方面で探すしかないのではないか
それだけに特化した専門書は無いかもね
2019/07/21(日) 00:46:58.94ID:gryZIvyQ
行列演算を並列処理とかそういう粒度の細かな並列化の話ばっかりで。
せっかく10コアとかあるんだから、各コアに別々のプログラムを走らせておいて
同期しながら処理とかしたいんだけどどうするのがいいかよく分からない。
fork させてメッセージやりとりすれば良さそうなんだけど。
やりたいことがちょっと特殊かもね。
2019/07/21(日) 01:03:16.42ID:oN+9KGia
質問の低レベル化が甚だしい。アセンブラを勉強して基礎固めを。
2019/07/21(日) 01:24:11.69ID:YuxLcsPo
OpenMPみたいなのを手動でやるって話かな
マルチコアだとメモリ帯域がボトルネックになりやすいから
巨大な行列計算は少し粒度を荒くしたMPIの方が強いよね
2019/07/21(日) 01:57:36.05ID:dcJVZcgj
10コアとかいってるからマルチプロセッサというよりメニーコア活用術?
2019/07/21(日) 08:19:29.20ID:gryZIvyQ
>>433
むしろアセンブラのほうが分かりやすいんだけど。

各コアにPCセットして起動すればいいの?
プロセッサの仕様書読んでみるわ。
2019/07/21(日) 08:23:47.17ID:nevBE1rB
並列処理じゃなくて並行処理で探せば
2019/12/05(木) 19:00:58.65ID:sV2dE7Px
マルチスレッドの排他処理で詰まってスレ検索して来てみたけどこのスレは高尚過ぎるなw
初心者スレにでも行こう
439デフォルトの名無しさん
垢版 |
2021/03/04(木) 23:27:05.69ID:320wEDvY
_beginthreadex() を使ったマルチスレッドプログラムについて質問です。
この関数の説明を見ると、「_beginthreadex() のコールに成功すると、スレッドのために
タイムスライスが割り当てられたか否かによらず、スレッドはアクティブ(non-signal)になる」
とあったのですが、_beginthread() がスレッドハンドルを返すよりも前にスレッド関数内の
処理が実行される(完了する)ことはありえますか?
2021/03/05(金) 15:45:04.28ID:0Dz+Yobc
>成功した場合、これらの各関数は、新しく作成されたスレッドへのハンドルを返します。ただし、新しく作成されたスレッドが短時間で終了した場合、 _beginthread は有効なハンドルを返さない可能性があります。 (「解説」の説明を参照してください)。

>_Beginthread よりも _beginthreadex を使用する方が安全です。 _Beginthread によって生成されるスレッドが短時間で終了した場合は、 _beginthread の呼び出し元に返されるハンドルが無効であるか、別のスレッドを指している可能性があります。 ただし、 _beginthreadex によって返されるハンドルは _beginthreadex の呼び出し元によって閉じられる必要があるため、 _beginthreadex がエラーを返さなかった場合は、有効なハンドルであることが保証されます。


ハンドルが有効であることは保証されているけど
実行順についての言及はないし、
そもそも別スレッドなら、どちらが先に行われるかについては何の保証もないと考えるべきじゃないのかな
「APIから戻る」のだって実行権がなければ後回しにされる可能性はあるんだから
441sage
垢版 |
2021/03/06(土) 05:17:04.33ID:0GCeIGT3
>>440
ご返信ありがとうございます。概ね理解できました。
勉強不足で、マルチスレッドの仕組みについて誤解していたようです。
442デフォルトの名無しさん
垢版 |
2021/03/06(土) 11:08:41.13ID:pd/Aiz5V
ちなみにCentOSはスレッドのコアが指定できるよ。
2021/03/06(土) 11:30:24.47ID:UzpsIFsk
macOSだとコア指定できない。
444デフォルトの名無しさん
垢版 |
2021/03/06(土) 13:08:47.51ID:VGFn/kw3
あわしろ氏によると、Macは既にオワコンなので、WSLを使うと良いらしい。
445デフォルトの名無しさん
垢版 |
2021/03/25(木) 15:15:49.52ID:LuSagST9
針に糸を通す( thread a needle
糸をつむぐ( spin thread [yarn]
糸が切れた( The thread broke.
琴の糸を締める( tighten a string of a koto
糸をかき鳴らす( strum the strings
2021/04/03(土) 09:59:34.29ID:CHs8071g
このスレ来年で10年か
スレ推奨図書とかないの?
2022/04/14(木) 16:49:21.50ID:wwxSZsaE
マルチスレッド処理の花形といえばハードなリアルタイムスレッドとバックグラウンドスレッドの間のデータのやり取りだと思ってるんだが
スレの過疎っぷりを見るに、殆どの人にとって必要のないものだったんだな
2022/05/26(木) 01:42:01.15ID:EhvYdlEg
>>447
MS-DOS のデバイスドライバにでも痕跡が残っていたような‥
どうするつもりだったんだろう?
2022/05/26(木) 16:41:59.49ID:kr4vk/7I
>>447
ハードな略が動いている間はバック略を動かさないから大して考えることは無い
DOSの頃と同じだな
450デフォルトの名無しさん
垢版 |
2023/10/18(水) 18:12:44.04ID:k+tvnK8M
>>432
 とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。

 サブスレッドはイベント処理とWaitForSingleObjectで待たせておいて、メインスレッドから情報を送って
SetEventでイベントを動かす。メインスレッドはサブスレッド9個からSetEventでイベントが返らない限り
イベントとWaitForSingleObjectを駆使して止めておく。
451デフォルトの名無しさん
垢版 |
2023/10/18(水) 18:13:06.20ID:k+tvnK8M
>>432
 とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。

 サブスレッドはイベント処理とWaitForSingleObjectで待たせておいて、メインスレッドから情報を送って
SetEventでイベントを動かす。メインスレッドはサブスレッド9個からSetEventでイベントが返らない限り
イベントとWaitForSingleObjectを駆使して止めておく。
452デフォルトの名無しさん
垢版 |
2023/10/18(水) 18:16:53.34ID:k+tvnK8M
>>450-451
あ”、二重投稿になったか。

えっと、ちょっと補完。
サブスレッドの処理についてはループして待たせておく。終わったら終了を知らせるイベントを発生させる。
453デフォルトの名無しさん
垢版 |
2023/10/19(木) 01:25:35.07ID:8UDFhheE
>>365
REID 1 みたいな例があるから必ずしも昔の技術というわけではないな。
2023/10/19(木) 01:28:22.25ID:8UDFhheE
>>16
 あれって、OSの機能だから気にしなくても良いというのでは駄目か?
2025/05/12(月) 13:23:26.42ID:Zw0HuL6G
1000msecでコンテキストスイッチ何回発生するんだこれ
2025/05/12(月) 13:41:45.50ID:zCv6/zTu
ここで multi process な質問は反則?
457デフォルトの名無しさん
垢版 |
2025/05/13(火) 15:19:11.88ID:lpqGnCjc
高級言語しか使えない身で話すけど
Pythonで超重量級のCPU処理とOpenAIに対するリクエストで数秒I/Oに飛ぶ処理の二つがそれぞれタスクに分解されてるとき、
前者のタスクが処理完了すると後者のタスクで数個~数十個くらいタスクが新規作成されて、(c, c, c, i, i, i, i, i, i, c, i, i,...)
内部どうなってるのか知らんけどI/OでGIL解放されても後続のタスクが何個も後者のタスクだから前者のタスクがくそ遅延するってあり得る?
両者のタスクを別々のプロセスに切り分けたら前者のタスクが遅延するとかいうことなくなったんだけどさ
2025/05/14(水) 17:07:33.93ID:uDIzjmjF
そういう場合
同じ状況になる再現コードを貼りましょう
459デフォルトの名無しさん
垢版 |
2025/05/14(水) 17:34:26.40ID:Ga6mti+e
5次方程式に新公式を発見:ルートを超える新理論
2025.05.14 17:05:56 WEDNESDAY
https://nazology.kusuguru.co.jp/archives/177496
>>オーストラリアのニューサウスウェールズ大学(UNSW)で行われた研究
プログらまーも覚えるとよい

125年越しに解決したかもしれない「ヒルベルトの第6問題」とは?
2025年05月10日 15時00分
https://gigazine.net/news/20250510-hilberts-6th-problem-solved/
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況