>>1 乙
前スレ
>>994 並列実行「可能」でも「スケールする」かは知らんぞ。
OpenMP なら !$omp parallel do としてコンパイルオプション /Qopenmp
gfortran -O3 20120528_fast_pararell_subroutine.f90 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=2
彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど どうすればいいかな
時分割でがんばれ
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 analyzed 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];
>>4 ループ間で出力変数に依存関係があるかも、という判断。
○ i, j は value 属性を付け、b は戻り値にする。
○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。
ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (100〜0) で並列化は完了。
bに依存がないことくらい解析できてもよさそうなのにね
sho_det呼び出しの2重ループで並列化できるの?
双子と付き合う時はマルチスレッドのチンポ子が欲しい。
13 :
デフォルトの名無しさん :2012/06/16(土) 16:54:32.86
クリティカルセクションとかミューテクスって重いんですか? 秒間2500回とかマジキチですか?
400μ秒は今のパソコン環境でも、厳しいんじゃね 何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
ロックフリー!
>>13 そのあたりだと、API 呼び出しのオーバーヘッドもバカにならないから
自前で実装したほうがいいんじゃね?
18 :
デフォルトの名無しさん :2012/06/16(土) 22:25:28.46
>>13 重いけどそれくらいならいけると思う
できるならスレッドごとにリソースもって
最後に合体させたほうが速い
19 :
4 :2012/06/16(土) 23:07:53.93
申し訳ありません,並列化ですが,解決しました. /Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました. ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです. このループだけ並列化したいっていうような指定ってできるのでしょうか?
>>17 Mutexってスレッド数によると思うんだけどな。
シングルコアならオンキャッシュで対応できるけど、
マルチコアだったりマルチCPUだったらメモリ参照と大差ないと思う。
答え教えてもらって、闇雲にやるのが今風なの?
それって、単純ループがスレッド化されただけじゃねえの?
実行環境に寄って自動で最適化して欲しいよね。 ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。 4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
core数増えたから、早くなるってわけでもないでしょうに
効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS ※ 依存性に目をつぶれという指示ではない > 64core の対応 3日かかる計算を1時間に押し込みたいなら、やる価値はある。 1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。 そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。 スケールするとかしないとかはそういう話。
速くなってくれないと高額な多コア買った意味無いんだが。
それは、プログラム作ったベンダーに言え。 場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
分散処理できるように考えるほうが難しいのに 道具によってはできることとできないことがあるでしょ
29 :
デフォルトの名無しさん :2012/07/06(金) 19:30:56.61
多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。 そうしないとスケジューリングに費やすコストが無駄だ。
あまり賢そうに見えないな
31 :
デフォルトの名無しさん :2012/07/06(金) 19:45:56.15
gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。
標準的な入出力は動くコア決めたほうがいいかもしれんけど プロセス、スレッドはどのコアで動こうが関係無いような どうせ、暇な?コアに割り当てられるだろうから
コア数とかうるさい割にapiのことは言わんのね?
36 :
デフォルトの名無しさん :2012/07/21(土) 14:53:22.69
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()の使い方を間違えている?)
馬鹿には無理
>>36 broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
39 :
デフォルトの名無しさん :2012/07/21(土) 15:33:58.32
>>38 素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね
このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には
それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう?
ともかく、ありがとうございました
>>39 pthreadの粒度が小さい場合、threadの実行順序がぐだぐだになるから要注意。
結論としては、充分長い処理でもない限りcond_waitは使えない。
>>40 頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・
自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので
素朴なつくりでもそれなりに動いたかもしれませんが、
再現性のないトラブルが発生する前にそういう問題を認識できてよかったです
ありがとうございました
>>41 去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
いつでもどんな時にでも スケジュールから外されても動かされても 大丈夫なように作るのが鉄則
そうそう。 だから、Web上のサンプルは当てにならない。
そもそも並列化したいのは高速に処理したいからじゃん? サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
て言うかサンプルってそういうもんだし。
そもそも
>>42 が
> mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
> 自分が待たずにロックしちゃうことに。
って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ そんなことより、マトがトマるだって・・・・・!喜w
ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・ 素朴なQなんですが、マルチCPUのマシンで、 @ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く Aひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、 スレッド単体ではなく、それの属するプロセスが渡り歩いているため こういう理解は正しいですか?
スレッドの割り当てとかはOSが決めてることだからね OSの挙動に影響しないようなことを考えながらやりませう マルチCPUじゃなく 単一CPUの時のスレッド等の挙動を考えてみませう
同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、 せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
逝ってるなマルチコアはCPU毎に命令データキャッシュ持ってるでしょ
でも分岐したらダメなのでは?
よく考えたら、分岐するんだったらCPU移らなくてもダメだった ドピュッ
命令の先読みとかやってるの知ってる? 同じ領域を読み込む場合に早くなるってのがキャッシなのでは? HDDキャッシュとかも同じでしょ
別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、 ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある OSの裁量次第
キャッシュ知らんでも スレッド系のプログラム作るのには関係無いような 速度ウンタラは動いてから考えればいい話でしょ
初心者の質問です 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; っていうのは安全でしょうか?
>>57 先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。
要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。
つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか?
それと、cpにNULLが代入されること自体は問題ないの?
weak_ptr使えハゲと言うしかないレベル
weak_ptrってboost? マルチスレッドを考慮されていたの?
>>58 volatileしておけば、
まあいいんじゃない
sleep で待つのは効率はよくなさそうだけど
volatile使ったとしてもコンパイラによっては安全だとは言えないんだよ
安全って、思いたい理由の方に興味があるんだけど
むしろ安全だといえるコンパイラを知りたい
volatile使っても結果変わらない事の方が多い気がする
そりゃそうだ
安全だと思うと、コンピュータがそれを理解して動いてくれると思いたいのかな
volatileしてダメだったケースに遭遇したことないなあ。 まあboolでの同期・排他は簡単なケースにしか使ってなくて、 まじめなのはcritical sectionとかmutexで排他・同期するから 気がついてないだけかもしれないけど。
>>57 >// スレッドA
>while( blReference ){ Sleep(1); } // 1
>blDeleting= true; // 3
>// スレッドB
>while( blDeleting ){ Sleep(1); } // 2
>blReference = true; // 4
スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。
>>69 InterlockedExchangePointerは?
質問ですが、Windows APIのSetEvent()やWaitForSingleObject()って、 内部で適切にメモリバリアを行うことが保証されていますか? 例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長? (メインスレッド側) bTerminate = true; // volatile bool型 _WriteBarrier(); SetEvent(hEvent); // スレッドを起床させる (ワーカースレッド側) WaitForSingleObject(hEvent); // 起床されるまで待つ _ReadBarrier(); if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理
も一個、volatile bool a, b; があるとして、 a = c; b = d; の代入順序は、a, bがたとえatomicな型でvolatileだからといって プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、 よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は メモリバリアが 必 須 、 という理解で合っていますか
メモリバリアってのはgcc特有の表現で atomicな処理とは関係ないんだけど
>>73 dクス
SetEvent()は2番目(・Functions that signal synchronization objects)、
WaitForSingleObject()は3番目(・Wait functions)ってことでおkそうですね
>>75 メモリバリアはアウトオブオーダー実行するアーキテクチャに共通する概念であってGCC固有というわけではないですにょ
とかいろいろあるが説明がマンドクセ、
ただの最適化抑止のおまじないみたいなもんだよ
>>77 ちょっそれvolatileの方wwwww
まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
79 :
デフォルトの名無しさん :2012/09/30(日) 01:13:58.15
gccのvolatileってのは、ちょっと特殊なんだよ
ここらへんの話は ・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛 ・volatileによって明示的に最適化が抑制 ・システムコール内でメモリバリアの面倒をみてくれる ・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
アトミック変数とか作って、ド素人に誤解釈されたらどうすんだろ、この人
>>83 ドシロウトがなんでスレッド使った開発に加わるんだよ
なんで排他の話ばっか出てくるんだ。 スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。 それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
>>86 >なんで排他の話ばっか出てくるんだ。
マルチスレッドで問題になるところと言うか、排他を最近覚えた奴が
使いたくてしょうがないんだろ。
>>86 スレッドの実装が違うだろう、LinuxとUNIXなら同じだが
>>85 じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?
>>88 boostとか抽象化レイヤー用意すればできるだろ。
しかし、仕様の安定したスレッドキューがない。
もう、自作スレッドキューを保守するのは嫌だお
>>90 皮かぶせりゃいいだろうけど、
そこまでして、
そこまでしても
おまえら何回C++におけるatomicとvolatileの話を繰り返せば気がすむの
それしかネタがないからさ
だって手法なんて先駆者が出し尽くしただろ
スレッドキューって何だ? スレッドセーフなキューってことか? それともGCDみたいなタスクキューのことか?
タスクキューのことだよ。 てかスレッドセーフなキューってなんだよ。それだったら 別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
java.util.concurrent.BlockingQueueのことだろ
同期処理を間違いなく設計するための、何か良い手法やツールはないですかね? ペーペーのビギナーだというのもあるのですが、 複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、 waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、 そのデバッグで無駄に体力を消耗しています
馬鹿には無理
>>99 排他処理、スレッドモデルと実装を勉強すれば
ビギナーには無理と思うが
>>99 もうそこは、共有している資源と mutex の一覧表作って、地道に設計してレビューで
確認するしかない。
imagix とか確認を支援するツールはあるけど。
>>101 やんないと、他に仕事ないんで・・・・
>>102 かなり頭がよくないと、サラリと正しいコード書けないですよね(棋士的な意味の頭のよさ)
そうか、地道にやるしかないのか(´・ω・`)
・・・売り物なんですねimagix
自分の担当業務以外にも使えそうなので、ちょっとチーム内に紹介してみます
とりあえず、今の自分のレベルでミスりやすいところを正しく実装するための比喩をいくつか考案中です
↓
例1
スレッド間同期は、キャッチボール
ボールを受け取る側は、しゃがんでいないとボールをキャッチできない
例2
スレッド再開時の手順は、競馬のスタートと同じ
@ゲートを閉じる(送信側mutexロック)
A馬がゲート前に並ぶ(受信側wait)
Bファンファーレが鳴る(signal)
Cゲートが開く(送信側mutex開放)
mutexなんか使わずfuture、promisで凌げ
>>103 転職したほうがよくね
ハロワ通いでもしてみたら
まず10年間C++を勉強しろ
>>103 比喩を作ることができるならすでに理解できてるんじゃないの?ってことで、
結局比喩は不要だよねって流れにならないのかな。
結局無理てことか、初心者というより基本が
>>103 とにかくソースコードをきれいに書け
そうすれば、ソースコードが間違いを教えてくれる
>>110 > そうすれば、ソースコードが間違いを教えてくれる
おっ、なんか響きがいい言葉だな。
113 :
デフォルトの名無しさん :2012/10/26(金) 20:45:55.33
教えてください g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の 効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?
gdb
マ ジ ハ ,,ハ デ (;゚◇゚)z !?
プロファイラでわかるのはどの部分が処理時間の何%を使ってるか ぐらいであって、スレッドの動作効率なんていう個人の価値観みたい なものは測定できんだろ。
117 :
デフォルトの名無しさん :2012/12/31(月) 15:20:38.31
C#です。 C#ではローカル変数にvolatileを付けられませんが 以下の場合、最適化でスレッドの変更が反映されない場合はありますか? var init = new ManualResetEventSlim(false); int val = 0; var t = new Thread(() => { val = …; // valに何らかの値を入れる init.Set(); // valを初期化したことを知らせる : // スレッドの処理が続く }; t.Start(); init.Wait(); // スレッドでvalが初期化されるまで待つ // valを使う。スレッドでの変更が反映されている?
118 :
デフォルトの名無しさん :2012/12/31(月) 16:48:21.02
あります
119 :
デフォルトの名無しさん :2012/12/31(月) 19:09:35.15
>>118 どういった理由でしょうか?
http://www.albahari.com/threading/part4.aspx >The following implicitly generate full fences:
>Setting and waiting on a signaling construct
という記述を見つけたのですが、これによれば
valへの書き込みをinit.Set()より後に、valからの読み込みをinit.Wait()より前に
という事は行われないように思えるのですが。
判ってるのに質問するなボケが
それを否定されたから理由を聞いてるんじゃないのか
C#が自ら自身の仕様を質問すること自体が。 まぁ、人間だって自身についてどれだけ知っているか怪しいもんだが。
123 :
デフォルトの名無しさん :2013/01/05(土) 12:19:18.18
124 :
デフォルトの名無しさん :2013/01/05(土) 18:17:06.97
123だけど、 XDispatchだが、Windowsであっけなく使えた。 こりゃいいぜ。Win、Mac、Linuxで同一ソースでGrand Central Dispatchが使える。 マルチスレッドプログラミング新時代到来って感じだw
125 :
デフォルトの名無しさん :2013/01/08(火) 19:15:30.57
libdispatch + α、って感じなのか
>>126 そうみたい。
基本的にはマルチプラットフォームでやりたい場合は${ ~ }の記法とautoを使えばオッケー。
他にも標準のlibdispathには無い機能とか、Qtユーザー向けのQtDispatchとかあるみたいだけど、そこまではまだ調べられてない。
時間があったらもっと調べてみて、追記してみるよ。
Win32でのプロセス間リソース共有の仕方で悩んでます 1. ポーリング=Mutexで保護された共有リソースの変更を常に監視 2. サーバー(orクライアント)スレッドでEvent監視+Mutexで共有リソースを保護 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください (定性的な評価=プロファイルで調べろは無しでお願いします) 自分は「重さ:Mutex>>>>Event>>>>>>>CriticalSection」というイメージがあるので、 2のマルチスレッドのコンテキストスイッチの重さを考慮しても1の方が重いのではないかと考えています
(゚Д゚)ハァ? Mutexを奪い合えばいいだけだし。
Event vs. Pollingは宗教戦争
何もすることがなきゃ寝て待ってればいいだけ 何かしたけりゃイベント来るまでしてればよかろう
Mutexが重いんじゃなくてポーリングが重いんだろ イベントやメッセージ等の非同期通知が使えるなら、そっちのほうが軽いのは当然
>>128 > Win32でのプロセス間リソース共有の仕方で悩んでます
winすれで聞いたら
> 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?
効率を気にする香具師が2chで質問するとかもうね
>>79 ではx86、x64では(P6〜)
RAR WAR WAW RAW
× × × × ... × 順序の逆転が起きる WAR ... Write after Read (書いてから読む)
となってるけど
>>81 のMSDNでは WAR のみ逆転が起こる、書いてる。
RAR WAR WAW RAW
○ × ○ ○
どっちが正しいのでしょうか?
あと、MSDNの英語の原文はこっちだけど
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418650 (v=vs.85).aspx
Reads moving ahead of writes の訳が
「読み取りを書き込みの先に移動する」
「書き込みの前に読み取りを移動」
と2回出てきて紛らわしい。
write
...
read
この順番が逆になることあり、てことだよね?
>>135 WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。
でいいかと。
138 :
137 :2013/02/18(月) 22:30:08.38
>>137 の補足しとくと、同一プロセッサでも異なるアドレスだとリオーダ可能なので
順序が重要な場合はメモリフェンスが必要になる。
別のプロセッサ間でもリオーダ可能ということになる。
別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。
>>135 MSDNのほうが正しい。
昔はIntelのdeveloper manualの記述が曖昧だったこともあり、
間違った解説が結構ある。
>>136-138 マルチスレッドでもRAW以外は入れ替わらないよ。
>>139 キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
lockプリフィックス使うんじゃあ
>>139 そうか、マルチスレッドでもリオーダは無いな。他から割り込まれる可能性があるだけだ。
143 :
135 :2013/02/23(土) 23:41:17.41
>>136-142 さん、さんくすでした。
MDSNが正しかったのですか。
> それ RAW じゃね
でした。コードの順番と英語表記は逆になるんですよね。誤解してました・・・。
この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。
ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、 データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない? だから本を買って読むほどでもないような。 CPU内の順序はOut of Orderが関係していて、CPUは可能な限り速く実行しようとするから 順番が入れ替わってしまうってことで、それをコントロールするのにメモリバリア命令がある。 アセンブラの最適化にも関係してるから、プロセッサの最適化マニュアルとかも参考になるかも。 マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。 他のプロセッサに割り込まれて困る部分にはlockで保護するとか。
Java の資料だけど「コンパイラ開発者のためのJSR133クックブック」ってのはどう?
>>145 邦訳版はダメ。
肝心のアーキテクチャ毎の表などが古いままで間違っている。
RafterWってシングルスレッドなら絶対安全? 途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと? 実行cpuが変わることあるかしらないけど まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
>>147 > まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
普通に入れ替わるだろ。
切替前に読み込んだ情報は、違う CPU でもちゃんと復帰するから
問題ないはず。
>>148 書き方が悪かった。
マルチプロセッサの環境でシングルスレッドのコードを実行してて、
実行CPUが変わったとしても読み書き順が入れ替わらないでしょう?
そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
>>149 ああそういうことか、それは大丈夫だと思うよ。
バーリアー!平気だもーん!
マルチコアでないマルチプロセッサ構成で、 外部キャッシュや主記憶のシステムコントローラが、 CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。 Windowsではこうゆうハードウェア構成は想定してないはず。
>>153 違うよ。全然違うよ。
とりあえず、これでもじっくり読め。
msdn.microsoft.com/ja-jp/magazine/jj883956.aspx
ところでmfenceは何でSSE2の制御命令に分類されてるの?
>>152 MemoryBarrier()はx64でもsfence/mfence使ってないな。
やっぱり処理速度の関係だろうか。
まるでenter命令並みに使えない。
x86
0000b 87 04 24 xchg DWORD PTR _Barrier$66624[esp+4], eax
x64
0003a f0 83 0c 24 00 lock or DWORD PTR [rsp], 0
>>155 xFENCE命令はMOVNTPS, MOVNTPD,などのNon Temporal転送命令向けの機能で、
この系統の命令だけx86のメモリモデルに従わないので専用のFENCE命令が必要となった。
このうちLFENCEとMFENCEは普通のx86命令にも効果があるが、
パフォーマンスがxchgに劣る。
なんでxchgがバリアとして使えるの?
メモリに対するxchgは自動的にlockを伴う
160 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/06/18(火) 23:59:01.86
確率的にいつ終わるかわからない時間の掛かる処理をマルチスレッドを使って複数同時に 実行させると、シングルスレッドよりも早い時間で終わる確率が高くなると思うが、これについて貴様らはどう思う?
ちなみにクロスワード自動作成ソフトを作ってますっ
辞書ひく時間が糞長いから、マルチスレッドやっても大して変わらない
>クロスワード自動作成ソフト どこらへんを並列化できるのん?
バックトラック乱れ打ちじゃねーの
165 :
デフォルトの名無しさん :2013/06/20(木) 07:49:26.95
同じレスを各板に乱れ撃ちする作業だろ?
マルチスレッドにしたら5〜8時間に1回エラーが出るようになった。でもデバックできないよorz
つログ
同期もわかってないのにマルチスレッドにするからだ。
同期とったら並列の意味がなくなりそうでためらうときがあるな 待ち合わせキューにするくらいなら順番に処理した方がましな気がする
つスーパースカラー
粒度変えりゃいいじゃん
172 :
デフォルトの名無しさん :2013/06/21(金) 04:34:35.98
マルチスレッドって自作できるんですか? 以前nyの書籍を読んだときに、開発者の人がマルチスレッドを自作したと書いてたような気がするのですが C言語でも自作できるんですか?
マルチスレッド・マルチタスクで動いているように見せることは出来る。 並列動作させたい複数の処理を細切れにしてちょっとづつ実行して グルグル回す。
>>173 タイムシェアリングみたいにやるってことですか
>>174 俺が
>>173 で書いたのは、タイムシェアリングではなく
ノンプリエンプティブ・マルチタスク。
例えば無限ループ内に3処理 A, B, C があったとして
それらをマルチで実行したければ、それぞれを
A1, A2, A3
B1, B2, B3
C1, C2, C3
などと細切れに分割し、
A1, B1, C1, A2, B2, C2, A3, B3, C3, A1, ……(無限ループ)
と実行する。
いまでも、組み込みでコントローラやセンサーを制御する小さなCPUは
マルチタスクの能力を持っていないのが当たり前のようにあり、
これでマルチ動作させるのに当たり前のように使われる手法。
176 :
デフォルトの名無しさん :2013/06/21(金) 19:38:33.60
スレち
スレチというほどじゃないんじゃない? OSレベルでスレッドのサポートが無い場合は、 言語ランタイムレベルのグリーンスレッド タイマー等の割り込みの利用 メッセージポンプのループ利用 NT Fiber スレッドはないけどプロセスのマルチが出来るなら、 パイプなどでプロセス間通信の利用 といったところかな
俺もスレチじゃないと思う
windows 3.1 を思い出すな
ファイバーってレアすぎ
気が早いな まだ8だぞ
2000があるのに…
>>175 をタイムシェアリングだと思ってたな。もう少し勉強しよう。
ファイアー少なくてレアすぎ
広義だと含むのとちゃうかな おさ〜ん的にはTSS(TSO)のホスト端末を思い浮かべるけど
ファイバー使ってみたけど、 フェーズとswitchより シンプルに書けたよ。
C/C++ で勉強したいのですが、おすすめの書籍などありますか? もしくは一から学べるようなWebページがあれば教えてください
188 :
デフォルトの名無しさん :2013/11/22(金) 09:05:54.07
D の方が良いよ
猫でもわかる
>>188 D のほうが書きやすい?触れたことないのでわからんです
>>189 猫でもわかる は、Web版が俺にはちょっと分かりづらかった記憶が
書籍だとそうでもないのかな
C++のBoostを利用したThreadプログラミングの解説ページがあったので今はそれ見てます
193 :
デフォルトの名無しさん :2013/11/23(土) 13:24:53.59
194 :
デフォルトの名無しさん :2014/02/23(日) 09:00:04.29
マルチスレッドって自力だとどうやって書くの?
pthread_create()
>>194 std::thread th{
[]{std::this_thread::sleep_for(std::chrono::milliseconds(3000));}
};
std::printf("うんこ\n");
th.join();
197 :
デフォルトの名無しさん :2014/02/24(月) 17:57:18.01
例の金子がny作るときにマルチスレッドは自作したんじゃなかったっけ?
>>197 あれ、シングルスレッドだよ。
Windows3.1みたいな方法で複数のタスク回してる。
小学生がBASICで弾の連射実装してるレベルだろ。
グリーンスレッドとは違うの?
グリーンスレッドなんて初耳。wikip見たらなんかトンデモな説明なんだが。 これは誰が言い出したんだ? バズワードくさい。
レッドスレッド、ブルースレッドはあるのでしょうか?
OSが関与しないスレッドの実装のこと。ウィキペディアの記述がタコってるのはいつものこと。 基本的な理屈はそう難しくないけど、実際にはreadとかでどれかのスレッドがプロセスごと ブロックされると、他に走りたいスレッドが居ても走れなくなっちゃうので、そのへんを どう手当てするかがカギ(そういった所だけOSが支援するとか、ブロックする可能性がある システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。
よく分らんな。スレッドってそもそもOSが定義したものだろう。 アプリ側がたかが永続性のあるサブルーチン程度のものを 勝手にグリーンススレッドって呼んでるだけじゃないのか? まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。
ユーザースレッド、ユーザ空間でか、なるほど
カーネルスレッド、カーネル空間でか、なるほど
グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん。それこそ
>>203
その例え話しとその提示したのと繋がりそしてなんでその皮肉になるのか、200文字以内で説明しなさい
wikipediaのスレッドの項目の所まで加筆してやがるww バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw そんなのスレッドと何の関係もないのにスレッド言うなや。
結局、逆の意味でのウィキペディア馬鹿か。 一人で言ってろw
グリーンCPU。 グリーンプロセス。 グリーンヒープメモリ。 グリーンスタックメモリ。 グリーン仮想メモリ。 グリーン物理メモリ。 グリーンマルチタスク。 グリーンネットワーク。 グリーンアップル。 おれもいっぱい考えました。
グリーンPC グリーンディスプレイ が抜けている
ソイレント
MZ-80Kの話をしてるのかと思ったぜ
>>214 そりゃMZ80Cだ!
MZ80Kはモノクロだ!
> ユーザースレッド、ユーザ空間でか、なるほど > カーネルスレッド、カーネル空間でか、なるほど > グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん ユーザースレッドとカーネルスレッドという言葉はそれぞれ、 M:Nスレッドモデルとかの議論で、カーネル空間のコードの実行におけるスレッドと、 ユーザー空間のコードの実行におけるスレッド、という意味で使われる。 グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した スレッドAPIの実装を指す。 以上のことが何も理解できないバカには、なにもかもがバズワードに見える。
バカですがなにか?
命名の由来のことなのに、Wikipediaから意訳したようなのを偉そうにのたまう、他人を馬鹿呼ばわりする自称天才様w 天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw
> バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw > > そんなのスレッドと何の関係もないのにスレッド言うなや。 この威勢はどこ行ったのかなぁw
>グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した >スレッドAPIの実装を指す。 ハナからスレッドの定義に当てはまらないのにスレッド言われもなぁ。 WEB2.0と変わらんレベルの造語。 どうせまたジョブスオタクの低脳営業SEが言い出したんだろう。
スレッドの定義ってなんだ?
コイツの脳内ではシステムコールで実装されたものだけがスレッド、という定義なんだろう。 聞くだけ無駄だよ。
222じゃないけど、スレッドっていうのはプログラムを実行する最小単位のことでいいんじゃないかな OSが管理しているかどうかは問わない スレッドっていう概念が実装されてるプログラミング言語が多いと思うんだけど、 この場合のスレッドはOS上の実装とは切り離されてるんだよね 例えばJavaのThreadクラスとか OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で 抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?
実行スタックってなんだ、って思ったらウィキペディア(英語版含む)でそんな表現を使ってるのか。 一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。
>>225 そんなトンデモ言われてるも議論する気にもならん。
じゃあ、関数もスレッドなんですね。
もうアホかと。しかもJavaの〜とかふざけてるとしか。
228 :
デフォルトの名無しさん :2014/02/26(水) 21:45:14.58
ワロタw
中途半端に脳内完結してるんだろな
グリーンスレッド言ってた
>>222 が定義を言わず逃げちゃった。
グリーンラナウェイ。
ファイバー、タスク、ユーザーレベルスレッドと呼ばれ方はあるが スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ もしやOSを書いたことも言語処理系を書いたこともないのか?
意味負
>>227 JavaのThreadクラスの何処がふざけてるんだ?
もはや人格攻撃しかできないモードに縮退したか。
POSIXのスレッドAPIを実装したものがスレッド、という定義でいいだろ。
トンデモグリーンスレッド連呼してたのにそのスレッドの定義聞いたら答えないで 逃げ回ってるんだからもはや人格の問題でしかない。 クズである。
おまえが自分の定義と違うものに聞く耳を持たないクズってだけじゃないか。 自分がクズだろ。
>>238 その定義ってどれ?w いいかげにんしろよ、クズ。
いい加減スレチ
グリーンスレッドはどう考えてもスレッドじゃないからな。 スレチ。
コンテキストの切り替えが出来るならスレッドの範疇でいいとちゃうの LWTやFiberも範囲でいいだろ
Java屋は馬鹿だからな。なに言っても無駄。
馬鹿でわるかったなー
キチガイに触るな 居座っちゃうだろ
247 :
デフォルトの名無しさん :2014/02/28(金) 03:22:01.11
マルチスレッドとタイムシェアリングは違うの?
>>247 まずプロセスとスレッドの違いを理解してから
まずグリーンプロセスとグリーンスレッドの違いを説明してほしい。
グリーンスライムよりは手強そうなイメージ
251 :
デフォルトの名無しさん :2014/03/01(土) 06:43:57.25
グリーンプロセス()
このスレはカーネルレベルでの実装オンリーのスレになりました、ってことでFAね。 あるいは「カーネル型」のw
まだいるのかグリーンスレッド君
まだいるのかカーネル至上主義者君
v-sync割り込みでマルチタスクだお〜 DOS至上主義者が通りますよ〜
[要出典]
258 :
デフォルトの名無しさん :2014/03/02(日) 21:38:31.73
マウスの付いてるパソコンはカッコ悪い
わーるかったな
260 :
デフォルトの名無しさん :2014/03/06(木) 00:31:59.51
マルチスレッドって使えるところが限られてる
261 :
デフォルトの名無しさん :2014/03/08(土) 13:27:50.88
これからマルチスレッドの勉強をしようと思うんだけど、 参考になるサイトとかコードとかを教えて欲しい。 特にワーカスレッドを複数立て、たくさんのデータブロックを順に渡して処理させるようなサンプルとか。 ネットを検索しても、スレッドが延々と動きつづけるか、処理が終われば使い捨てるものばかりで、 処理の終わったワーカスレッドに次のデータを渡して連続して処理させるものが見つからない。 また、可変長の演算結果を親スレッドに返す方法についても、どうすればいいのやら。 1個の結果データは固定長だけど出てくる個数が可変なので、固定長の電文を複数投げるようなイメージでも可。 動作環境はWin7-x64で、VC++を使いマルチコアCPUのコア数分ワーカスレッドを立てようと思う。 うちのは6コアなので、単純計算で6倍弱には高速化できると思う。 処理内容の原理試作としてシングルスレッドのDOSアプリとして組んで、鍵値に5を与えて動かしてみた結果、 データブロック数は320万個余り、データブロック1個あたりの演算結果はゼロ〜100KBと幅があるw そして総処理時間の見込みは60〜150時間(まだ終わってない)。 鍵値を6にするとブロック数も処理時間も莫大に跳ね上がるから、 たぶん1台のPC内で完結させようとしても終わらない。
使い捨てと使い回しで、クロックにして1k~2kくらいの差が有るかどうかだから、使い捨てでOK。
HotspotVMは? と無茶振りしてみる
VCならOpenCLかC++AMP使えば良いんじゃね CPUとGPUで切り替えも出来るし CPUだけならPPLでも
VS2013か2012で、C++11のstd::threadとblockingできるqueueとstd::futureあたりを使えばいいんじゃないかな。
>262-265 トン スレッドの使いまわしについて、ちょっと説明が言葉足らずだったかな。 やりたいのは最初にn個を起動するのまでは同じなんだけど、 データブロックを1個処理し終わったら次のデータブロックを処理させることで 全てのデータブロックを処理し終わるまでn個を実行している状態を維持したい。 (実際にスレッドをループさせるか破棄/生成を繰り返すかは重要ではない。) ググって見つけたサンプルは、n個のスレッドを最初に起動して、 n個全てが終わるのを待って次の処理(結果表示とか)に進むような使い方のばっかりで、 起動したうちの1個でも終わったら次の処理をやってまた1個終わるのを待つ、みたいなのが見つからない。 開発環境については、実は結構古いのしか持ってない…… ので、これからVS2013の評価版をDLして試してみようと思う。 現状のx86コード、シングルスレッドでどうやら鍵値5の処理を70時間以内で終われそうな予感。 処理結果のファイルを分割し過ぎて恐ろしい数のファイルを生成しちゃってるので、 マルチスレッド化の際にはもっと纏めてしまわないとなぁ。 鍵値6は複数台のPCへの分散処理とかGPU処理とかを真面目に考えないと無理そうだけど。
そこまで仕様が決まってるならさっさと書けよって話だが。
自慢
なんの?w
典型的なコード書けない君だったか。
>>261 OpenMPのparallel forで分割するだけでおk
272 :
265 :2014/03/10(月) 02:53:54.21
>>271 もしも、それで済む用件だったら、一番楽だね。
VS2012と2013なら、無料版でもOpenMP使えるし。
手元のコードでOpenMPでforループ2048周をi7-3760Xで6倍速度くらい。
CUDAで780Tiで2048*2048cudaスレッドでさらに18倍くらいだった。
266の処理は、OpenMPのparallel for schedule (dynamic)でできる
ここはおまえの日記じゃねーぞ。
275 :
デフォルトの名無しさん :2014/03/10(月) 17:32:15.14
スレッドの数って CPUのコア数より多くしても意味ないよね?
>>275 スレッド内の処理でI/O待ちとかしてる場合は意味あるんじゃないの?
ひたすら計算し続けるなら意味はない。 計算メインというだけならコア数の倍ぐらいまでは スループットが上がることはある。
書きたいアルゴリズムを自然に書けるという理由で マルチスレッドに意味があることはある GUIなんかそうだろうね
そんなGUIの実装は見たこと無いです。
GUI スレッドと別に好きなスレッドを立ててうまくやっていけるってことだろうに‥‥ win16 の泣きそうな世界を知らないのか?
それはCUIでも同じだろう。
処理内容・数によるけど大量のパラ処理はCPUのマルチコアやNvidiaのGPGPUからAMDのGPGPUでopenCLが定番になってきたからな そして、今後はAMDのHSAも定番になるって感じになっているし。
いつGPGPUが定番になってきたんだ。 むしろまじ使えないってスルーされてる感が半端ない。
それは nvidia/cuda
インテルのやたらコア数が多い奴にビットコイン掘らせたらよさげよね
GPGPUは特定の局面に限って言えば使えるんだが、一般の用途では その特定の局面が存在しないというかわいそうな技術。
ちなみにbit coinのマイナーはGPGPUから専用設計のASICに 主戦場が移った。消費電力が段違いなんだとさ。 GPUでやったら電気代で赤字になりそうだ。
>>287 特定用途のみならICにしたほうが良いだろうな。
確かbitcoinでよく使われていたVGAはAMDだったはず。
ゲーム用VGAのGPGPU性能はいまはAMDのほうが良いのかな
FPGA経由でASICな。 しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw
で、自販機の下に落ちてる100円玉を地道に拾うぐらいなら ショベルカーでATMごと盗んじゃえってのがマウントゴックス。
>>290 ワラタ、でもまさにソレ
MtGoxってMTGのカード売りだったと知った時の苦笑いときたら
2年ほど前にbitcoin採掘をしていたが お前らの想像の千倍くらい時間のかかる処理だったし 今もっと難しくなってるから既に個人で掘るのは無理なんじゃね
で、結局どのくらい掘れた?
294 :
デフォルトの名無しさん :2014/03/14(金) 17:00:16.55 ID:UFFJd6rH
千倍台で分散する
>bitcoin採掘 どういうこと?
>>295 むちゃくちゃ簡単に言うとBitCoinの正規のビットパターンは計算で求まる、でこれの正しい組み合わせを計算する事を採掘(マイニング)って言うだけの話
ちょいと相談。 データ処理とファイルI/Oを別スレッドに分けてstackを介してやり取りしてるんだけど、 気がつくとやたらメモリを食ってることがある。 調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。 ファイルの生成の様子なんかを観察してる限りで、2つの原因を想像。 A)処理済みデータをstackに積むのに比べてファイルに書き出す処理が追いついていない B)stackがバカスカとメモリを確保している ファイル書き出しのスレッドの内部処理は、共用stackからローカルstackにコピーして、 コピーが終わった時点で共用stack占有状態を開放、ローカルstackを順次書き出すようにしている。 Aは大量にデータを溜めることの無いようにファイル書き出しの頻度を上げる方法について、 Bはメモリを無駄に食わない方法について、アドバイスを聞きたい。 stackを使ったのはqueueに比べて頭が固定な分だけメモリの利用効率が高そうだったことと、 データの順番には意味がないから逆順になっても問題がないことによるものなので、 別のコンテナを使ったほうがいいなら、それでも構わない。
>>298 そもそも一旦メモリに載せる必要があるのか?非同期IOじゃだめ?
どうしても載せなきゃいけないとして、Aはあまり意味がない。
よほど頭の悪い実装をしてなければ、現状メモリを喰ってるってことは
inputよりoutputの方が遅いってことだ。頻度で解決する問題じゃない。
Bの方は、conditon variableでスタックのサイズが一定より大きくなったら
inputを待たす方法が一番簡単じゃないか。
>調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。 常識的に考えてバグ持ち。 >コピーが終わった時点で共用stack占有状態を開放、 ふつーstack<void *>。
バッファに制限を設けて 書き込みが詰ったら待てばいいだけでは
リングバッファ、そして新しいバグ
リングバッファてメモリが一杯になったらファイルに書き出すように実装するのが普通?
普通じゃない
どうすんの?あふれたら捨てるの?
環境によっては勝手にswapしてくれるかもしれない
>>305 ふつうは
>>301 の言うように空くまで書き込みを待たせるか捨てる。
待てないような要件ならサイズ固定のリングバッファじゃなく可変のキューを使うなりする。
書き出すデータのフォーマットを工夫してサイズを小さくするとか、 書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。
>>307 ありがとう、バッファーの構造を別にして最大容量は設定しないといけないということですね
>>306 後出しになるけど、リアルタイムシステムのデータ収集のようなもの考えていたので
310 :
デフォルトの名無しさん :2014/03/15(土) 16:35:55.25 ID:x1nRJa7F
いるんだよなー、そもそも不可能なことを引き受けちゃう奴って
てへ、昔の話がねた
金あるならFusion-ioを使えばいい 圧縮で減るようなデータならsnappyで圧縮する
普通のリアルタイムではありえん
314 :
313 :2014/03/15(土) 23:26:35.57 ID:Jbm5xDHA
訂正 以上です
リアルタイムシステムというのがRTOSを使っているという意味なら
送信側か他のタスクがwait入れてなくて書き込みタスクが動いていないとかってバグじゃないかな
>>313 時代は変わりCPUを使って圧縮したほうがIOが減って低レイテンシにできる
リアルタイムっていうのは入力があってから何ms以内に応答を 返せなければならないみたいなシステムのことでしょ。 コンピュータ制御の工作機械で応答が遅くて削りすぎましたとか 許されないから。
>261だけど、概ね期待通りの動作になってきた 速度面でも、現在使用中のPCでシングルスレッドだと70時間ほど掛かってたから、 マルチスレッド化で6コアに分散して細部の調整込みで10時間切れれば恩の字と思ってたのに、なんと4時間半を切れたw 最新のCPUを使えば2時間も夢じゃないかも あとは演算処理orデータのやり取りのバグを潰せばほぼ完成 (結果の個数が少し足りない)
シングルスレッドのまま細部の調整とやらだけでどこまで行くのやら
どんだけ時間がかかってるのやら。
320 :
デフォルトの名無しさん :2014/06/13(金) 00:28:43.87 ID:cRyKxN+T
共有/排他ができるロックと条件変数があるとき、これらを使って 共有から排他にエスカレーションできるロックを構成することってできる?
ロックとか条件変数って排他するものだよね。共有できるロックって何? RCUのこと?
ええと、いわゆるread-writeロックのこと。
323 :
デフォルトの名無しさん :2014/11/06(木) 22:37:47.07 ID:iaZsweTc
マルチスレッドは馬鹿には無理 馬鹿は使ったほうがいいところでマルチスレッドを使わずに 使わないほうがいいところっ使ってややこしくしたりする
負荷分散とか難易度高なのにね
スレッディング・ビルディング・ブロックについて勉強し始めた所なんだけど、どうなの? 理解して使うと安全で早くなりそうだとは思ったが、メモリ処理の効率とかどうなるんかな? とか思ってる所なんだけど・・・
安全にするには、ある程度やった人しか...
メモリ処理の効率って具体的にどういう点? mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?
オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな
>>325 コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ
基礎的な質問で申し訳ないのですが 同じ変数に複数のスレッドがアクセスしてはいけないのはわかりますが 同じコードに複数のスレッドがアクセスするのはいいのでしょうか? 例えば何の変数にもアクセスしない関数を複数のスレッドが同時実行するのはいいのでしょうか?
ダメな理由でも探してるの?
>>330 今書いているプログラムで
C#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って
C#のシグナルってよーしらんけど エラーが出るってことは、質問の内容と違うことやってるんじゃないの
同期オブジェクトを保持している変数を上書きしていそうな気がするんだが
いろいろ分かってないだけだろう
ライブラリがマルチスレッドに対応してないだけかと
/MT
C#ならエラーメッセージやスタックトレースが出てるだろ
>>329 同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数とstatic変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ
同じ変数に複数のスレッドがアクセスするならクリティカルセクションが楽だ
340 :
デフォルトの名無しさん :2014/11/16(日) 19:55:00.63 ID:9ZsvKJox
linuxですがスレッドで同じファイルに書き込む場合、競合することってありますかね?
勿論。
論外
>>339 もう win32 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?
344 :
デフォルトの名無しさん :2014/11/30(日) 17:47:06.48 ID:H8djdLBQ
複数のスレッドがひとつのミューテックスのアンロックを待っていた場合、 つぎにどのスレッドがミューテックスを取得するかはランダムですか
はい 待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
いいえ 待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
スレッドとミューテックスだけ覚えたけど なにを作ったらいいのかわからんたい
チャット作ることにしました
consumerとproducerみたいのがいいんじゃないのかなと思ったけど、 チャット作ることにしたのね がんばってください
>>349 チャットで詰まったら気分変えてConsumer-Producerにも挑戦してみます
あざす
351 :
350 :
2014/12/09(火) 00:23:00.21 ID:MJarMgeM