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】
【言語】
【実行環境】
【その他特記する事項】
0003デフォルトの名無しさん
垢版 |
2012/06/15(金) 03:59:42.18
>>1

前スレ >>994
並列実行「可能」でも「スケールする」かは知らんぞ。

OpenMP なら !$omp parallel do としてコンパイルオプション /Qopenmp
0004デフォルトの名無しさん
垢版 |
2012/06/15(金) 16:15:07.07
>>前すれ995
そういうオプションがあるのですね,レポートと書き直したソースを添付します.

http://www5.puny.jp/uploader/download/1339744079.zip
pass:giko

potential OUTPUT 依存関係
らしいですが,ググってもよくわかりません.依存関係がないように>>前すれ999のようにpureに書き換えたのですが.

>>前すれ997
これは試しにつけてみただけのものです,やはり使い方が違いますか・・.
0006デフォルトの名無しさん
垢版 |
2012/06/15(金) 18:54:01.14
彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど
どうすればいいかな
0008デフォルトの名無しさん
垢版 |
2012/06/15(金) 21:41:34.19
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];


0009デフォルトの名無しさん
垢版 |
2012/06/16(土) 12:26:31.55
>>4
ループ間で出力変数に依存関係があるかも、という判断。

○ i, j は value 属性を付け、b は戻り値にする。
○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。

ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (100〜0) で並列化は完了。
0013デフォルトの名無しさん
垢版 |
2012/06/16(土) 16:54:32.86
クリティカルセクションとかミューテクスって重いんですか?
秒間2500回とかマジキチですか?
0014デフォルトの名無しさん
垢版 |
2012/06/16(土) 17:00:15.54
400μ秒は今のパソコン環境でも、厳しいんじゃね
何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
0016デフォルトの名無しさん
垢版 |
2012/06/16(土) 17:33:56.57
>>13
そのあたりだと、API 呼び出しのオーバーヘッドもバカにならないから
自前で実装したほうがいいんじゃね?
0018デフォルトの名無しさん
垢版 |
2012/06/16(土) 22:25:28.46
>>13
重いけどそれくらいならいけると思う
できるならスレッドごとにリソースもって
最後に合体させたほうが速い
00194
垢版 |
2012/06/16(土) 23:07:53.93
申し訳ありません,並列化ですが,解決しました.
/Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました.

ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです.
このループだけ並列化したいっていうような指定ってできるのでしょうか?
0020デフォルトの名無しさん
垢版 |
2012/06/16(土) 23:18:15.13
>>17
Mutexってスレッド数によると思うんだけどな。
シングルコアならオンキャッシュで対応できるけど、
マルチコアだったりマルチCPUだったらメモリ参照と大差ないと思う。
0023デフォルトの名無しさん
垢版 |
2012/06/17(日) 03:56:01.16
実行環境に寄って自動で最適化して欲しいよね。
ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。

4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
0025デフォルトの名無しさん
垢版 |
2012/06/17(日) 06:28:14.10
効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS
※ 依存性に目をつぶれという指示ではない

> 64core の対応
3日かかる計算を1時間に押し込みたいなら、やる価値はある。
1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。

そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。
スケールするとかしないとかはそういう話。
0027デフォルトの名無しさん
垢版 |
2012/06/17(日) 19:02:58.50
それは、プログラム作ったベンダーに言え。
場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
0028デフォルトの名無しさん
垢版 |
2012/06/17(日) 20:27:37.75
分散処理できるように考えるほうが難しいのに
道具によってはできることとできないことがあるでしょ
0029デフォルトの名無しさん
垢版 |
2012/07/06(金) 19:30:56.61
多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。
そうしないとスケジューリングに費やすコストが無駄だ。
0031デフォルトの名無しさん
垢版 |
2012/07/06(金) 19:45:56.15
gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。
0032デフォルトの名無しさん
垢版 |
2012/07/06(金) 19:58:44.83
標準的な入出力は動くコア決めたほうがいいかもしれんけど
プロセス、スレッドはどのコアで動こうが関係無いような
どうせ、暇な?コアに割り当てられるだろうから
0033デフォルトの名無しさん
垢版 |
2012/07/06(金) 20:28:22.95
linuxだとこういう指定が出来るようだ
ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html
0036デフォルトの名無しさん
垢版 |
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()の使い方を間違えている?)
0038デフォルトの名無しさん
垢版 |
2012/07/21(土) 15:18:21.14
>>36
broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
0039デフォルトの名無しさん
垢版 |
2012/07/21(土) 15:33:58.32
>>38
素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね

このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には
それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう?


ともかく、ありがとうございました
0040デフォルトの名無しさん
垢版 |
2012/07/21(土) 15:42:20.05
>>39
pthreadの粒度が小さい場合、threadの実行順序がぐだぐだになるから要注意。
結論としては、充分長い処理でもない限りcond_waitは使えない。
0041デフォルトの名無しさん
垢版 |
2012/07/21(土) 15:49:59.71
>>40
頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・

自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので
素朴なつくりでもそれなりに動いたかもしれませんが、
再現性のないトラブルが発生する前にそういう問題を認識できてよかったです

ありがとうございました
0042デフォルトの名無しさん
垢版 |
2012/07/21(土) 16:06:39.87
>>41
去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
0043デフォルトの名無しさん
垢版 |
2012/08/25(土) 18:20:47.36
いつでもどんな時にでも
スケジュールから外されても動かされても
大丈夫なように作るのが鉄則
0045デフォルトの名無しさん
垢版 |
2012/08/26(日) 09:32:08.49
そもそも並列化したいのは高速に処理したいからじゃん?
サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる
まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
0046デフォルトの名無しさん
垢版 |
2012/08/26(日) 09:34:18.81
て言うかサンプルってそういうもんだし。

そもそも >>42

> mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
> 自分が待たずにロックしちゃうことに。

って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
0047デフォルトの名無しさん
垢版 |
2012/08/26(日) 09:57:42.57
マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ

そんなことより、マトがトマるだって・・・・・!喜w
0048デフォルトの名無しさん
垢版 |
2012/09/01(土) 15:54:33.37
ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・


