- 1 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 17:19:27 ]
- マルチスレッドプログラミングについて語るスレ
■前スレ マルチスレッドプログラミング相談室 その7 pc12.2ch.net/test/read.cgi/tech/1215253576/ ■過去スレ その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/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他特記する事項】
- 369 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 11:18:50 ]
- すみません、spin-lockをしている間にCPUの使用率を下げる方法を知っている方はいますか?
調べてみると、rep;nop命令やSSEのpause命令をがそれに該当するように思えるのですが、 使ってみても何ら変わりませんでした。 自作のスレッドバリア関数(自作のspin_lock)を作って、 たとえば、 if(threadnum=5) sleep(10); my_barirrer(); とするとスレッド5を待っている間は5以外のCPU使用率が100%近くなってしまいます。 それに対してOpenMP使った場合では、 if(threadnum=5) sleep(10); #paragma omp barirrer だと待っている間はCPU使用率は殆ど変わりません。 ちなみに自作のspinlockは下記のような感じです。 if(thread_num == 0) { asm volatile( "Loop1:\n\t\t" "movl (%0), %%eax\n\t\t" "movl (%1), %%ebx\n\t\t" "lfence\n\t\t" "cmpl %%ebx, %%eax\n\t\t" "rep;nop\n\t\t" "jne Loop1\n\t\t" : :"r"(&lock->sync), "r"(&lock->maxthreads) :"memory","%eax","%ebx" );
- 370 名前: ◆0uxK91AxII mailto:sage [2010/04/21(水) 15:37:33 ]
- >>369
方法はあるけど、物凄くマヌケで無意味だから誰もやらない。
- 371 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 19:01:35 ]
- スレッドとかの切り替えを自前で用意するとか
- 372 名前:369 mailto:sage [2010/04/22(木) 09:40:25 ]
- いろいろと試してみたのですが、マヌケな方法しか思いつきませんでした。
(スピンを何回かしたら、nanosleepを使うとか) pthreadのライブラリのソースを見てみると、futexのシステムコールが呼ばれているようですね。 OpenMPで生成したスレッドの中で実行される関数間でスレッドの同期をとりたかったのと、 せっかくOpenMPを使っているから、 pthreadとか使いたくなかったので自前のspin_lockを作ってみました。 マヌケな質問をしてすみませんでした。
- 373 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 03:22:14 ]
- ヒント:スピンロックを使わない
- 374 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 22:01:03 ]
- Win32でスレッド間のイベント通知をやりたいんですが
2つのスレッドが同時にそれぞれSetEvent(), ResetEvent()を呼び出した場合の動作って定義されてるんでしょうか? やっぱりクリティカルセクションで囲ってやらないとまずいですか?
- 375 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 22:39:08 ]
- >>374
囲む必要は無い。
- 376 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 08:17:54 ]
- >>375
ありがとうございます。
- 377 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 20:41:23 ]
- イベントオブジェクト自体の動作には問題ないけど、
使い方ミスりやすいから十分気を付けた方がいいよ。
- 378 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 23:08:00 ]
- プロのコードではイベントオブジェクトは使われない
- 379 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 23:37:24 ]
- 配布したときに問題が出るからな
- 380 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 03:50:40 ]
- どんな?
- 381 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:45:33 ]
- 無名にすれば他のプロセスと衝突することも無いし、kernel32.dllだから別にDLLも不要だし問題が思いつかないな
- 382 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 07:37:01 ]
- なんか勘違いしてんだろ
- 383 名前:デフォルトの名無しさん [2010/05/16(日) 21:15:32 ]
- wait-freeなキューの実装を可能にするのに必要な不可分操作ってどんなんですか?
- 384 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 23:08:56 ]
- 候補となる不可分操作には何があるの?
- 385 名前:383 [2010/05/16(日) 23:57:41 ]
- >384
JAVAのConcurrentLinkedQueueだとCASをつかってるってことしか知りませんが..
- 386 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:45:56 ]
- wikiによるとcasみたいだね
ja.wikipedia.org/wiki/Lock-free%E3%81%A8Wait-free%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
- 387 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 23:12:58 ]
- スレッド間のヘルスチェックに定番な方法ってあるのでしょうか?
・マスターなスレッドAが外部変数にスレッド数分bit1を立てる ・B以降のスレッドは、自分に対応するbitを落とす ・一定時間、0じゃなかったら誰かが止まってるのでNG とかすると、sem_wait()で普段寝ている人(これはその時だけ起こせばいい?)や、 recvやselectで待ってる人の確認はできない。。
- 388 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:00:00 ]
- スレッドのヘルスチェックって要るのかな?プロセス間だったら必要かも知れなけど。
- 389 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:05:09 ]
- 大事な役割を持ったスレッドが刺さってないか確認したいんじゃないの
- 390 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 01:47:25 ]
- タイムアウト指定して待ちっぱなしにならないようにするのが基本
- 391 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 18:56:29 ]
- ワーカースレッドとUIスレッド分けたとき、時間のかかる作業を
ワーカースレッドがしているとき、UIスレッドはどうしているべきでしょうか 今は終わるのを待たずに終わるまでデータ変更の起こる操作を禁止しています でもそれだとウィンドウ動かせるくらいしかメリットがないので考え中です
- 392 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 19:03:15 ]
- >>391
俺は[中止]ボタンが押されるのを待つか、タイマーで定期的に終了したかどうか チェックしてる。あとプログレスバー表示。
- 393 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 19:49:50 ]
- ボタンを禁止にしたりキャンセルを受け付けたり面倒だよな
それとプログレって、量的な変化ならいいが、 手続き的な進行表示には不向きだよな
- 394 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 20:05:26 ]
- 全体量がわからないやつはつらいよね
\-/-\-...ってやつが好きw
- 395 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 21:03:40 ]
- 経過表示なら1/n「(説明)」〜n/n「完了」でいいと思うんだ
- 396 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:34:30 ]
- progress_display「呼んだ?」
- 397 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 09:11:50 ]
- いや、全然呼んでないよ
- 398 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 14:48:12 ]
- マルチスレッド・アプリケーション開発のためのインテル・ガイド
www.xlsoft.com/jp/products/intel/article/guide/index.html
- 399 名前:デフォルトの名無しさん [2010/06/27(日) 14:54:02 ]
- >>391
おれはその処理に関連するメニューだけロック(選択不可とか無視とか)して他の操作は許可してる 処理が終わったら通知ポップアップ 処理状況なんかはモーダレスじゃないプログレスバーかステータスバー表示
- 400 名前:デフォルトの名無しさん [2010/06/27(日) 15:01:41 ]
- >>393
でも長時間うんともすんとも言わないと不安になるからそういう場合は一秒に一ブロックぐらい進むプログレスバー繰り返してる 中止は処理スレッドに定期的に中断フラグチェックさせてプログレスバーダイアログのOnClose/OnCancelで終了フラグOn+WaitForSingleObjectさせればOK
- 401 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 23:09:47 ]
- ttp://blogs.wankuma.com/jitta/archive/2010/02/05/185818.aspx
なんかえらい絡まれてるくらい突っ込まれてるみたいなんだけど やっぱりこの記事おかしいの? それともコメントの方がおかしい?
- 402 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 23:28:25 ]
- >>401
バブルソートを題材にするとか並列化のサンプルとして適切じゃないというかフェアじゃないというか、あえてそれを選ぶのはなぜ?って話でしょう。
- 403 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 23:40:12 ]
- >何でもかんでも並列化すれば、等しく速くなるわけではない
記事の結論には同意だけど記事書いてるひとはアホ
- 404 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 02:56:46 ]
- >>403
同意だな。 並列化に向いたアルゴリズムをつかわにゃ早くならんしな。 ていうか変数shareしすぎ。
- 405 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 08:13:40 ]
- だらだらと下手糞なコードを書いて速くならねえよと喚かれてもな
そんな記事にはほとんど価値がない
- 406 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 09:47:23 ]
- 結局バグってたっぽいw
コメントが間違ってなければだが。
- 407 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 10:07:39 ]
- 記事自体は、アルゴリズムによって効率的に並列化できるとは限らないから云々んという内容なので、
記事自体が(素人にとっては)無意味だとまでは言わんが、 この人偉そうな言い方したり他人の記事に対しては重箱レベルで突っ込んだりもしてるくせに 自分の記事は内容が結構いい加減なんだよな。
- 408 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:48:12 ]
- そんな人は世間にはいっぱいいる
|

|