1read 100read
2013年06月プログラム31: マルチスレッドプログラミング相談室 その9 (185)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
Android SDK以外でのアプリ作成を全面禁止へ (124)
VB.NET質問スレ(Part40) (216)
開発工数を大幅削減できた言語は存在しない (102)
開発工数を大幅削減できた言語は存在しない (102)
C/C++以外の推薦図書/必読書のためのスレッド (109)
MATLABプログラミング 質問箱 その4 (141)
マルチスレッドプログラミング相談室 その9
1 :2012/06/15 〜 最終レス :2013/06/21 マルチスレッドプログラミングについて語るスレ ■前スレ マルチスレッドプログラミング相談室 その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】 【言語】 【実行環境】 【その他特記する事項】
2 : ■関連スレ・関連性の高いスレ ネットワークプログラミング相談室 Port28 http://toro.2ch.net/test/read.cgi/tech/1334736934/
3 : >>1 乙 前スレ >>994 並列実行「可能」でも「スケールする」かは知らんぞ。 OpenMP なら !$omp parallel do としてコンパイルオプション /Qopenmp
4 : >>前すれ995 そういうオプションがあるのですね,レポートと書き直したソースを添付します. http://www5.puny.jp/uploader/download/1339744079.zip pass:giko potential OUTPUT 依存関係 らしいですが,ググってもよくわかりません.依存関係がないように>>前すれ999のようにpureに書き換えたのですが. >>前すれ997 これは試しにつけてみただけのものです,やはり使い方が違いますか・・.
5 : gfortran -O3 20120528_fast_pararell_subroutine.f90 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=2
6 : 彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど どうすればいいかな
7 : 時分割でがんばれ
8 : Analyzing loop at 20120528_fast_pararell_subroutine.f90:237 237: not vectorized: not suitable for gather D.2660_224 = *shoi_69[D.2659_223]; Analyzing loop at 20120528_fast_pararell_subroutine.f90:196 196: not vectorized: not suitable for gather D.2600_148 = *a_147(D)[D.2599_146]; Analyzing loop at 20120528_fast_pararell_subroutine.f90:150 150: not vectorized: loop contains function calls or data references that cannot be Ryzed Analyzing loop at 20120528_fast_pararell_subroutine.f90:131 131: not vectorized: not suitable for gather D.2767_169 = *a_86(D)[D.2766_168]; Analyzing loop at 20120528_fast_pararell_subroutine.f90:91 91: not vectorized: not suitable for gather D.2704_87 = *a_86(D)[D.2703_85]; Analyzing loop at 20120528_fast_pararell_subroutine.f90:37 37: not vectorized: not suitable for gather D__I_lsm.780_635 = MEM[(real(kind=8)[0:] *)D.2433_241][pretmp.758_17]; Analyzing loop at 20120528_fast_pararell_subroutine.f90:38 38: not vectorized: not suitable for gather D.2485_318 = MEM[(real(kind=8)[0:] *)D.2298_95][D.2484_317];
9 : >>4 ループ間で出力変数に依存関係があるかも、という判断。 ○ i, j は value 属性を付け、b は戻り値にする。 ○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。 ここまでで依存はクリア、反復回数が少ないかも、というようになる。 /Qpar-threshold0 オプション (100〜0) で並列化は完了。
10 : bに依存がないことくらい解析できてもよさそうなのにね
11 : sho_det呼び出しの2重ループで並列化できるの?
12 : 双子と付き合う時はマルチスレッドのチンポ子が欲しい。
13 : クリティカルセクションとかミューテクスって重いんですか? 秒間2500回とかマジキチですか?
14 : 400μ秒は今のパソコン環境でも、厳しいんじゃね 何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
15 : ロックフリー!
16 : >>13 そのあたりだと、API 呼び出しのオーバーヘッドもバカにならないから 自前で実装したほうがいいんじゃね?
17 : https://gist.github.com/2841832 によれば > Mutex lock/unlock 25 ns
18 : >>13 重いけどそれくらいならいけると思う できるならスレッドごとにリソースもって 最後に合体させたほうが速い
19 : 申し訳ありません,並列化ですが,解決しました. /Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました. ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです. このループだけ並列化したいっていうような指定ってできるのでしょうか?
20 : >>17 Mutexってスレッド数によると思うんだけどな。 シングルコアならオンキャッシュで対応できるけど、 マルチコアだったりマルチCPUだったらメモリ参照と大差ないと思う。
21 : 答え教えてもらって、闇雲にやるのが今風なの?
22 : それって、単純ループがスレッド化されただけじゃねえの?
23 : 実行環境に寄って自動で最適化して欲しいよね。 ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。 4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
24 : core数増えたから、早くなるってわけでもないでしょうに
25 : 効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS ※ 依存性に目をつぶれという指示ではない > 64core の対応 3日かかる計算を1時間に押し込みたいなら、やる価値はある。 1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。 そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。 スケールするとかしないとかはそういう話。
26 : 速くなってくれないと高額な多コア買った意味無いんだが。
27 : それは、プログラム作ったベンダーに言え。 場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
28 : 分散処理できるように考えるほうが難しいのに 道具によってはできることとできないことがあるでしょ
29 : 多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。 そうしないとスケジューリングに費やすコストが無駄だ。
30 : あまり賢そうに見えないな
31 : gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。
32 : 標準的な入出力は動くコア決めたほうがいいかもしれんけど プロセス、スレッドはどのコアで動こうが関係無いような どうせ、暇な?コアに割り当てられるだろうから
33 : linuxだとこういう指定が出来るようだ ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html
34 : それぐらいは WindowsNT 4.0 からあるが。 SetProcessAffinityMask http://msdn.microsoft.com/ja-jp/library/cc429334.aspx
35 : コア数とかうるさい割にapiのことは言わんのね?
36 : pスレッドについて教えてください。 関係性のない処理を行う2つのスレッドA、Bを同時に動かし始めたいのですが、 ・スレッドAの待ち状態にpthread_cond_wait(&cond, &mutex1); ・スレッドBの待ち状態にpthread_cond_wait(&cond, &mutex2); として(condは同じで、mutexが異なる)、これらを動かし始めるために別スレッドで pthread_cond_broadcast(&cond); をコールしたのですが、思ったとおりに動いてくれません。 なにがいけないのでしょう? (pthread_cond_wait()の使い方を間違えている?)
37 : 馬鹿には無理
38 : >>36 broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる 通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため 思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
39 : >>38 素朴に待っていると思っていたスレッドが、実は待っていないせいで シグナルがすり抜けていたということですね このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう? ともかく、ありがとうございました
40 : >>39 pthreadの粒度が小さい場合、threadの実行順序がぐだぐだになるから要注意。 結論としては、充分長い処理でもない限りcond_waitは使えない。
41 : >>40 頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで かんたんなこーどなのにはまるなんてありそうですね・・・・ 自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので 素朴なつくりでもそれなりに動いたかもしれませんが、 再現性のないトラブルが発生する前にそういう問題を認識できてよかったです ありがとうございました
42 : >>41 去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。 mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと 自分が待たずにロックしちゃうことに。 メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと lockするところまで実行できないなんてちょっと想像しにくいぞ。 # 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
43 : いつでもどんな時にでも スケジュールから外されても動かされても 大丈夫なように作るのが鉄則
44 : そうそう。 だから、Web上のサンプルは当てにならない。
45 : そもそも並列化したいのは高速に処理したいからじゃん? サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
46 : て言うかサンプルってそういうもんだし。 そもそも >>42 が > mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと > 自分が待たずにロックしちゃうことに。 って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
47 : マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ そんなことより、マトがトマるだって・・・・・!喜w
48 : ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・ 素朴なQなんですが、マルチCPUのマシンで、 @ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く Aひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、 スレッド単体ではなく、それの属するプロセスが渡り歩いているため こういう理解は正しいですか?
49 : スレッドの割り当てとかはOSが決めてることだからね OSの挙動に影響しないようなことを考えながらやりませう マルチCPUじゃなく 単一CPUの時のスレッド等の挙動を考えてみませう
50 : 同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、 せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
51 : 逝ってるなマルチコアはCPU毎に命令データキャッシュ持ってるでしょ
52 : でも分岐したらダメなのでは?
53 : よく考えたら、分岐するんだったらCPU移らなくてもダメだった ドピュッ
54 : 命令の先読みとかやってるの知ってる? 同じ領域を読み込む場合に早くなるってのがキャッシなのでは? HDDキャッシュとかも同じでしょ
55 : 別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、 ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある OSの裁量次第
56 : キャッシュ知らんでも スレッド系のプログラム作るのには関係無いような 速度ウンタラは動いてから考えればいい話でしょ
57 : 初心者の質問です new;した領域 p があって スレッドAは条件によってdelete p;をする スレッドBはpを参照する この時に 変数 blReference, blDeletingを使って Aの処理中 delete部分 while( blReference ){ Sleep(1); } blDeleting= true; delete p; p = NULL; blDeleting = false; Bの処理中 参照部分 while( blDeleting ){ Sleep(1); } blReference = true; char* cp = (char*)p: //以下参照 blReference = false; っていうのは安全でしょうか?
58 : >>57 先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。 要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。 つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか? それと、cpにNULLが代入されること自体は問題ないの?
59 : weak_ptr使えハゲと言うしかないレベル
60 : weak_ptrってboost? マルチスレッドを考慮されていたの?
61 : >>58 volatileしておけば、 まあいいんじゃない sleep で待つのは効率はよくなさそうだけど
62 : volatile使ったとしてもコンパイラによっては安全だとは言えないんだよ
63 : 安全って、思いたい理由の方に興味があるんだけど
64 : むしろ安全だといえるコンパイラを知りたい
65 : volatile使っても結果変わらない事の方が多い気がする
66 : そりゃそうだ
67 : 安全だと思うと、コンピュータがそれを理解して動いてくれると思いたいのかな
68 : volatileしてダメだったケースに遭遇したことないなあ。 まあboolでの同期・排他は簡単なケースにしか使ってなくて、 まじめなのはcritical sectionとかmutexで排他・同期するから 気がついてないだけかもしれないけど。
69 : >>57 >// スレッドA >while( blReference ){ Sleep(1); } // 1 >blDeleting= true; // 3 >// スレッドB >while( blDeleting ){ Sleep(1); } // 2 >blReference = true; // 4 スレッドの処理が時間的に番号の順で行われる場合がある。 つまり、この処理はスレッド間の排他にはなっていない。 おとなしくクリティカルセクションを使ってロックした方がいい。
70 : >>69 InterlockedExchangePointerは?
71 : 質問ですが、Windows APIのSetEvent()やWaitForSingleObject()って、 内部で適切にメモリバリアを行うことが保証されていますか? 例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長? (メインスレッド側) bTerminate = true; // volatile bool型 _WriteBarrier(); SetEvent(hEvent); // スレッドを起床させる (ワーカースレッド側) WaitForSingleObject(hEvent); // 起床されるまで待つ _ReadBarrier(); if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理
72 : も一個、volatile bool a, b; があるとして、 a = c; b = d; の代入順序は、a, bがたとえatomicな型でvolatileだからといって プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、 よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は メモリバリアが 必 須 、 という理解で合っていますか
73 : >>71 http://msdn.microsoft.com/en-us/library/ms686355%28VS.85%29.aspx > The following synchronization functions use the appropriate barriers to ensure memory ordering: > ・Functions that enter or leave critical sections > ・Functions that signal synchronization objects > ・Wait functions > ・Interlocked functions >>72 はい
74 : >>64 javacやcscじゃね
75 : メモリバリアってのはgcc特有の表現で atomicな処理とは関係ないんだけど
76 : >>73 dクス SetEvent()は2番目(・Functions that signal synchronization objects)、 WaitForSingleObject()は3番目(・Wait functions)ってことでおkそうですね >>75 メモリバリアはアウトオブオーダー実行するアーキテクチャに共通する概念であってGCC固有というわけではないですにょ とかいろいろあるが説明がマンドクセ、
77 : ただの最適化抑止のおまじないみたいなもんだよ
78 : >>77 ちょっそれvolatileの方wwwww まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
79 : マルチコア時代の並列プログラミング 〜ロックとメモリオーダリング〜 http://www.nminoru.jp/~nminoru/data/b2con2006_nminoru.pdf
80 : gccのvolatileってのは、ちょっと特殊なんだよ
81 : >>77 ,78 真相はもっと複雑怪奇だったりする http://yamasa.hatenablog.jp/entries/2009/07/20 http://msdn.microsoft.com/ja-jp/library/bb310595%28VS.85%29.aspx つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
82 : ここらへんの話は ・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛 ・volatileによって明示的に最適化が抑制 ・システムコール内でメモリバリアの面倒をみてくれる ・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
83 : アトミック変数とか作って、ド素人に誤解釈されたらどうすんだろ、この人
84 : >>81 > つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい… そこで面倒を見てくれるのは「release/aquireメモリバリアとしてのみ」であることに注意。 http://yamasa.hatenablog.jp/entry/20090816/1250446250 こっちのSequential consistencyの性質は、VC++2005以降のvolatileでも持っていない。
85 : >>83 ドシロウトがなんでスレッド使った開発に加わるんだよ
86 : なんで排他の話ばっか出てくるんだ。 スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。 それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
87 : >>86 >なんで排他の話ばっか出てくるんだ。 マルチスレッドで問題になるところと言うか、排他を最近覚えた奴が 使いたくてしょうがないんだろ。
88 : >>86 スレッドの実装が違うだろう、LinuxとUNIXなら同じだが
89 : >>85 じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?
90 : >>88 boostとか抽象化レイヤー用意すればできるだろ。 しかし、仕様の安定したスレッドキューがない。 もう、自作スレッドキューを保守するのは嫌だお
91 : >>90 皮かぶせりゃいいだろうけど、 そこまでして、 そこまでしても
92 : おまえら何回C++におけるatomicとvolatileの話を繰り返せば気がすむの
93 : それしかネタがないからさ
94 : >>92 スレッドキューの話しだせ
95 : だって手法なんて先駆者が出し尽くしただろ
96 : スレッドキューって何だ? スレッドセーフなキューってことか? それともGCDみたいなタスクキューのことか?
97 : タスクキューのことだよ。 てかスレッドセーフなキューってなんだよ。それだったら 別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
98 : java.util.concurrent.BlockingQueueのことだろ
99 : 同期処理を間違いなく設計するための、何か良い手法やツールはないですかね? ペーペーのビギナーだというのもあるのですが、 複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、 waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、 そのデバッグで無駄に体力を消耗しています
100read 1read 1read 100read TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
float 使うヤツはドシロートかおぢさん (148)
推薦図書/必読書のためのスレッド 70 (140)
C/C++の宿題片付けます 165代目 (293)
Excel VBA 質問スレ Part30 (440)
【Java】 Java Web Application Framework 総合 (696)
Boost総合スレ part10 (118)
--log9.info------------------
KDDLab神 に感謝をささげるスレ (163)
エクスプローラより使いやすいシェル無いの? (109)
日本発のオープンソースを数えるスレッド (173)
2002 LinuxWorldで重大発表!! (127)
X端末@Linux (160)
労働組合つくればいいんじゃね? (193)
おもしろいコピペがあったら貼るスレinマ板part36 (355)
これからコードを書く人に絶対やって欲しいこと★3 (447)
会社員の俺が何か開発して転職を目指すスレ (256)
Androidアプリ 個人開発者の雑談スレ2 (132)
SEってIT土方だとか言われてよくバカにされてるけど (149)
プログラマ川柳 (124)
プログラマー50代何で居ないの死んでるの?Part2 (235)
スレッドを立てるまでもない質問雑談スレ46 (856)
Java、Android開発の職業訓練について Part.2 (151)
【鬱病】壊れたプログラマー 34人目 【爆発】 (603)
--log55.com------------------
【高い集客力】日大歯学部 part10
医者の給料は高すぎる
第108回医師国家試験 ボーダー情報スレ part4
【第109回】医師国家試験 偏差値30台スレ part2
明海大学歯学部附属病院
▼▲医学部医学科の最底辺を決めよう▲▼Part.3
【ST】言語聴覚士スレ Part32
【高い戦闘力】日大歯学部 part10