素朴なQなんですが、マルチCPUのマシンで、

@ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く

Aひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、
 スレッド単体ではなく、それの属するプロセスが渡り歩いているため



こういう理解は正しいですか?
0049デフォルトの名無しさん
垢版 |
2012/09/01(土) 15:58:04.54
スレッドの割り当てとかはOSが決めてることだからね
OSの挙動に影響しないようなことを考えながらやりませう

マルチCPUじゃなく
単一CPUの時のスレッド等の挙動を考えてみませう
0050デフォルトの名無しさん
垢版 |
2012/09/01(土) 16:04:51.98
同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、
せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
0054デフォルトの名無しさん
垢版 |
2012/09/01(土) 16:27:35.25
命令の先読みとかやってるの知ってる?

同じ領域を読み込む場合に早くなるってのがキャッシなのでは?

HDDキャッシュとかも同じでしょ
0055デフォルトの名無しさん
垢版 |
2012/09/01(土) 16:29:03.73
別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、
ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある
OSの裁量次第
0056デフォルトの名無しさん
垢版 |
2012/09/01(土) 16:32:16.93
キャッシュ知らんでも
スレッド系のプログラム作るのには関係無いような

速度ウンタラは動いてから考えればいい話でしょ
0057デフォルトの名無しさん
垢版 |
2012/09/05(水) 01:11:52.99
初心者の質問です

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;

っていうのは安全でしょうか?
0058デフォルトの名無しさん
垢版 |
2012/09/05(水) 04:17:50.83
>>57
先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。
要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。
つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか?
それと、cpにNULLが代入されること自体は問題ないの?
0068デフォルトの名無しさん
垢版 |
2012/09/12(水) 00:03:54.96
volatileしてダメだったケースに遭遇したことないなあ。

まあboolでの同期・排他は簡単なケースにしか使ってなくて、
まじめなのはcritical sectionとかmutexで排他・同期するから
気がついてないだけかもしれないけど。
0069デフォルトの名無しさん
垢版 |
2012/09/12(水) 07:22:51.47
>>57
>// スレッドA
>while( blReference ){ Sleep(1); } // 1
>blDeleting= true; // 3

>// スレッドB
>while( blDeleting ){ Sleep(1); } // 2
>blReference = true; // 4

スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。
0071デフォルトの名無しさん
垢版 |
2012/09/29(土) 20:38:32.52
質問ですが、Windows APIのSetEvent()やWaitForSingleObject()って、
内部で適切にメモリバリアを行うことが保証されていますか?

例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長?
(メインスレッド側)
 bTerminate = true;  // volatile bool型
 _WriteBarrier();
 SetEvent(hEvent); // スレッドを起床させる

(ワーカースレッド側)
 WaitForSingleObject(hEvent);  // 起床されるまで待つ
 _ReadBarrier();
 if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理
0072デフォルトの名無しさん
垢版 |
2012/09/29(土) 20:49:37.13
も一個、volatile bool a, b; があるとして、
 a = c;
 b = d;
の代入順序は、a, bがたとえatomicな型でvolatileだからといって
プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、
よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は
メモリバリアが 必 須 、
という理解で合っていますか
0076デフォルトの名無しさん
垢版 |
2012/09/30(日) 00:30:58.05
>>73
dクス
SetEvent()は2番目(・Functions that signal synchronization objects)、
WaitForSingleObject()は3番目(・Wait functions)ってことでおkそうですね

>>75
メモリバリアはアウトオブオーダー実行するアーキテクチャに共通する概念であってGCC固有というわけではないですにょ
とかいろいろあるが説明がマンドクセ、
0078デフォルトの名無しさん
垢版 |
2012/09/30(日) 01:05:56.81
>>77
ちょっそれvolatileの方wwwww

まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
0079デフォルトの名無しさん
垢版 |
2012/09/30(日) 01:13:58.15
マルチコア時代の並列プログラミング
〜ロックとメモリオーダリング〜
http://www.nminoru.jp/~nminoru/data/b2con2006_nminoru.pdf
0082デフォルトの名無しさん
垢版 |
2012/09/30(日) 01:26:29.84
ここらへんの話は
 ・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛
 ・volatileによって明示的に最適化が抑制
 ・システムコール内でメモリバリアの面倒をみてくれる
 ・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる
といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので
コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
0084デフォルトの名無しさん
垢版 |
2012/09/30(日) 02:22:23.12
>>81
> つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
そこで面倒を見てくれるのは「release/aquireメモリバリアとしてのみ」であることに注意。
http://yamasa.hatenablog.jp/entry/20090816/1250446250
こっちのSequential consistencyの性質は、VC++2005以降のvolatileでも持っていない。
0086デフォルトの名無しさん
垢版 |
2012/09/30(日) 13:35:58.01
なんで排他の話ばっか出てくるんだ。
スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。

それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
0087デフォルトの名無しさん
垢版 |
2012/09/30(日) 14:26:20.27
>>86
>なんで排他の話ばっか出てくるんだ。

マルチスレッドで問題になるところと言うか、排他を最近覚えた奴が
使いたくてしょうがないんだろ。
0090デフォルトの名無しさん
垢版 |
2012/09/30(日) 16:54:17.48
>>88
boostとか抽象化レイヤー用意すればできるだろ。

しかし、仕様の安定したスレッドキューがない。
もう、自作スレッドキューを保守するのは嫌だお
0096デフォルトの名無しさん
垢版 |
2012/09/30(日) 23:53:26.29
スレッドキューって何だ?
スレッドセーフなキューってことか?
それともGCDみたいなタスクキューのことか?
0097デフォルトの名無しさん
垢版 |
2012/10/01(月) 00:06:38.53
タスクキューのことだよ。
てかスレッドセーフなキューってなんだよ。それだったら
別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
0099デフォルトの名無しさん
垢版 |
2012/10/12(金) 23:18:24.02
同期処理を間違いなく設計するための、何か良い手法やツールはないですかね?

ペーペーのビギナーだというのもあるのですが、
複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、
waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、
そのデバッグで無駄に体力を消耗しています
0102デフォルトの名無しさん
垢版 |
2012/10/13(土) 18:57:49.84
>>99
もうそこは、共有している資源と mutex の一覧表作って、地道に設計してレビューで
確認するしかない。

