X



マルチスレッドプログラミング相談室 その9
0001デフォルトの名無しさん
垢版 |
2012/06/15(金) 01:31:57.88
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その8
http://toro.2ch.net/test/read.cgi/tech/1253521167/

■過去スレ
その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html
その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/
その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/
その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/
その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/
その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/
その7 ttp://pc12.2ch.net/test/read.cgi/tech/1215253576/

OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ
【OS】
【言語】
【実行環境】
【その他特記する事項】
0404デフォルトの名無しさん
垢版 |
2019/01/26(土) 17:42:01.46ID:stTjLhtD
400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに掛かってスケールしないと思うんですが、boolの配列(newしたもの)でやるとある程度スケールします。
何でですか?
0405デフォルトの名無しさん
垢版 |
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スレッドまでなら、
高速化が起きる気がする。

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

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

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

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

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

マルチコアでスケールできる処理って割りと限られてますね(汗。
0410デフォルトの名無しさん
垢版 |
2019/01/27(日) 19:45:46.51ID:UADZfhGv
>>408
[追加]

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

無いかもしれないけど。
0411デフォルトの名無しさん
垢版 |
2019/01/27(日) 19:48:31.17ID:UeSsBKpf
>>409
いや。例えば、バイナリだと、
rep movsd
の1命令がそこにあるだけで、命令表を見ればブロック転送をする命令とあって、
擬似命令レベルでの処理までは書かれているが、バス転送レベルでそれをCPUが
どう処理してるかまでは分からない。
0412デフォルトの名無しさん
垢版 |
2019/01/28(月) 03:22:00.62ID:3CrwaDYk
double 1GBをコピー元のデータを加工してからコピーする場合は、どうやってもスケールしないんですかね、この話の感じからして。
書き込みタイミングが結果論でずらせるので、並列化で多少は見込みアルのかな。ーー自分で実験した方が良いですね。
0413デフォルトの名無しさん
垢版 |
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 の処理が終わるまで待機すれば良い。
0414デフォルトの名無しさん
垢版 |
2019/01/31(木) 02:15:04.55ID:1/qzJ5j1
キャッシュにデータを書き込むけどメモリに書き込まない、とか
キャッシュのデータをメモリに書き込む動作をC++など言語で実装できないでしょうか。
勘でやる他ないのでしょうか。
0415デフォルトの名無しさん
垢版 |
2019/01/31(木) 13:32:39.64ID:OGxiQZdZ
>>414
自分で inline アセンブラか、単体のアセンブラを使えば出来る。
ただし、VC++ の inline アセンブラを使う場合は、結局、どんなコード
になるか分からない部分があるので、アセンブリ・ソース出力オプションか、
または、IDE の逆アセンブラでコードを確認する必要があると思うが。

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

物凄い複雑なので、ちゃんと理解してないけど。
0419デフォルトの名無しさん
垢版 |
2019/07/19(金) 00:38:16.38ID:eyVpHwMv
質問:
ある資源を生成破棄するメーカースレッドがひとつと、その資源を使うユーザースレッドが複数ある。
メーカースレッドとユーザースレッドは排他的に資源にアクセスするが、ユーザースレッド同士は排他的でない。
どのように排他処理を実装すればよいか。
0423デフォルトの名無しさん
垢版 |
2019/07/19(金) 21:19:16.26ID:oxWniFkv
動くよ
ただしハードウェアリソース的に余裕がある部分(SSEとか)位しかあまり効果がないな
マルチスレッドではやや分がある
というのはコンテキストスイッチの負荷が純粋に1/2になる
レジスタの内容をメモリに退避する回数が1/2になればそりゃ軽くなるよね
整数演算ではあまり期待しない方がいい
0424デフォルトの名無しさん
垢版 |
2019/07/19(金) 22:46:03.30ID:tF13LP95
同時に動いてないなら排他制御しなくていいみたいな勘違いしてそうな質問だ。
0425デフォルトの名無しさん
垢版 |
2019/07/19(金) 23:08:15.01ID:JGHPeX3b
そこまで深くは考えてなかったんだけど。
CPUコアひとつなのにどうやって2スレッド同時に動くのか不思議だったから。
0426デフォルトの名無しさん
垢版 |
2019/07/20(土) 10:22:32.66ID:aCn5nh8Q
実際に鯖用CPUではHT切ってあるもんな
かえってパフォーマンスが低下するとかで
最近の例の脆弱性との絡みもある
その代わり最初からコアいっぱい積んでいる
0428デフォルトの名無しさん
垢版 |
2019/07/20(土) 12:15:42.11ID:D7d7RY7Z
on/offをアプリ側で指定できないし、
性能が線形に上がらない時点でHTを考慮した設計は面倒すぎる。
0429デフォルトの名無しさん
垢版 |
2019/07/20(土) 13:01:11.01ID:aCn5nh8Q
マルチスレッド・デザインパターンの本にあった例だけど
ワーカースレッド(スレッドプール)を実装せよ
なお言語は自由とする
0430デフォルトの名無しさん
垢版 |
2019/07/20(土) 22:48:42.36ID:xFVhhGJz
マルチスレッドの解説本はいくつもあるけど
マルチプロセッサのプログラミングって参考書ないのかね。
0431デフォルトの名無しさん
垢版 |
2019/07/21(日) 00:29:38.70ID:9qa3Jnjy
マルチスレッドの解説本でカバー出来ないくらいのマルチプロセッサのプログラミングだと
かなりマニアックというかプロセッサ固有の問題の割合が大きくなると思うので
そういう方面で探すしかないのではないか
それだけに特化した専門書は無いかもね
0432デフォルトの名無しさん
垢版 |
2019/07/21(日) 00:46:58.94ID:gryZIvyQ
行列演算を並列処理とかそういう粒度の細かな並列化の話ばっかりで。
せっかく10コアとかあるんだから、各コアに別々のプログラムを走らせておいて
同期しながら処理とかしたいんだけどどうするのがいいかよく分からない。
fork させてメッセージやりとりすれば良さそうなんだけど。
やりたいことがちょっと特殊かもね。
0434デフォルトの名無しさん
垢版 |
2019/07/21(日) 01:24:11.69ID:YuxLcsPo
OpenMPみたいなのを手動でやるって話かな
マルチコアだとメモリ帯域がボトルネックになりやすいから
巨大な行列計算は少し粒度を荒くしたMPIの方が強いよね
0436デフォルトの名無しさん
垢版 |
2019/07/21(日) 08:19:29.20ID:gryZIvyQ
>>433
むしろアセンブラのほうが分かりやすいんだけど。

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

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


ハンドルが有効であることは保証されているけど
実行順についての言及はないし、
そもそも別スレッドなら、どちらが先に行われるかについては何の保証もないと考えるべきじゃないのかな
「APIから戻る」のだって実行権がなければ後回しにされる可能性はあるんだから
0441sage
垢版 |
2021/03/06(土) 05:17:04.33ID:0GCeIGT3
>>440
ご返信ありがとうございます。概ね理解できました。
勉強不足で、マルチスレッドの仕組みについて誤解していたようです。
0442デフォルトの名無しさん
垢版 |
2021/03/06(土) 11:08:41.13ID:pd/Aiz5V
ちなみにCentOSはスレッドのコアが指定できるよ。
0444デフォルトの名無しさん
垢版 |
2021/03/06(土) 13:08:47.51ID:VGFn/kw3
あわしろ氏によると、Macは既にオワコンなので、WSLを使うと良いらしい。
0445デフォルトの名無しさん
垢版 |
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
0447デフォルトの名無しさん
垢版 |
2022/04/14(木) 16:49:21.50ID:wwxSZsaE
マルチスレッド処理の花形といえばハードなリアルタイムスレッドとバックグラウンドスレッドの間のデータのやり取りだと思ってるんだが
スレの過疎っぷりを見るに、殆どの人にとって必要のないものだったんだな
0448デフォルトの名無しさん
垢版 |
2022/05/26(木) 01:42:01.15ID:EhvYdlEg
>>447
MS-DOS のデバイスドライバにでも痕跡が残っていたような‥
どうするつもりだったんだろう?
0449デフォルトの名無しさん
垢版 |
2022/05/26(木) 16:41:59.49ID:kr4vk/7I
>>447
ハードな略が動いている間はバック略を動かさないから大して考えることは無い
DOSの頃と同じだな
0450デフォルトの名無しさん
垢版 |
2023/10/18(水) 18:12:44.04ID:k+tvnK8M
>>432
 とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。

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

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

えっと、ちょっと補完。
サブスレッドの処理についてはループして待たせておく。終わったら終了を知らせるイベントを発生させる。
0453デフォルトの名無しさん
垢版 |
2023/10/19(木) 01:25:35.07ID:8UDFhheE
>>365
REID 1 みたいな例があるから必ずしも昔の技術というわけではないな。
レスを投稿する


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