imagix とか確認を支援するツールはあるけど。
0103デフォルトの名無しさん
垢版 |
2012/10/13(土) 22:12:39.46
>>101
やんないと、他に仕事ないんで・・・・

>>102
かなり頭がよくないと、サラリと正しいコード書けないですよね(棋士的な意味の頭のよさ)
そうか、地道にやるしかないのか(´・ω・`)

・・・売り物なんですねimagix
自分の担当業務以外にも使えそうなので、ちょっとチーム内に紹介してみます




とりあえず、今の自分のレベルでミスりやすいところを正しく実装するための比喩をいくつか考案中です

例1
スレッド間同期は、キャッチボール
ボールを受け取る側は、しゃがんでいないとボールをキャッチできない

例2
スレッド再開時の手順は、競馬のスタートと同じ
@ゲートを閉じる(送信側mutexロック)
A馬がゲート前に並ぶ(受信側wait)
Bファンファーレが鳴る(signal)
Cゲートが開く(送信側mutex開放)
0108デフォルトの名無しさん
垢版 |
2012/10/15(月) 01:03:58.39
>>103
比喩を作ることができるならすでに理解できてるんじゃないの?ってことで、
結局比喩は不要だよねって流れにならないのかな。
0113デフォルトの名無しさん
垢版 |
2012/10/26(金) 20:45:55.33
教えてください

g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の
効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?
0116デフォルトの名無しさん
垢版 |
2012/12/05(水) 09:54:15.94
プロファイラでわかるのはどの部分が処理時間の何%を使ってるか
ぐらいであって、スレッドの動作効率なんていう個人の価値観みたい
なものは測定できんだろ。
0117デフォルトの名無しさん
垢版 |
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を使う。スレッドでの変更が反映されている?
0118デフォルトの名無しさん
垢版 |
2012/12/31(月) 16:48:21.02
あります
0119デフォルトの名無しさん
垢版 |
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()より前に
という事は行われないように思えるのですが。
0122デフォルトの名無しさん
垢版 |
2013/01/04(金) 04:09:28.62
C#が自ら自身の仕様を質問すること自体が。
まぁ、人間だって自身についてどれだけ知っているか怪しいもんだが。
0123デフォルトの名無しさん
垢版 |
2013/01/05(土) 12:19:18.18
>>96
の発言で思い出した。
GCDといえば、最近WindowsとLinuxにも移植されたっぽいんだよね。
http://opensource.mlba-team.de/xdispatch/docs/current/index.html

pThreadとかWin32スレッドをローレベルで使うよりお手軽な気がする。
ちょっと試してみるわ。
0124デフォルトの名無しさん
垢版 |
2013/01/05(土) 18:17:06.97
123だけど、
XDispatchだが、Windowsであっけなく使えた。
こりゃいいぜ。Win、Mac、Linuxで同一ソースでGrand Central Dispatchが使える。
マルチスレッドプログラミング新時代到来って感じだw
0127デフォルトの名無しさん
垢版 |
2013/01/09(水) 01:22:43.52
>>126
そうみたい。
基本的にはマルチプラットフォームでやりたい場合は${ ~ }の記法とautoを使えばオッケー。
他にも標準のlibdispathには無い機能とか、Qtユーザー向けのQtDispatchとかあるみたいだけど、そこまではまだ調べられてない。
時間があったらもっと調べてみて、追記してみるよ。
0128デフォルトの名無しさん
垢版 |
2013/01/30(水) 19:59:09.23
Win32でのプロセス間リソース共有の仕方で悩んでます

1. ポーリング=Mutexで保護された共有リソースの変更を常に監視
2. サーバー(orクライアント)スレッドでEvent監視+Mutexで共有リソースを保護

余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
(定性的な評価=プロファイルで調べろは無しでお願いします)
自分は「重さ:Mutex>>>>Event>>>>>>>CriticalSection」というイメージがあるので、
2のマルチスレッドのコンテキストスイッチの重さを考慮しても1の方が重いのではないかと考えています
0131デフォルトの名無しさん
垢版 |
2013/01/30(水) 21:52:45.99
何もすることがなきゃ寝て待ってればいいだけ
何かしたけりゃイベント来るまでしてればよかろう
0132デフォルトの名無しさん
垢版 |
2013/01/31(木) 08:42:39.84
Mutexが重いんじゃなくてポーリングが重いんだろ
イベントやメッセージ等の非同期通知が使えるなら、そっちのほうが軽いのは当然
0133デフォルトの名無しさん
垢版 |
2013/01/31(木) 22:24:51.03
>>128
> Win32でのプロセス間リソース共有の仕方で悩んでます
winすれで聞いたら
> 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?
0135デフォルトの名無しさん
垢版 |
2013/02/17(日) 17:37:32.78
>>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

この順番が逆になることあり、てことだよね?
0136デフォルトの名無しさん
垢版 |
2013/02/17(日) 21:17:44.97
>>135 それ RAW じゃね

シングルスレッドのメモリ命令は RAW (対象アドレスが被らない) と
WAW (命令による) の特定ケースを除いて命令順通り、
マルチスレッドの各スレッド間では、全パターンに入れ替えの可能性あり。

たぶん MSDN の記載は誤解を招くかと。
こちらの根拠は以下の Volume 3A, Chapter 8.2

Intel 64 and IA-32 Architectures Software Developer's Manuals
ttp://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

write -> 0x1000
...
read -> 0x2000

と明らかに異なる場所へのアクセスであり、... の間に他のメモリアクセスが
無ければ、read を write の前に持ってきても結果は変わらないはず。
0137デフォルトの名無しさん
垢版 |
2013/02/18(月) 21:54:23.31
>>135
WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。

でいいかと。
0138137
垢版 |
2013/02/18(月) 22:30:08.38
>>137の補足しとくと、同一プロセッサでも異なるアドレスだとリオーダ可能なので
順序が重要な場合はメモリフェンスが必要になる。
別のプロセッサ間でもリオーダ可能ということになる。

別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。
0139デフォルトの名無しさん
垢版 |
2013/02/18(月) 23:53:52.86
>>135
MSDNのほうが正しい。
昔はIntelのdeveloper manualの記述が曖昧だったこともあり、
間違った解説が結構ある。

>>136-138
マルチスレッドでもRAW以外は入れ替わらないよ。
0140デフォルトの名無しさん
垢版 |
2013/02/19(火) 07:57:34.41
>>139
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
0143135
垢版 |
2013/02/23(土) 23:41:17.41
>>136-142さん、さんくすでした。
MDSNが正しかったのですか。

> それ RAW じゃね
でした。コードの順番と英語表記は逆になるんですよね。誤解してました・・・。

この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。
0144デフォルトの名無しさん
垢版 |
2013/02/24(日) 10:17:55.94
ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。

CPU内の順序はOut of Orderが関係していて、CPUは可能な限り速く実行しようとするから
順番が入れ替わってしまうってことで、それをコントロールするのにメモリバリア命令がある。
アセンブラの最適化にも関係してるから、プロセッサの最適化マニュアルとかも参考になるかも。

マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。
他のプロセッサに割り込まれて困る部分にはlockで保護するとか。
0147デフォルトの名無しさん
垢版 |
2013/02/27(水) 23:21:29.29
RafterWってシングルスレッドなら絶対安全?
途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと?
実行cpuが変わることあるかしらないけど

まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
0148デフォルトの名無しさん
垢版 |
2013/03/02(土) 16:47:32.29
>>147
> まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か

普通に入れ替わるだろ。
切替前に読み込んだ情報は、違う CPU でもちゃんと復帰するから
問題ないはず。
0149デフォルトの名無しさん
垢版 |
2013/03/03(日) 20:26:49.52
>>148
書き方が悪かった。

マルチプロセッサの環境でシングルスレッドのコードを実行してて、
実行CPUが変わったとしても読み書き順が入れ替わらないでしょう?

そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
0152デフォルトの名無しさん
垢版 |
2013/03/04(月) 01:43:54.42
MemoryBarrier()の実装ってx86では単なるxchgなのな。
なんでmfence使ってないのだろう?速度では大差ないってことなのかな。

MemoryBarrier macro (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208

↓はC++11のスレッドライブラリ作った作者の本らしいんだが、pdfで全部公開されてる。
ありがたいのでだけどメモリフェンスは std::memory_order_acquire みたいな一般命令で
隠すようなコードしか書いてない。

C++ Concurrency in Action: Practical Multithreading
http://www.amazon.co.jp/dp/1933988770/
0153デフォルトの名無しさん
垢版 |
2013/03/04(月) 09:03:05.32
マルチコアでないマルチプロセッサ構成で、
外部キャッシュや主記憶のシステムコントローラが、
CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。
Windowsではこうゆうハードウェア構成は想定してないはず。
0156デフォルトの名無しさん
垢版 |
2013/03/04(月) 23:37:29.77
>>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
0157デフォルトの名無しさん
垢版 |
2013/03/11(月) 14:35:12.41
>>155
xFENCE命令はMOVNTPS, MOVNTPD,などのNon Temporal転送命令向けの機能で、
この系統の命令だけx86のメモリモデルに従わないので専用のFENCE命令が必要となった。
このうちLFENCEとMFENCEは普通のx86命令にも効果があるが、
パフォーマンスがxchgに劣る。
0160片山博文MZパンク ◆0lBZNi.Q7evd
垢版 |
2013/06/18(火) 23:59:01.86
確率的にいつ終わるかわからない時間の掛かる処理をマルチスレッドを使って複数同時に
実行させると、シングルスレッドよりも早い時間で終わる確率が高くなると思うが、これについて貴様らはどう思う?
0165デフォルトの名無しさん
垢版 |
2013/06/20(木) 07:49:26.95
同じレスを各板に乱れ撃ちする作業だろ?
0166デフォルトの名無しさん
垢版 |
2013/06/20(木) 15:25:09.57
マルチスレッドにしたら5〜8時間に1回エラーが出るようになった。でもデバックできないよorz
0169デフォルトの名無しさん
垢版 |
2013/06/20(木) 22:26:19.30
同期とったら並列の意味がなくなりそうでためらうときがあるな
待ち合わせキューにするくらいなら順番に処理した方がましな気がする
0172デフォルトの名無しさん
垢版 |
2013/06/21(金) 04:34:35.98
マルチスレッドって自作できるんですか?
以前nyの書籍を読んだときに、開発者の人がマルチスレッドを自作したと書いてたような気がするのですが
C言語でも自作できるんですか?
0173デフォルトの名無しさん
垢版 |
2013/06/21(金) 04:48:19.55
マルチスレッド・マルチタスクで動いているように見せることは出来る。

並列動作させたい複数の処理を細切れにしてちょっとづつ実行して
グルグル回す。
0175デフォルトの名無しさん
垢版 |
2013/06/21(金) 19:27:29.84
>>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は
マルチタスクの能力を持っていないのが当たり前のようにあり、
これでマルチ動作させるのに当たり前のように使われる手法。
0176デフォルトの名無しさん
垢版 |
2013/06/21(金) 19:38:33.60
スレち
0177デフォルトの名無しさん
垢版 |
2013/06/21(金) 19:52:56.34
スレチというほどじゃないんじゃない?

OSレベルでスレッドのサポートが無い場合は、
言語ランタイムレベルのグリーンスレッド
タイマー等の割り込みの利用
メッセージポンプのループ利用
NT Fiber

スレッドはないけどプロセスのマルチが出来るなら、
パイプなどでプロセス間通信の利用
といったところかな
0185デフォルトの名無しさん
垢版 |
2013/06/21(金) 23:40:35.43
広義だと含むのとちゃうかな
おさ〜ん的にはTSS(TSO)のホスト端末を思い浮かべるけど
0187デフォルトの名無しさん
垢版 |
2013/11/22(金) 08:18:08.42
C/C++ で勉強したいのですが、おすすめの書籍などありますか?
もしくは一から学べるようなWebページがあれば教えてください
0188デフォルトの名無しさん
垢版 |
2013/11/22(金) 09:05:54.07
D の方が良いよ
0190デフォルトの名無しさん
垢版 |
2013/11/23(土) 05:39:10.02
>>188
D のほうが書きやすい?触れたことないのでわからんです
>>189
猫でもわかる は、Web版が俺にはちょっと分かりづらかった記憶が
書籍だとそうでもないのかな

C++のBoostを利用したThreadプログラミングの解説ページがあったので今はそれ見てます
0193デフォルトの名無しさん
垢版 |
2013/11/23(土) 13:24:53.59
>>191
ペロペロ
0194デフォルトの名無しさん
垢版 |
2014/02/23(日) 09:00:04.29
マルチスレッドって自力だとどうやって書くの?
0197デフォルトの名無しさん
垢版 |
2014/02/24(月) 17:57:18.01
例の金子がny作るときにマルチスレッドは自作したんじゃなかったっけ?
0202デフォルトの名無しさん
垢版 |
2014/02/25(火) 17:16:14.73
グリーンスレッドなんて初耳。wikip見たらなんかトンデモな説明なんだが。
これは誰が言い出したんだ? バズワードくさい。
0204デフォルトの名無しさん
垢版 |
2014/02/25(火) 17:28:25.61
OSが関与しないスレッドの実装のこと。ウィキペディアの記述がタコってるのはいつものこと。

基本的な理屈はそう難しくないけど、実際にはreadとかでどれかのスレッドがプロセスごと
ブロックされると、他に走りたいスレッドが居ても走れなくなっちゃうので、そのへんを
どう手当てするかがカギ(そういった所だけOSが支援するとか、ブロックする可能性がある
システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。
0205デフォルトの名無しさん
垢版 |
2014/02/25(火) 17:33:10.94
よく分らんな。スレッドってそもそもOSが定義したものだろう。
アプリ側がたかが永続性のあるサブルーチン程度のものを
勝手にグリーンススレッドって呼んでるだけじゃないのか?

まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。
0206デフォルトの名無しさん
垢版 |
2014/02/25(火) 18:01:22.88
ユーザースレッド、ユーザ空間でか、なるほど
カーネルスレッド、カーネル空間でか、なるほど
グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん。それこそ>>203
0207デフォルトの名無しさん
垢版 |
2014/02/25(火) 18:14:03.00
ttp://dl.acm.org/citation.cfm?id=603551
↑これが「小学生がBASICで弾の連射実装してるレベルの話」に見えるのか。
さぞかしスーパープログラマ(笑)様なんだろうな。
0208デフォルトの名無しさん
垢版 |
2014/02/25(火) 18:19:01.04
その例え話しとその提示したのと繋がりそしてなんでその皮肉になるのか、200文字以内で説明しなさい
0209デフォルトの名無しさん
垢版 |
2014/02/25(火) 18:49:55.40
wikipediaのスレッドの項目の所まで加筆してやがるww
バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw

そんなのスレッドと何の関係もないのにスレッド言うなや。
0211デフォルトの名無しさん
垢版 |
2014/02/26(水) 05:28:26.83
グリーンCPU。
グリーンプロセス。
グリーンヒープメモリ。
グリーンスタックメモリ。
グリーン仮想メモリ。
グリーン物理メモリ。
グリーンマルチタスク。
グリーンネットワーク。
グリーンアップル。

おれもいっぱい考えました。
0216デフォルトの名無しさん
垢版 |
2014/02/26(水) 17:24:33.12
> ユーザースレッド、ユーザ空間でか、なるほど
> カーネルスレッド、カーネル空間でか、なるほど
> グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん

ユーザースレッドとカーネルスレッドという言葉はそれぞれ、
M:Nスレッドモデルとかの議論で、カーネル空間のコードの実行におけるスレッドと、
ユーザー空間のコードの実行におけるスレッド、という意味で使われる。

グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
スレッドAPIの実装を指す。

以上のことが何も理解できないバカには、なにもかもがバズワードに見える。
0218デフォルトの名無しさん
垢版 |
2014/02/26(水) 17:49:55.02
命名の由来のことなのに、Wikipediaから意訳したようなのを偉そうにのたまう、他人を馬鹿呼ばわりする自称天才様w
天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw
0219デフォルトの名無しさん
垢版 |
2014/02/26(水) 18:13:53.06
> バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
>
> そんなのスレッドと何の関係もないのにスレッド言うなや。

この威勢はどこ行ったのかなぁw
0220デフォルトの名無しさん
垢版 |
2014/02/26(水) 18:31:45.02
>グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
>スレッドAPIの実装を指す。

ハナからスレッドの定義に当てはまらないのにスレッド言われもなぁ。

WEB2.0と変わらんレベルの造語。
どうせまたジョブスオタクの低脳営業SEが言い出したんだろう。
0222デフォルトの名無しさん
垢版 |
2014/02/26(水) 18:38:20.17
コイツの脳内ではシステムコールで実装されたものだけがスレッド、という定義なんだろう。
聞くだけ無駄だよ。
0225デフォルトの名無しさん
垢版 |
2014/02/26(水) 19:01:36.43
222じゃないけど、スレッドっていうのはプログラムを実行する最小単位のことでいいんじゃないかな
OSが管理しているかどうかは問わない

スレッドっていう概念が実装されてるプログラミング言語が多いと思うんだけど、
この場合のスレッドはOS上の実装とは切り離されてるんだよね
例えばJavaのThreadクラスとか

OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で
抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?
0226デフォルトの名無しさん
垢版 |
2014/02/26(水) 19:17:09.57
実行スタックってなんだ、って思ったらウィキペディア(英語版含む)でそんな表現を使ってるのか。

一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。
0227デフォルトの名無しさん
垢版 |
2014/02/26(水) 20:45:20.03
>>225
そんなトンデモ言われてるも議論する気にもならん。
じゃあ、関数もスレッドなんですね。

もうアホかと。しかもJavaの〜とかふざけてるとしか。
0228デフォルトの名無しさん
垢版 |
2014/02/26(水) 21:45:14.58
ワロタw
0231デフォルトの名無しさん
垢版 |
2014/02/26(水) 22:31:24.56
ファイバー、タスク、ユーザーレベルスレッドと呼ばれ方はあるが
スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ
OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ
もしやOSを書いたことも言語処理系を書いたこともないのか?
0237デフォルトの名無しさん
垢版 |
2014/02/27(木) 07:54:15.34
トンデモグリーンスレッド連呼してたのにそのスレッドの定義聞いたら答えないで
逃げ回ってるんだからもはや人格の問題でしかない。

クズである。
0238デフォルトの名無しさん
垢版 |
2014/02/27(木) 08:07:04.32
おまえが自分の定義と違うものに聞く耳を持たないクズってだけじゃないか。

自分がクズだろ。
0243デフォルトの名無しさん
垢版 |
2014/02/27(木) 12:47:18.23
コンテキストの切り替えが出来るならスレッドの範疇でいいとちゃうの
LWTやFiberも範囲でいいだろ
0247デフォルトの名無しさん
垢版 |
2014/02/28(金) 03:22:01.11
マルチスレッドとタイムシェアリングは違うの?
0251デフォルトの名無しさん
垢版 |
2014/03/01(土) 06:43:57.25
グリーンプロセス()
0252デフォルトの名無しさん
垢版 |
2014/03/01(土) 13:24:07.27
このスレはカーネルレベルでの実装オンリーのスレになりました、ってことでFAね。
あるいは「カーネル型」のw
0258デフォルトの名無しさん
垢版 |
2014/03/02(日) 21:38:31.73
マウスの付いてるパソコンはカッコ悪い
0260デフォルトの名無しさん
垢版 |
2014/03/06(木) 00:31:59.51
マルチスレッドって使えるところが限られてる
0261デフォルトの名無しさん
垢版 |
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内で完結させようとしても終わらない。
0262 ◆0uxK91AxII
垢版 |
2014/03/08(土) 15:25:57.27
使い捨てと使い回しで、クロックにして1k~2kくらいの差が有るかどうかだから、使い捨てでOK。
0264デフォルトの名無しさん
垢版 |
2014/03/08(土) 15:57:35.44
VCならOpenCLかC++AMP使えば良いんじゃね
CPUとGPUで切り替えも出来るし
CPUだけならPPLでも
0265デフォルトの名無しさん
垢版 |
2014/03/08(土) 16:20:54.15
VS2013か2012で、C++11のstd::threadとblockingできるqueueとstd::futureあたりを使えばいいんじゃないかな。
0266デフォルトの名無しさん
垢版 |
2014/03/09(日) 12:57:11.91
>262-265
トン

スレッドの使いまわしについて、ちょっと説明が言葉足らずだったかな。
やりたいのは最初にn個を起動するのまでは同じなんだけど、
データブロックを1個処理し終わったら次のデータブロックを処理させることで
全てのデータブロックを処理し終わるまでn個を実行している状態を維持したい。
(実際にスレッドをループさせるか破棄/生成を繰り返すかは重要ではない。)
ググって見つけたサンプルは、n個のスレッドを最初に起動して、
n個全てが終わるのを待って次の処理(結果表示とか)に進むような使い方のばっかりで、
起動したうちの1個でも終わったら次の処理をやってまた1個終わるのを待つ、みたいなのが見つからない。


開発環境については、実は結構古いのしか持ってない……
ので、これからVS2013の評価版をDLして試してみようと思う。

現状のx86コード、シングルスレッドでどうやら鍵値5の処理を70時間以内で終われそうな予感。
処理結果のファイルを分割し過ぎて恐ろしい数のファイルを生成しちゃってるので、
マルチスレッド化の際にはもっと纏めてしまわないとなぁ。
鍵値6は複数台のPCへの分散処理とかGPU処理とかを真面目に考えないと無理そうだけど。
0272265
垢版 |
2014/03/10(月) 02:53:54.21
>>271
もしも、それで済む用件だったら、一番楽だね。
VS2012と2013なら、無料版でもOpenMP使えるし。
手元のコードでOpenMPでforループ2048周をi7-3760Xで6倍速度くらい。
CUDAで780Tiで2048*2048cudaスレッドでさらに18倍くらいだった。
0275デフォルトの名無しさん
垢版 |
2014/03/10(月) 17:32:15.14
スレッドの数って
CPUのコア数より多くしても意味ないよね?
0277デフォルトの名無しさん
垢版 |
2014/03/10(月) 18:28:34.27
ひたすら計算し続けるなら意味はない。
計算メインというだけならコア数の倍ぐらいまでは
スループットが上がることはある。
0278デフォルトの名無しさん
垢版 |
2014/03/10(月) 19:11:36.58
書きたいアルゴリズムを自然に書けるという理由で
マルチスレッドに意味があることはある
GUIなんかそうだろうね
0280デフォルトの名無しさん
垢版 |
2014/03/10(月) 19:40:06.12
GUI スレッドと別に好きなスレッドを立ててうまくやっていけるってことだろうに‥‥
win16 の泣きそうな世界を知らないのか?
0282デフォルトの名無しさん
垢版 |
2014/03/10(月) 21:47:19.99
処理内容・数によるけど大量のパラ処理はCPUのマルチコアやNvidiaのGPGPUからAMDのGPGPUでopenCLが定番になってきたからな
そして、今後はAMDのHSAも定番になるって感じになっているし。
0283デフォルトの名無しさん
垢版 |
2014/03/11(火) 17:20:13.24
いつGPGPUが定番になってきたんだ。
むしろまじ使えないってスルーされてる感が半端ない。
0286デフォルトの名無しさん
垢版 |
2014/03/13(木) 20:31:14.10ID:gEHR9Glb
GPGPUは特定の局面に限って言えば使えるんだが、一般の用途では
その特定の局面が存在しないというかわいそうな技術。
0287デフォルトの名無しさん
垢版 |
2014/03/13(木) 20:32:14.41ID:gEHR9Glb
ちなみにbit coinのマイナーはGPGPUから専用設計のASICに
主戦場が移った。消費電力が段違いなんだとさ。
GPUでやったら電気代で赤字になりそうだ。
0288デフォルトの名無しさん
垢版 |
2014/03/13(木) 20:49:30.32ID:/ZWTiswr
>>287
特定用途のみならICにしたほうが良いだろうな。

確かbitcoinでよく使われていたVGAはAMDだったはず。
ゲーム用VGAのGPGPU性能はいまはAMDのほうが良いのかな
0289デフォルトの名無しさん
垢版 |
2014/03/13(木) 21:06:24.71ID:k4ocBl+v
FPGA経由でASICな。

しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw
0290デフォルトの名無しさん
垢版 |
2014/03/13(木) 22:02:39.26ID:gEHR9Glb
で、自販機の下に落ちてる100円玉を地道に拾うぐらいなら
ショベルカーでATMごと盗んじゃえってのがマウントゴックス。
0292デフォルトの名無しさん
垢版 |
2014/03/14(金) 16:35:28.14ID:8t3OXl/v
2年ほど前にbitcoin採掘をしていたが
お前らの想像の千倍くらい時間のかかる処理だったし
今もっと難しくなってるから既に個人で掘るのは無理なんじゃね
0294デフォルトの名無しさん
垢版 |
2014/03/14(金) 17:00:16.55ID:UFFJd6rH
千倍台で分散する
0296デフォルトの名無しさん
垢版 |
2014/03/14(金) 17:57:18.99ID:I0jjMatv
>>295
むちゃくちゃ簡単に言うとBitCoinの正規のビットパターンは計算で求まる、でこれの正しい組み合わせを計算する事を採掘(マイニング)って言うだけの話
0298デフォルトの名無しさん
垢版 |
2014/03/15(土) 00:32:35.88ID:IYjSi/+A
ちょいと相談。

データ処理とファイルI/Oを別スレッドに分けてstackを介してやり取りしてるんだけど、
気がつくとやたらメモリを食ってることがある。
調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。

ファイルの生成の様子なんかを観察してる限りで、2つの原因を想像。
A)処理済みデータをstackに積むのに比べてファイルに書き出す処理が追いついていない
B)stackがバカスカとメモリを確保している

ファイル書き出しのスレッドの内部処理は、共用stackからローカルstackにコピーして、
コピーが終わった時点で共用stack占有状態を開放、ローカルstackを順次書き出すようにしている。

Aは大量にデータを溜めることの無いようにファイル書き出しの頻度を上げる方法について、
Bはメモリを無駄に食わない方法について、アドバイスを聞きたい。

stackを使ったのはqueueに比べて頭が固定な分だけメモリの利用効率が高そうだったことと、
データの順番には意味がないから逆順になっても問題がないことによるものなので、
別のコンテナを使ったほうがいいなら、それでも構わない。
0299デフォルトの名無しさん
垢版 |
2014/03/15(土) 00:45:28.81ID:CF1cuZUb
>>298
そもそも一旦メモリに載せる必要があるのか?非同期IOじゃだめ?
どうしても載せなきゃいけないとして、Aはあまり意味がない。
よほど頭の悪い実装をしてなければ、現状メモリを喰ってるってことは
inputよりoutputの方が遅いってことだ。頻度で解決する問題じゃない。
Bの方は、conditon variableでスタックのサイズが一定より大きくなったら
inputを待たす方法が一番簡単じゃないか。
0300 ◆0uxK91AxII
垢版 |
2014/03/15(土) 01:15:15.11ID:4evGY2gy
>調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。
常識的に考えてバグ持ち。

>コピーが終わった時点で共用stack占有状態を開放、
ふつーstack<void *>。
0303デフォルトの名無しさん
垢版 |
2014/03/15(土) 08:31:05.02ID:xmGMuN0W
リングバッファてメモリが一杯になったらファイルに書き出すように実装するのが普通?
0307デフォルトの名無しさん
垢版 |
2014/03/15(土) 14:07:58.75ID:PqTylRc6
>>305
ふつうは>>301の言うように空くまで書き込みを待たせるか捨てる。
待てないような要件ならサイズ固定のリングバッファじゃなく可変のキューを使うなりする。
0308デフォルトの名無しさん
垢版 |
2014/03/15(土) 14:16:36.02ID:1lWAVkUO
書き出すデータのフォーマットを工夫してサイズを小さくするとか、
書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。
0309デフォルトの名無しさん
垢版 |
2014/03/15(土) 14:17:30.95ID:y0lYdZ+H
>>307
ありがとう、バッファーの構造を別にして最大容量は設定しないといけないということですね

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

あとは演算処理orデータのやり取りのバグを潰せばほぼ完成
(結果の個数が少し足りない)
0320デフォルトの名無しさん
垢版 |
2014/06/13(金) 00:28:43.87ID:cRyKxN+T
共有/排他ができるロックと条件変数があるとき、これらを使って
共有から排他にエスカレーションできるロックを構成することってできる?
0321デフォルトの名無しさん
垢版 |
2014/06/13(金) 01:34:28.10ID:+YSiec3A
ロックとか条件変数って排他するものだよね。共有できるロックって何?
RCUのこと?
0323デフォルトの名無しさん
垢版 |
2014/11/06(木) 22:37:47.07ID:iaZsweTc
マルチスレッドは馬鹿には無理
馬鹿は使ったほうがいいところでマルチスレッドを使わずに
使わないほうがいいところっ使ってややこしくしたりする
0325デフォルトの名無しさん
垢版 |
2014/11/09(日) 01:27:34.76ID:UGYkYxzf
スレッディング・ビルディング・ブロックについて勉強し始めた所なんだけど、どうなの?
理解して使うと安全で早くなりそうだとは思ったが、メモリ処理の効率とかどうなるんかな?
とか思ってる所なんだけど・・・
0327デフォルトの名無しさん
垢版 |
2014/11/09(日) 22:48:01.80ID:wyNvyEnQ
メモリ処理の効率って具体的にどういう点?
mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?
0328デフォルトの名無しさん
垢版 |
2014/11/10(月) 09:36:09.81ID:W8sKwQAR
オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな

>>325
コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ
0329デフォルトの名無しさん
垢版 |
2014/11/12(水) 14:11:39.04ID:nS55KI9v
基礎的な質問で申し訳ないのですが
同じ変数に複数のスレッドがアクセスしてはいけないのはわかりますが
同じコードに複数のスレッドがアクセスするのはいいのでしょうか?
例えば何の変数にもアクセスしない関数を複数のスレッドが同時実行するのはいいのでしょうか?
0331デフォルトの名無しさん
垢版 |
2014/11/12(水) 14:31:27.32ID:nS55KI9v
>>330
今書いているプログラムで
C#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って
0332デフォルトの名無しさん
垢版 |
2014/11/12(水) 14:35:31.55ID:Tjo57cUc
C#のシグナルってよーしらんけど
エラーが出るってことは、質問の内容と違うことやってるんじゃないの
0338デフォルトの名無しさん
垢版 |
2014/11/15(土) 11:02:51.29ID:JwZZHuNb
>>329
同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数とstatic変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ
0339デフォルトの名無しさん
垢版 |
2014/11/16(日) 00:17:15.94ID:lWtIBSfv
同じ変数に複数のスレッドがアクセスするならクリティカルセクションが楽だ
0340デフォルトの名無しさん
垢版 |
2014/11/16(日) 19:55:00.63ID:9ZsvKJox
linuxですがスレッドで同じファイルに書き込む場合、競合することってありますかね?
0343デフォルトの名無しさん
垢版 |
2014/11/16(日) 21:40:57.77ID:Kyr5+wjo
>>339
もう win32 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?
0344デフォルトの名無しさん
垢版 |
2014/11/30(日) 17:47:06.48ID:H8djdLBQ
複数のスレッドがひとつのミューテックスのアンロックを待っていた場合、
つぎにどのスレッドがミューテックスを取得するかはランダムですか
0345デフォルトの名無しさん
垢版 |
2014/11/30(日) 18:09:41.22ID:ddtepLmv
はい
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
0346デフォルトの名無しさん
垢版 |
2014/12/01(月) 00:39:51.39ID:Az7+Eliy
いいえ
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
0347デフォルトの名無しさん
垢版 |
2014/12/08(月) 19:13:20.61ID:PHJZbN+V
スレッドとミューテックスだけ覚えたけど
なにを作ったらいいのかわからんたい
0349デフォルトの名無しさん
垢版 |
2014/12/08(月) 22:57:10.96ID:x3KHTevM
consumerとproducerみたいのがいいんじゃないのかなと思ったけど、
チャット作ることにしたのね
がんばってください
0351350
垢版 |
2014/12/09(火) 00:23:00.21ID:MJarMgeM
>>349
いや、ありがとうございます
0352デフォルトの名無しさん
垢版 |
2015/05/29(金) 22:45:34.32ID:gXnjRwZ6
Win8.1 Cygwin64bit g++のpthreadなんですが、マルチコアCPUなのに性能改善しません。
なにか特別なコンパイルオプションがあるとか
特別なライブラリをリンクしなければいけないとかあるのでしょうか。
-lpthreadはつけてます。
0356デフォルトの名無しさん
垢版 |
2015/06/15(月) 23:17:16.10ID:SZnUF3Ky
DISKへのアクセスって並列にしたって意味ないですか?

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

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

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

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

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

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

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

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

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

C言語で下位1bitしか使わない排他処理が行われてない変数があり、その1bitをif文で判定して処理を2通りに分ける場合、
必ずその2通りのどちらかになることは保証されるよね?
できるだけ高速化したいから、できるだけ排他処理はしたくない。
0384デフォルトの名無しさん
垢版 |
2016/12/09(金) 18:37:52.31ID:R3c5DqP6
>>382
馬鹿が書くと機械的に壊れることもあります
ソレノイドが焼損とか日常茶飯事
0385デフォルトの名無しさん
垢版 |
2016/12/09(金) 21:27:34.75ID:WzSsU1Dc
>>384
どのパーツのソレノイド?
説明してくれ。
パソコンは自作やら修理やらよく頼まれ続けてきてるから専門的な話OKだ。
0386デフォルトの名無しさん
垢版 |
2016/12/10(土) 23:59:30.12ID:mx8/lQPw
すいません質問します。
Matlobで、
例えば5000×5000の行列をAとして
その10×10の区分行列をBとします。
Aの対角線上にあるBだけを取り出して他が0行列の行列を作るにはどうすればいいですか?
また、各Bの対角要素だけ取り出すにはどうすればいいですか?
0387デフォルトの名無しさん
垢版 |
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を代入する
0389デフォルトの名無しさん
垢版 |
2016/12/11(日) 10:53:35.53ID:PFNTM+nw
>>387
ありがとうございます。やってみます。
0391デフォルトの名無しさん
垢版 |
2017/03/29(水) 21:36:43.88ID:QetAZaUg
【OS】OSX 10.8.5、Core i5
【言語】 C, C++
【実行環境】 XCode5.1, pthread

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

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

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

ちゃんと作っていて遅いのなら、キャッシュの競合の可能性があるかも
0394デフォルトの名無しさん
垢版 |
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; }
};
0395デフォルトの名無しさん
垢版 |
2017/04/02(日) 18:29:20.77ID:mBDn/7kD
書き忘れ >>391 のマカーです。
0396デフォルトの名無しさん
垢版 |
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 )
0400デフォルトの名無しさん
垢版 |
2018/05/23(水) 21:43:17.32ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

4DXJZ
0401デフォルトの名無しさん
垢版 |
2018/07/05(木) 00:17:03.60ID:RfoszcD2
Z1B
0402デフォルトの名無しさん
垢版 |
2018/10/28(日) 23:21:28.63ID:bVjvgsxo
>>394
超亀レスだしテキトーだけど、counterがシングルトンなら
countのインクリメントでシリアライズされるんじゃね?
0403デフォルトの名無しさん
垢版 |
2019/01/13(日) 12:43:26.12ID:P4nmFhbL
Intelのハイパースレッドでスケールするか否かのアルゴやデータ構造のパターンとか、評価基準をまとめた本なりサイトなり御存じでしたら教えてください。
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 みたいな例があるから必ずしも昔の技術というわけではないな。
レスを投稿する


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