12/06/15 01:35:25.58 .net
■関連スレ・関連性の高いスレ
ネットワークプログラミング相談室 Port28
スレリンク(tech板)
3:デフォルトの名無しさん
12/06/15 03:59:42.18 .net
>>1 乙
前スレ >>994
並列実行「可能」でも「スケールする」かは知らんぞ。
OpenMP なら !$omp parallel do としてコンパイルオプション /Qopenmp
4:デフォルトの名無しさん
12/06/15 16:15:07.07 .net
>>前すれ995
そういうオプションがあるのですね,レポートと書き直したソースを添付します.
URLリンク(www5.puny.jp)
pass:giko
potential OUTPUT 依存関係
らしいですが,ググってもよくわかりません.依存関係がないように>>前すれ999のようにpureに書き換えたのですが.
>>前すれ997
これは試しにつけてみただけのものです,やはり使い方が違いますか・・.
5:デフォルトの名無しさん
12/06/15 18:14:50.61 .net
gfortran -O3 20120528_fast_pararell_subroutine.f90 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=2
6:デフォルトの名無しさん
12/06/15 18:54:01.14 .net
彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど
どうすればいいかな
7:デフォルトの名無しさん
12/06/15 19:08:46.12 .net
時分割でがんばれ
8:デフォルトの名無しさん
12/06/15 21:41:34.19 .net
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];
9:デフォルトの名無しさん
12/06/16 12:26:31.55 .net
>>4
ループ間で出力変数に依存関係があるかも、という判断。
○ i, j は value 属性を付け、b は戻り値にする。
○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。
ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (1000) で並列化は完了。
10:デフォルトの名無しさん
12/06/16 12:48:12.18 .net
bに依存がないことくらい解析できてもよさそうなのにね
11:デフォルトの名無しさん
12/06/16 16:27:05.54 .net
sho_det呼び出しの2重ループで並列化できるの?
12:デフォルトの名無しさん
12/06/16 16:52:50.21 .net
双子と付き合う時はマルチスレッドのチンポ子が欲しい。
13:デフォルトの名無しさん
12/06/16 16:54:32.86 .net
クリティカルセクションとかミューテクスって重いんですか?
秒間2500回とかマジキチですか?
14:デフォルトの名無しさん
12/06/16 17:00:15.54 .net
400μ秒は今のパソコン環境でも、厳しいんじゃね
何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
15:デフォルトの名無しさん
12/06/16 17:19:32.25 .net
ロックフリー!
16:デフォルトの名無しさん
12/06/16 17:33:56.57 .net
>>13
そのあたりだと、API 呼び出しのオーバーヘッドもバカにならないから
自前で実装したほうがいいんじゃね?
17:デフォルトの名無しさん
12/06/16 21:17:30.95 .net
URLリンク(gist.github.com)
によれば
> Mutex lock/unlock 25 ns
18:デフォルトの名無しさん
12/06/16 22:25:28.46 .net
>>13
重いけどそれくらいならいけると思う
できるならスレッドごとにリソースもって
最後に合体させたほうが速い
19:4
12/06/16 23:07:53.93 .net
申し訳ありません,並列化ですが,解決しました.
/Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました.
ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです.
このループだけ並列化したいっていうような指定ってできるのでしょうか?
20:デフォルトの名無しさん
12/06/16 23:18:15.13 .net
>>17
Mutexってスレッド数によると思うんだけどな。
シングルコアならオンキャッシュで対応できるけど、
マルチコアだったりマルチCPUだったらメモリ参照と大差ないと思う。
21:デフォルトの名無しさん
12/06/17 02:24:44.41 .net
答え教えてもらって、闇雲にやるのが今風なの?
22:デフォルトの名無しさん
12/06/17 02:28:46.34 .net
それって、単純ループがスレッド化されただけじゃねえの?
23:デフォルトの名無しさん
12/06/17 03:56:01.16 .net
実行環境に寄って自動で最適化して欲しいよね。
ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。
4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
24:デフォルトの名無しさん
12/06/17 04:08:44.71 .net
core数増えたから、早くなるってわけでもないでしょうに
25:デフォルトの名無しさん
12/06/17 06:28:14.10 .net
効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS
※ 依存性に目をつぶれという指示ではない
> 64core の対応
3日かかる計算を1時間に押し込みたいなら、やる価値はある。
1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。
そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。
スケールするとかしないとかはそういう話。
26:デフォルトの名無しさん
12/06/17 14:48:00.38 .net
速くなってくれないと高額な多コア買った意味無いんだが。
27:デフォルトの名無しさん
12/06/17 19:02:58.50 .net
それは、プログラム作ったベンダーに言え。
場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
28:デフォルトの名無しさん
12/06/17 20:27:37.75 .net
分散処理できるように考えるほうが難しいのに
道具によってはできることとできないことがあるでしょ
29:デフォルトの名無しさん
12/07/06 19:30:56.61 .net
多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。
そうしないとスケジューリングに費やすコストが無駄だ。
30:デフォルトの名無しさん
12/07/06 19:38:42.21 .net
あまり賢そうに見えないな
31:デフォルトの名無しさん
12/07/06 19:45:56.15 .net
gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。
32:デフォルトの名無しさん
12/07/06 19:58:44.83 .net
標準的な入出力は動くコア決めたほうがいいかもしれんけど
プロセス、スレッドはどのコアで動こうが関係無いような
どうせ、暇な?コアに割り当てられるだろうから
33:デフォルトの名無しさん
12/07/06 20:28:22.95 .net
linuxだとこういう指定が出来るようだ
URLリンク(linuxjm.sourceforge.jp)
34:デフォルトの名無しさん
12/07/06 22:01:45.18 .net
それぐらいは WindowsNT 4.0 からあるが。
SetProcessAffinityMask
URLリンク(msdn.microsoft.com)
35:デフォルトの名無しさん
12/07/06 22:04:26.89 .net
コア数とかうるさい割にapiのことは言わんのね?
36:デフォルトの名無しさん
12/07/21 14:53:22.69 .net
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:デフォルトの名無しさん
12/07/21 14:57:02.99 .net
馬鹿には無理
38:デフォルトの名無しさん
12/07/21 15:18:21.14 .net
>>36
broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
39:デフォルトの名無しさん
12/07/21 15:33:58.32 .net
>>38
素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね
このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には
それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう?
ともかく、ありがとうございました
40:デフォルトの名無しさん
12/07/21 15:42:20.05 .net
>>39
pthreadの粒度が小さい場合、threadの実行順序がぐだぐだになるから要注意。
結論としては、充分長い処理でもない限りcond_waitは使えない。
41:デフォルトの名無しさん
12/07/21 15:49:59.71 .net
>>40
頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・
自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので
素朴なつくりでもそれなりに動いたかもしれませんが、
再現性のないトラブルが発生する前にそういう問題を認識できてよかったです
ありがとうございました
42:デフォルトの名無しさん
12/07/21 16:06:39.87 .net
>>41
去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
43:デフォルトの名無しさん
12/08/25 18:20:47.36 .net
いつでもどんな時にでも
スケジュールから外されても動かされても
大丈夫なように作るのが鉄則
44:デフォルトの名無しさん
12/08/26 08:54:03.71 .net
そうそう。
だから、Web上のサンプルは当てにならない。
45:デフォルトの名無しさん
12/08/26 09:32:08.49 .net
そもそも並列化したいのは高速に処理したいからじゃん?
サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる
まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
46:デフォルトの名無しさん
12/08/26 09:34:18.81 .net
て言うかサンプルってそういうもんだし。
そもそも >>42 が
> mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
> 自分が待たずにロックしちゃうことに。
って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
47:デフォルトの名無しさん
12/08/26 09:57:42.57 .net
マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ
そんなことより、マトがトマるだって・・・・・!喜w
48:デフォルトの名無しさん
12/09/01 15:54:33.37 .net
ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・
素朴なQなんですが、マルチCPUのマシンで、
?ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く
?ひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、
スレッド単体ではなく、それの属するプロセスが渡り歩いているため
こういう理解は正しいですか?
49:デフォルトの名無しさん
12/09/01 15:58:04.54 .net
スレッドの割り当てとかはOSが決めてることだからね
OSの挙動に影響しないようなことを考えながらやりませう
マルチCPUじゃなく
単一CPUの時のスレッド等の挙動を考えてみませう
50:デフォルトの名無しさん
12/09/01 16:04:51.98 .net
同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、
せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
51:デフォルトの名無しさん
12/09/01 16:11:29.80 .net
逝ってるなマルチコアはCPU毎に命令データキャッシュ持ってるでしょ
52:デフォルトの名無しさん
12/09/01 16:12:43.77 .net
でも分岐したらダメなのでは?
53:デフォルトの名無しさん
12/09/01 16:16:42.15 .net
よく考えたら、分岐するんだったらCPU移らなくてもダメだった
ドピュッ
54:デフォルトの名無しさん
12/09/01 16:27:35.25 .net
命令の先読みとかやってるの知ってる?
同じ領域を読み込む場合に早くなるってのがキャッシなのでは?
HDDキャッシュとかも同じでしょ
55:デフォルトの名無しさん
12/09/01 16:29:03.73 .net
別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、
ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある
OSの裁量次第
56:デフォルトの名無しさん
12/09/01 16:32:16.93 .net
キャッシュ知らんでも
スレッド系のプログラム作るのには関係無いような
速度ウンタラは動いてから考えればいい話でしょ
57:デフォルトの名無しさん
12/09/05 01:11:52.99 .net
初心者の質問です
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:デフォルトの名無しさん
12/09/05 04:17:50.83 .net
>>57
先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。
要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。
つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか?
それと、cpにNULLが代入されること自体は問題ないの?
59:デフォルトの名無しさん
12/09/05 06:16:48.24 .net
weak_ptr使えハゲと言うしかないレベル
60:デフォルトの名無しさん
12/09/05 08:13:29.83 .net
weak_ptrってboost?
マルチスレッドを考慮されていたの?
61:デフォルトの名無しさん
12/09/09 01:13:55.50 .net
>>58
volatileしておけば、
まあいいんじゃない
sleep で待つのは効率はよくなさそうだけど
62:デフォルトの名無しさん
12/09/09 01:44:44.97 .net
volatile使ったとしてもコンパイラによっては安全だとは言えないんだよ
63:デフォルトの名無しさん
12/09/09 01:51:51.18 .net
安全って、思いたい理由の方に興味があるんだけど
64:デフォルトの名無しさん
12/09/09 07:41:49.96 .net
むしろ安全だといえるコンパイラを知りたい
65:デフォルトの名無しさん
12/09/09 14:24:32.10 .net
volatile使っても結果変わらない事の方が多い気がする
66:デフォルトの名無しさん
12/09/09 15:54:34.19 .net
そりゃそうだ
67:デフォルトの名無しさん
12/09/09 16:30:00.96 .net
安全だと思うと、コンピュータがそれを理解して動いてくれると思いたいのかな
68:デフォルトの名無しさん
12/09/12 00:03:54.96 .net
volatileしてダメだったケースに遭遇したことないなあ。
まあboolでの同期・排他は簡単なケースにしか使ってなくて、
まじめなのはcritical sectionとかmutexで排他・同期するから
気がついてないだけかもしれないけど。
69:デフォルトの名無しさん
12/09/12 07:22:51.47 .net
>>57
>// スレッドA
>while( blReference ){ Sleep(1); } // 1
>blDeleting= true; // 3
>// スレッドB
>while( blDeleting ){ Sleep(1); } // 2
>blReference = true; // 4
スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。
70:デフォルトの名無しさん
12/09/22 01:53:58.20 .net
>>69
InterlockedExchangePointerは?
71:デフォルトの名無しさん
12/09/29 20:38:32.52 .net
質問ですが、Windows APIのSetEvent()やWaitForSingleObject()って、
内部で適切にメモリバリアを行うことが保証されていますか?
例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長?
(メインスレッド側)
bTerminate = true; // volatile bool型
_WriteBarrier();
SetEvent(hEvent); // スレッドを起床させる
(ワーカースレッド側)
WaitForSingleObject(hEvent); // 起床されるまで待つ
_ReadBarrier();
if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理
72:デフォルトの名無しさん
12/09/29 20:49:37.13 .net
も一個、volatile bool a, b; があるとして、
a = c;
b = d;
の代入順序は、a, bがたとえatomicな型でvolatileだからといって
プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、
よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は
メモリバリアが 必 須 、
という理解で合っていますか
73:デフォルトの名無しさん
12/09/29 21:08:56.80 .net
>>71
URLリンク(msdn.microsoft.com)
> 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:デフォルトの名無しさん
12/09/30 00:03:39.72 .net
>>64
javacやcscじゃね
75:デフォルトの名無しさん
12/09/30 00:12:53.41 .net
メモリバリアってのはgcc特有の表現で
atomicな処理とは関係ないんだけど
76:デフォルトの名無しさん
12/09/30 00:30:58.05 .net
>>73
?クス
SetEvent()は2番目(・Functions that signal synchronization objects)、
WaitForSingleObject()は3番目(・Wait functions)ってことでおkそうですね
>>75
メモリバリアはアウトオブオーダー実行するアーキテクチャに共通する概念であってGCC固有というわけではないですにょ
とかいろいろあるが説明がマンドクセ、
77:デフォルトの名無しさん
12/09/30 00:56:39.75 .net
ただの最適化抑止のおまじないみたいなもんだよ
78:デフォルトの名無しさん
12/09/30 01:05:56.81 .net
>>77
ちょっそれvolatileの方wwwww
まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
79:デフォルトの名無しさん
12/09/30 01:13:58.15 .net
マルチコア時代の並列プログラミング
ロックとメモリオーダリング
URLリンク(www.nminoru.jp)
80:デフォルトの名無しさん
12/09/30 01:14:33.03 .net
gccのvolatileってのは、ちょっと特殊なんだよ
81:デフォルトの名無しさん
12/09/30 01:21:19.22 .net
>>77,78
真相はもっと複雑怪奇だったりする
URLリンク(yamasa.hatenablog.jp)
URLリンク(msdn.microsoft.com)
つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
82:デフォルトの名無しさん
12/09/30 01:26:29.84 .net
ここらへんの話は
・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛
・volatileによって明示的に最適化が抑制
・システムコール内でメモリバリアの面倒をみてくれる
・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる
といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので
コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
83:デフォルトの名無しさん
12/09/30 01:27:48.80 .net
アトミック変数とか作って、ド素人に誤解釈されたらどうすんだろ、この人
84:デフォルトの名無しさん
12/09/30 02:22:23.12 .net
>>81
> つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
そこで面倒を見てくれるのは「release/aquireメモリバリアとしてのみ」であることに注意。
URLリンク(yamasa.hatenablog.jp)
こっちのSequential consistencyの性質は、VC++2005以降のvolatileでも持っていない。
85:デフォルトの名無しさん
12/09/30 13:33:02.65 .net
>>83
ドシロウトがなんでスレッド使った開発に加わるんだよ
86:デフォルトの名無しさん
12/09/30 13:35:58.01 .net
なんで排他の話ばっか出てくるんだ。
スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。
それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
87:デフォルトの名無しさん
12/09/30 14:26:20.27 .net
>>86
>なんで排他の話ばっか出てくるんだ。
マルチスレッドで問題になるところと言うか、排他を最近覚えた奴が
使いたくてしょうがないんだろ。
88:デフォルトの名無しさん
12/09/30 15:13:14.28 .net
>>86
スレッドの実装が違うだろう、LinuxとUNIXなら同じだが
89:デフォルトの名無しさん
12/09/30 15:25:27.37 .net
>>85
じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?
90:デフォルトの名無しさん
12/09/30 16:54:17.48 .net
>>88
boostとか抽象化レイヤー用意すればできるだろ。
しかし、仕様の安定したスレッドキューがない。
もう、自作スレッドキューを保守するのは嫌だお
91:デフォルトの名無しさん
12/09/30 17:01:09.98 .net
>>90
皮かぶせりゃいいだろうけど、
そこまでして、
そこまでしても
92:デフォルトの名無しさん
12/09/30 21:04:28.14 .net
おまえら何回C++におけるatomicとvolatileの話を繰り返せば気がすむの
93:デフォルトの名無しさん
12/09/30 21:20:03.98 .net
それしかネタがないからさ
94:デフォルトの名無しさん
12/09/30 22:09:45.89 .net
>>92
スレッドキューの話しだせ
95:デフォルトの名無しさん
12/09/30 23:24:16.01 .net
だって手法なんて先駆者が出し尽くしただろ
96:デフォルトの名無しさん
12/09/30 23:53:26.29 .net
スレッドキューって何だ?
スレッドセーフなキューってことか?
それともGCDみたいなタスクキューのことか?
97:デフォルトの名無しさん
12/10/01 00:06:38.53 .net
タスクキューのことだよ。
てかスレッドセーフなキューってなんだよ。それだったら
別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
98:デフォルトの名無しさん
12/10/01 07:53:47.16 .net
java.util.concurrent.BlockingQueueのことだろ
99:デフォルトの名無しさん
12/10/12 23:18:24.02 .net
同期処理を間違いなく設計するための、何か良い手法やツールはないですかね?
ペーペーのビギナーだというのもあるのですが、
複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、
waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、
そのデバッグで無駄に体力を消耗しています
100:デフォルトの名無しさん
12/10/13 11:18:48.75 .net
馬鹿には無理
101:デフォルトの名無しさん
12/10/13 13:05:32.66 .net
>>99
排他処理、スレッドモデルと実装を勉強すれば
ビギナーには無理と思うが
102:デフォルトの名無しさん
12/10/13 18:57:49.84 .net
>>99
もうそこは、共有している資源と mutex の一覧表作って、地道に設計してレビューで
確認するしかない。
imagix とか確認を支援するツールはあるけど。
103:デフォルトの名無しさん
12/10/13 22:12:39.46 .net
>>101
やんないと、他に仕事ないんで・・・・
>>102
かなり頭がよくないと、サラリと正しいコード書けないですよね(棋士的な意味の頭のよさ)
そうか、地道にやるしかないのか(´・ω・`)
・・・売り物なんですねimagix
自分の担当業務以外にも使えそうなので、ちょっとチーム内に紹介してみます
とりあえず、今の自分のレベルでミスりやすいところを正しく実装するための比喩をいくつか考案中です
↓
例1
スレッド間同期は、キャッチボール
ボールを受け取る側は、しゃがんでいないとボールをキャッチできない
例2
スレッド再開時の手順は、競馬のスタートと同じ
?ゲートを閉じる(送信側mutexロック)
?馬がゲート前に並ぶ(受信側wait)
?ファンファーレが鳴る(signal)
?ゲートが開く(送信側mutex開放)
104:デフォルトの名無しさん
12/10/13 23:51:02.32 .net
mutexなんか使わずfuture、promisで凌げ
105:デフォルトの名無しさん
12/10/14 17:05:55.79 .net
>>103
転職したほうがよくね
ハロワ通いでもしてみたら
106:デフォルトの名無しさん
12/10/14 18:33:06.95 .net
まず10年間C++を勉強しろ
107:デフォルトの名無しさん
12/10/14 20:43:53.62 .net
>>106
C++関係ないやん
108:デフォルトの名無しさん
12/10/15 01:03:58.39 .net
>>103
比喩を作ることができるならすでに理解できてるんじゃないの?ってことで、
結局比喩は不要だよねって流れにならないのかな。
109:デフォルトの名無しさん
12/10/15 09:17:51.40 .net
結局無理てことか、初心者というより基本が
110:デフォルトの名無しさん
12/10/21 14:23:48.88 .net
>>103
とにかくソースコードをきれいに書け
そうすれば、ソースコードが間違いを教えてくれる
111:デフォルトの名無しさん
12/10/21 14:42:59.60 .net
>>110
> そうすれば、ソースコードが間違いを教えてくれる
おっ、なんか響きがいい言葉だな。
112:デフォルトの名無しさん
12/10/21 23:06:50.68 .net
Joel on softwareの和訳ページ『間違ったコードは間違って見えるようにする』
を紹介しようと思ったが今ちょっと繋がらないようなので原文で読んでちょ↓↓↓
URLリンク(www.joelonsoftware.com)
113:デフォルトの名無しさん
12/10/26 20:45:55.33 .net
教えてください
g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の
効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?
114:デフォルトの名無しさん
12/10/28 11:59:56.78 .net
gdb
115:デフォルトの名無しさん
12/10/28 21:28:29.42 .net
マ
ジ ハ ,,ハ
デ (;゚◇゚)z
!?
116:デフォルトの名無しさん
12/12/05 09:54:15.94 .net
プロファイラでわかるのはどの部分が処理時間の何%を使ってるか
ぐらいであって、スレッドの動作効率なんていう個人の価値観みたい
なものは測定できんだろ。
117:デフォルトの名無しさん
12/12/31 15:20:38.31 .net
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:デフォルトの名無しさん
12/12/31 16:48:21.02 .net
あります
119:デフォルトの名無しさん
12/12/31 19:09:35.15 .net
>>118
どういった理由でしょうか?
URLリンク(www.albahari.com)
>The following implicitly generate full fences:
>Setting and waiting on a signaling construct
という記述を見つけたのですが、これによれば
valへの書き込みをinit.Set()より後に、valからの読み込みをinit.Wait()より前に
という事は行われないように思えるのですが。
120:デフォルトの名無しさん
13/01/01 04:47:40.84 .net
判ってるのに質問するなボケが
121:デフォルトの名無しさん
13/01/01 12:37:44.23 .net
それを否定されたから理由を聞いてるんじゃないのか
122:デフォルトの名無しさん
13/01/04 04:09:28.62 .net
C#が自ら自身の仕様を質問すること自体が。
まぁ、人間だって自身についてどれだけ知っているか怪しいもんだが。
123:デフォルトの名無しさん
13/01/05 12:19:18.18 .net
>>96
の発言で思い出した。
GCDといえば、最近WindowsとLinuxにも移植されたっぽいんだよね。
URLリンク(opensource.mlba-team.de)
pThreadとかWin32スレッドをローレベルで使うよりお手軽な気がする。
ちょっと試してみるわ。
124:デフォルトの名無しさん
13/01/05 18:17:06.97 .net
123だけど、
XDispatchだが、Windowsであっけなく使えた。
こりゃいいぜ。Win、Mac、Linuxで同一ソースでGrand Central Dispatchが使える。
マルチスレッドプログラミング新時代到来って感じだw
125:デフォルトの名無しさん
13/01/08 19:15:30.57 .net
XDispatchの導入記事を書いてみた。
URLリンク(docs.google.com)
突っ込みどころあったらご指摘よろ。
126:デフォルトの名無しさん
13/01/08 20:13:02.13 .net
libdispatch + α、って感じなのか
127:デフォルトの名無しさん
13/01/09 01:22:43.52 .net
>>126
そうみたい。
基本的にはマルチプラットフォームでやりたい場合は${ ~ }の記法とautoを使えばオッケー。
他にも標準のlibdispathには無い機能とか、Qtユーザー向けのQtDispatchとかあるみたいだけど、そこまではまだ調べられてない。
時間があったらもっと調べてみて、追記してみるよ。
128:デフォルトの名無しさん
13/01/30 19:59:09.23 .net
Win32でのプロセス間リソース共有の仕方で悩んでます
1. ポーリング=Mutexで保護された共有リソースの変更を常に監視
2. サーバー(orクライアント)スレッドでEvent監視+Mutexで共有リソースを保護
余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
(定性的な評価=プロファイルで調べろは無しでお願いします)
自分は「重さ:Mutex>>>>Event>>>>>>>CriticalSection」というイメージがあるので、
2のマルチスレッドのコンテキストスイッチの重さを考慮しても1の方が重いのではないかと考えています
129:デフォルトの名無しさん
13/01/30 20:42:56.62 .net
(゚Д゚)ハァ?
Mutexを奪い合えばいいだけだし。
130:デフォルトの名無しさん
13/01/30 21:22:17.63 .net
Event vs. Pollingは宗教戦争
131:デフォルトの名無しさん
13/01/30 21:52:45.99 .net
何もすることがなきゃ寝て待ってればいいだけ
何かしたけりゃイベント来るまでしてればよかろう
132:デフォルトの名無しさん
13/01/31 08:42:39.84 .net
Mutexが重いんじゃなくてポーリングが重いんだろ
イベントやメッセージ等の非同期通知が使えるなら、そっちのほうが軽いのは当然
133:デフォルトの名無しさん
13/01/31 22:24:51.03 .net
>>128
> Win32でのプロセス間リソース共有の仕方で悩んでます
winすれで聞いたら
> 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?
134:デフォルトの名無しさん
13/02/01 07:29:56.93 .net
効率を気にする香具師が2chで質問するとかもうね
135:デフォルトの名無しさん
13/02/17 17:37:32.78 .net
>>79ではx86、x64では(P6)
RAR WAR WAW RAW
× × × × ... × 順序の逆転が起きる WAR ... Write after Read (書いてから読む)
となってるけど>>81のMSDNでは WAR のみ逆転が起こる、書いてる。
RAR WAR WAW RAW
○ × ○ ○
どっちが正しいのでしょうか?
あと、MSDNの英語の原文はこっちだけど
URLリンク(msdn.microsoft.com)(v=vs.85).aspx
Reads moving ahead of writes の訳が
「読み取りを書き込みの先に移動する」
「書き込みの前に読み取りを移動」
と2回出てきて紛らわしい。
write
...
read
この順番が逆になることあり、てことだよね?
136:デフォルトの名無しさん
13/02/17 21:17:44.97 .net
>>135 それ RAW じゃね
シングルスレッドのメモリ命令は RAW (対象アドレスが被らない) と
WAW (命令による) の特定ケースを除いて命令順通り、
マルチスレッドの各スレッド間では、全パターンに入れ替えの可能性あり。
たぶん MSDN の記載は誤解を招くかと。
こちらの根拠は以下の Volume 3A, Chapter 8.2
Intel 64 and IA-32 Architectures Software Developer's Manuals
URLリンク(www.intel.com)
write -> 0x1000
...
read -> 0x2000
と明らかに異なる場所へのアクセスであり、... の間に他のメモリアクセスが
無ければ、read を write の前に持ってきても結果は変わらないはず。
137:デフォルトの名無しさん
13/02/18 21:54:23.31 .net
>>135
WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。
でいいかと。
138:137
13/02/18 22:30:08.38 .net
>>137の補足しとくと、同一プロセッサでも異なるアドレスだとリオーダ可能なので
順序が重要な場合はメモリフェンスが必要になる。
別のプロセッサ間でもリオーダ可能ということになる。
別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。
139:デフォルトの名無しさん
13/02/18 23:53:52.86 .net
>>135
MSDNのほうが正しい。
昔はIntelのdeveloper manualの記述が曖昧だったこともあり、
間違った解説が結構ある。
>>136-138
マルチスレッドでもRAW以外は入れ替わらないよ。
140:デフォルトの名無しさん
13/02/19 07:57:34.41 .net
>>139
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
141:デフォルトの名無しさん
13/02/19 09:15:14.16 .net
lockプリフィックス使うんじゃあ
142:デフォルトの名無しさん
13/02/23 20:04:20.23 .net
>>139
そうか、マルチスレッドでもリオーダは無いな。他から割り込まれる可能性があるだけだ。
143:135
13/02/23 23:41:17.41 .net
>>136-142さん、さんくすでした。
MDSNが正しかったのですか。
> それ RAW じゃね
でした。コードの順番と英語表記は逆になるんですよね。誤解してました・・・。
この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。
144:デフォルトの名無しさん
13/02/24 10:17:55.94 .net
ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。
CPU内の順序はOut of Orderが関係していて、CPUは可能な限り速く実行しようとするから
順番が入れ替わってしまうってことで、それをコントロールするのにメモリバリア命令がある。
アセンブラの最適化にも関係してるから、プロセッサの最適化マニュアルとかも参考になるかも。
マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。
他のプロセッサに割り込まれて困る部分にはlockで保護するとか。
145:デフォルトの名無しさん
13/02/26 14:50:30.35 .net
Java の資料だけど「コンパイラ開発者のためのJSR133クックブック」ってのはどう?
146:デフォルトの名無しさん
13/02/27 12:54:04.48 .net
>>145
邦訳版はダメ。
肝心のアーキテクチャ毎の表などが古いままで間違っている。
147:デフォルトの名無しさん
13/02/27 23:21:29.29 .net
RafterWってシングルスレッドなら絶対安全?
途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと?
実行cpuが変わることあるかしらないけど
まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
148:デフォルトの名無しさん
13/03/02 16:47:32.29 .net
>>147
> まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
普通に入れ替わるだろ。
切替前に読み込んだ情報は、違う CPU でもちゃんと復帰するから
問題ないはず。
149:デフォルトの名無しさん
13/03/03 20:26:49.52 .net
>>148
書き方が悪かった。
マルチプロセッサの環境でシングルスレッドのコードを実行してて、
実行CPUが変わったとしても読み書き順が入れ替わらないでしょう?
そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
150:デフォルトの名無しさん
13/03/03 20:30:18.24 .net
>>149
ああそういうことか、それは大丈夫だと思うよ。
151: ◆0uxK91AxII
13/03/03 22:58:29.83 .net
バーリアー!平気だもーん!
152:デフォルトの名無しさん
13/03/04 01:43:54.42 .net
MemoryBarrier()の実装ってx86では単なるxchgなのな。
なんでmfence使ってないのだろう?速度では大差ないってことなのかな。
MemoryBarrier macro (Windows)
URLリンク(msdn.microsoft.com)
↓はC++11のスレッドライブラリ作った作者の本らしいんだが、pdfで全部公開されてる。
ありがたいのでだけどメモリフェンスは std::memory_order_acquire みたいな一般命令で
隠すようなコードしか書いてない。
C++ Concurrency in Action: Practical Multithreading
URLリンク(www.amazon.co.jp)
153:デフォルトの名無しさん
13/03/04 09:03:05.32 .net
マルチコアでないマルチプロセッサ構成で、
外部キャッシュや主記憶のシステムコントローラが、
CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。
Windowsではこうゆうハードウェア構成は想定してないはず。
154:デフォルトの名無しさん
13/03/04 10:40:54.32 .net
>>153
違うよ。全然違うよ。
とりあえず、これでもじっくり読め。
msdn.microsoft.com/ja-jp/magazine/jj883956.aspx
155:デフォルトの名無しさん
13/03/04 11:45:37.38 .net
ところでmfenceは何でSSE2の制御命令に分類されてるの?
156:デフォルトの名無しさん
13/03/04 23:37:29.77 .net
>>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
157:デフォルトの名無しさん
13/03/11 14:35:12.41 .net
>>155
xFENCE命令はMOVNTPS, MOVNTPD,などのNon Temporal転送命令向けの機能で、
この系統の命令だけx86のメモリモデルに従わないので専用のFENCE命令が必要となった。
このうちLFENCEとMFENCEは普通のx86命令にも効果があるが、
パフォーマンスがxchgに劣る。
158:デフォルトの名無しさん
13/03/11 15:38:43.70 .net
なんでxchgがバリアとして使えるの?
159:デフォルトの名無しさん
13/03/11 17:50:17.45 .net
メモリに対するxchgは自動的にlockを伴う
160:片山博文MZパンク ◆0lBZNi.Q7evd
13/06/18 23:59:01.86 .net
確率的にいつ終わるかわからない時間の掛かる処理をマルチスレッドを使って複数同時に
実行させると、シングルスレッドよりも早い時間で終わる確率が高くなると思うが、これについて貴様らはどう思う?
161:片山博文MZパンク ◆0lBZNi.Q7evd
13/06/19 00:04:03.77 .net
ちなみにクロスワード自動作成ソフトを作ってますっ
162:デフォルトの名無しさん
13/06/19 01:02:30.98 .net
辞書ひく時間が糞長いから、マルチスレッドやっても大して変わらない
163:デフォルトの名無しさん
13/06/19 06:32:32.99 .net
>クロスワード自動作成ソフト
どこらへんを並列化できるのん?
164:デフォルトの名無しさん
13/06/19 09:30:45.19 .net
バックトラック乱れ打ちじゃねーの
165:デフォルトの名無しさん
13/06/20 07:49:26.95 .net
同じレスを各板に乱れ撃ちする作業だろ?
166:デフォルトの名無しさん
13/06/20 15:25:09.57 .net
マルチスレッドにしたら58時間に1回エラーが出るようになった。でもデバックできないよorz
167:デフォルトの名無しさん
13/06/20 20:17:10.50 .net
つログ
168:デフォルトの名無しさん
13/06/20 22:19:34.34 .net
同期もわかってないのにマルチスレッドにするからだ。
169:デフォルトの名無しさん
13/06/20 22:26:19.30 .net
同期とったら並列の意味がなくなりそうでためらうときがあるな
待ち合わせキューにするくらいなら順番に処理した方がましな気がする
170:デフォルトの名無しさん
13/06/21 00:07:54.88 .net
つスーパースカラー
171:デフォルトの名無しさん
13/06/21 00:28:22.79 .net
粒度変えりゃいいじゃん
172:デフォルトの名無しさん
13/06/21 04:34:35.98 .net
マルチスレッドって自作できるんですか?
以前nyの書籍を読んだときに、開発者の人がマルチスレッドを自作したと書いてたような気がするのですが
C言語でも自作できるんですか?
173:デフォルトの名無しさん
13/06/21 04:48:19.55 .net
マルチスレッド・マルチタスクで動いているように見せることは出来る。
並列動作させたい複数の処理を細切れにしてちょっとづつ実行して
グルグル回す。
174:デフォルトの名無しさん
13/06/21 15:03:05.45 .net
>>173
タイムシェアリングみたいにやるってことですか
175:デフォルトの名無しさん
13/06/21 19:27:29.84 .net
>>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:デフォルトの名無しさん
13/06/21 19:38:33.60 .net
スレち
177:デフォルトの名無しさん
13/06/21 19:52:56.34 .net
スレチというほどじゃないんじゃない?
OSレベルでスレッドのサポートが無い場合は、
言語ランタイムレベルのグリーンスレッド
タイマー等の割り込みの利用
メッセージポンプのループ利用
NT Fiber
スレッドはないけどプロセスのマルチが出来るなら、
パイプなどでプロセス間通信の利用
といったところかな
178:デフォルトの名無しさん
13/06/21 20:25:17.31 .net
俺もスレチじゃないと思う
179:デフォルトの名無しさん
13/06/21 20:31:18.12 .net
windows 3.1 を思い出すな
180:デフォルトの名無しさん
13/06/21 20:41:54.83 .net
ファイバーってレアすぎ
181:デフォルトの名無しさん
13/06/21 22:30:00.37 .net
>>175
win31 のことね
182:デフォルトの名無しさん
13/06/21 22:38:33.58 .net
気が早いな
まだ8だぞ
183:デフォルトの名無しさん
13/06/21 23:18:56.88 .net
2000があるのに…
>>175をタイムシェアリングだと思ってたな。もう少し勉強しよう。
184:デフォルトの名無しさん
13/06/21 23:38:19.83 .net
ファイアー少なくてレアすぎ
185:デフォルトの名無しさん
13/06/21 23:40:35.43 .net
広義だと含むのとちゃうかな
おさん的にはTSS(TSO)のホスト端末を思い浮かべるけど
186:デフォルトの名無しさん
13/06/23 12:58:55.01 .net
ファイバー使ってみたけど、
フェーズとswitchより
シンプルに書けたよ。
187:デフォルトの名無しさん
13/11/22 08:18:08.42 .net
C/C++ で勉強したいのですが、おすすめの書籍などありますか?
もしくは一から学べるようなWebページがあれば教えてください
188:デフォルトの名無しさん
13/11/22 09:05:54.07 .net
D の方が良いよ
189:デフォルトの名無しさん
13/11/22 13:04:58.77 .net
猫でもわかる
190:デフォルトの名無しさん
13/11/23 05:39:10.02 .net
>>188
D のほうが書きやすい?触れたことないのでわからんです
>>189
猫でもわかる は、Web版が俺にはちょっと分かりづらかった記憶が
書籍だとそうでもないのかな
C++のBoostを利用したThreadプログラミングの解説ページがあったので今はそれ見てます
191:デフォルトの名無しさん
13/11/23 09:00:39.63 .net
>>190
触ってもいいお
192:デフォルトの名無しさん
13/11/23 13:19:59.45 .net
>>191
どれどれ
193:デフォルトの名無しさん
13/11/23 13:24:53.59 .net
>>191
ペロペロ
194:デフォルトの名無しさん
14/02/23 09:00:04.29 .net
マルチスレッドって自力だとどうやって書くの?
195:デフォルトの名無しさん
14/02/23 09:43:27.54 .net
pthread_create()
196:KUSO KOTE ◆unko./w.Osri
14/02/23 10:15:16.84 .net
>>194
std::thread th{
[]{std::this_thread::sleep_for(std::chrono::milliseconds(3000));}
};
std::printf("うんこ\n");
th.join();
197:デフォルトの名無しさん
14/02/24 17:57:18.01 .net
例の金子がny作るときにマルチスレッドは自作したんじゃなかったっけ?
198:デフォルトの名無しさん
14/02/24 18:45:47.70 .net
なんとかしてこれを読むと良い
URLリンク(ci.nii.ac.jp)
199:デフォルトの名無しさん
14/02/25 00:18:34.64 .net
>>197
あれ、シングルスレッドだよ。
Windows3.1みたいな方法で複数のタスク回してる。
200:デフォルトの名無しさん
14/02/25 06:43:17.74 .net
小学生がBASICで弾の連射実装してるレベルだろ。
201:デフォルトの名無しさん
14/02/25 12:01:20.77 .net
グリーンスレッドとは違うの?
202:デフォルトの名無しさん
14/02/25 17:16:14.73 .net
グリーンスレッドなんて初耳。wikip見たらなんかトンデモな説明なんだが。
これは誰が言い出したんだ? バズワードくさい。
203:デフォルトの名無しさん
14/02/25 17:27:19.90 .net
レッドスレッド、ブルースレッドはあるのでしょうか?
204:デフォルトの名無しさん
14/02/25 17:28:25.61 .net
OSが関与しないスレッドの実装のこと。ウィキペディアの記述がタコってるのはいつものこと。
基本的な理屈はそう難しくないけど、実際にはreadとかでどれかのスレッドがプロセスごと
ブロックされると、他に走りたいスレッドが居ても走れなくなっちゃうので、そのへんを
どう手当てするかがカギ(そういった所だけOSが支援するとか、ブロックする可能性がある
システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。
205:デフォルトの名無しさん
14/02/25 17:33:10.94 .net
よく分らんな。スレッドってそもそもOSが定義したものだろう。
アプリ側がたかが永続性のあるサブルーチン程度のものを
勝手にグリーンススレッドって呼んでるだけじゃないのか?
まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。
206:デフォルトの名無しさん
14/02/25 18:01:22.88 .net
ユーザースレッド、ユーザ空間でか、なるほど
カーネルスレッド、カーネル空間でか、なるほど
グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん。それこそ>>203
207:デフォルトの名無しさん
14/02/25 18:14:03.00 .net
URLリンク(dl.acm.org)
↑これが「小学生がBASICで弾の連射実装してるレベルの話」に見えるのか。
さぞかしスーパープログラマ(笑)様なんだろうな。
208:デフォルトの名無しさん
14/02/25 18:19:01.04 .net
その例え話しとその提示したのと繋がりそしてなんでその皮肉になるのか、200文字以内で説明しなさい
209:デフォルトの名無しさん
14/02/25 18:49:55.40 .net
wikipediaのスレッドの項目の所まで加筆してやがるww
バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
そんなのスレッドと何の関係もないのにスレッド言うなや。
210:デフォルトの名無しさん
14/02/25 19:49:47.38 .net
結局、逆の意味でのウィキペディア馬鹿か。
一人で言ってろw
211:デフォルトの名無しさん
14/02/26 05:28:26.83 .net
グリーンCPU。
グリーンプロセス。
グリーンヒープメモリ。
グリーンスタックメモリ。
グリーン仮想メモリ。
グリーン物理メモリ。
グリーンマルチタスク。
グリーンネットワーク。
グリーンアップル。
おれもいっぱい考えました。
212:デフォルトの名無しさん
14/02/26 08:36:42.11 .net
グリーンPC
グリーンディスプレイ
が抜けている
213:デフォルトの名無しさん
14/02/26 08:51:32.57 .net
ソイレント
214:デフォルトの名無しさん
14/02/26 13:23:35.72 .net
MZ-80Kの話をしてるのかと思ったぜ
215:デフォルトの名無しさん
14/02/26 14:34:56.07 .net
>>214
そりゃMZ80Cだ!
MZ80Kはモノクロだ!
216:デフォルトの名無しさん
14/02/26 17:24:33.12 .net
> ユーザースレッド、ユーザ空間でか、なるほど
> カーネルスレッド、カーネル空間でか、なるほど
> グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん
ユーザースレッドとカーネルスレッドという言葉はそれぞれ、
M:Nスレッドモデルとかの議論で、カーネル空間のコードの実行におけるスレッドと、
ユーザー空間のコードの実行におけるスレッド、という意味で使われる。
グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
スレッドAPIの実装を指す。
以上のことが何も理解できないバカには、なにもかもがバズワードに見える。
217:デフォルトの名無しさん
14/02/26 17:25:22.57 .net
バカですがなにか?
218:デフォルトの名無しさん
14/02/26 17:49:55.02 .net
命名の由来のことなのに、Wikipediaから意訳したようなのを偉そうにのたまう、他人を馬鹿呼ばわりする自称天才様w
天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw
219:デフォルトの名無しさん
14/02/26 18:13:53.06 .net
> バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
>
> そんなのスレッドと何の関係もないのにスレッド言うなや。
この威勢はどこ行ったのかなぁw
220:デフォルトの名無しさん
14/02/26 18:31:45.02 .net
>グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
>スレッドAPIの実装を指す。
ハナからスレッドの定義に当てはまらないのにスレッド言われもなぁ。
WEB2.0と変わらんレベルの造語。
どうせまたジョブスオタクの低脳営業SEが言い出したんだろう。
221:デフォルトの名無しさん
14/02/26 18:36:03.83 .net
スレッドの定義ってなんだ?
222:デフォルトの名無しさん
14/02/26 18:38:20.17 .net
コイツの脳内ではシステムコールで実装されたものだけがスレッド、という定義なんだろう。
聞くだけ無駄だよ。
223:デフォルトの名無しさん
14/02/26 18:43:07.52 .net
>>221
OSが管理する最小の実行スタック。
224:デフォルトの名無しさん
14/02/26 18:44:25.59 .net
>>222
ではキミのスレッドの定義は?
225:デフォルトの名無しさん
14/02/26 19:01:36.43 .net
222じゃないけど、スレッドっていうのはプログラムを実行する最小単位のことでいいんじゃないかな
OSが管理しているかどうかは問わない
スレッドっていう概念が実装されてるプログラミング言語が多いと思うんだけど、
この場合のスレッドはOS上の実装とは切り離されてるんだよね
例えばJavaのThreadクラスとか
OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で
抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?
226:デフォルトの名無しさん
14/02/26 19:17:09.57 .net
実行スタックってなんだ、って思ったらウィキペディア(英語版含む)でそんな表現を使ってるのか。
一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。
227:デフォルトの名無しさん
14/02/26 20:45:20.03 .net
>>225
そんなトンデモ言われてるも議論する気にもならん。
じゃあ、関数もスレッドなんですね。
もうアホかと。しかもJavaのとかふざけてるとしか。
228:デフォルトの名無しさん
14/02/26 21:45:14.58 .net
ワロタw
229:デフォルトの名無しさん
14/02/26 21:46:50.48 .net
中途半端に脳内完結してるんだろな
230:デフォルトの名無しさん
14/02/26 21:49:16.49 .net
グリーンスレッド言ってた >>222 が定義を言わず逃げちゃった。
グリーンラナウェイ。
231:デフォルトの名無しさん
14/02/26 22:31:24.56 .net
ファイバー、タスク、ユーザーレベルスレッドと呼ばれ方はあるが
スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ
OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ
もしやOSを書いたことも言語処理系を書いたこともないのか?
232:デフォルトの名無しさん
14/02/26 22:43:21.83 .net
意味負
233:デフォルトの名無しさん
14/02/27 06:36:49.81 .net
>>227
JavaのThreadクラスの何処がふざけてるんだ?
234:デフォルトの名無しさん
14/02/27 07:43:24.03 .net
>>231
さっさとおまえの定義を言えよ、低脳。
235:デフォルトの名無しさん
14/02/27 07:47:45.64 .net
もはや人格攻撃しかできないモードに縮退したか。
236:デフォルトの名無しさん
14/02/27 07:49:46.46 .net
POSIXのスレッドAPIを実装したものがスレッド、という定義でいいだろ。
237:デフォルトの名無しさん
14/02/27 07:54:15.34 .net
トンデモグリーンスレッド連呼してたのにそのスレッドの定義聞いたら答えないで
逃げ回ってるんだからもはや人格の問題でしかない。
クズである。
238:デフォルトの名無しさん
14/02/27 08:07:04.32 .net
おまえが自分の定義と違うものに聞く耳を持たないクズってだけじゃないか。
自分がクズだろ。
239:デフォルトの名無しさん
14/02/27 08:56:57.51 .net
>>237
自己紹介乙、でどうでしょう
240:デフォルトの名無しさん
14/02/27 09:11:19.33 .net
>>238
その定義ってどれ?w いいかげにんしろよ、クズ。
241:デフォルトの名無しさん
14/02/27 10:03:13.14 .net
いい加減スレチ
242:デフォルトの名無しさん
14/02/27 12:12:54.02 .net
グリーンスレッドはどう考えてもスレッドじゃないからな。
スレチ。
243:デフォルトの名無しさん
14/02/27 12:47:18.23 .net
コンテキストの切り替えが出来るならスレッドの範疇でいいとちゃうの
LWTやFiberも範囲でいいだろ
244:デフォルトの名無しさん
14/02/27 15:48:00.75 .net
Java屋は馬鹿だからな。なに言っても無駄。
245:デフォルトの名無しさん
14/02/27 17:43:54.80 .net
馬鹿でわるかったなー
246:デフォルトの名無しさん
14/02/27 18:44:32.81 .net
キチガイに触るな
居座っちゃうだろ
247:デフォルトの名無しさん
14/02/28 03:22:01.11 .net
マルチスレッドとタイムシェアリングは違うの?
248:デフォルトの名無しさん
14/02/28 04:10:21.51 .net
>>247
まずプロセスとスレッドの違いを理解してから
249:デフォルトの名無しさん
14/02/28 06:26:56.06 .net
まずグリーンプロセスとグリーンスレッドの違いを説明してほしい。
250:デフォルトの名無しさん
14/02/28 22:47:18.43 .net
グリーンスライムよりは手強そうなイメージ
251:デフォルトの名無しさん
14/03/01 06:43:57.25 .net
グリーンプロセス()
252:デフォルトの名無しさん
14/03/01 13:24:07.27 .net
このスレはカーネルレベルでの実装オンリーのスレになりました、ってことでFAね。
あるいは「カーネル型」のw
253:デフォルトの名無しさん
14/03/01 13:27:09.68 .net
まだいるのかグリーンスレッド君
254:デフォルトの名無しさん
14/03/01 14:11:27.38 .net
まだいるのかカーネル至上主義者君
255:デフォルトの名無しさん
14/03/01 14:14:20.18 .net
v-sync割り込みでマルチタスクだお
DOS至上主義者が通りますよ
256:デフォルトの名無しさん
14/03/01 19:50:36.19 .net
[要出典]
257:デフォルトの名無しさん
14/03/01 21:16:37.40 .net
>>255
マウス用割り込みの方が良い。
258:デフォルトの名無しさん
14/03/02 21:38:31.73 .net
マウスの付いてるパソコンはカッコ悪い
259:デフォルトの名無しさん
14/03/02 21:41:29.98 .net
わーるかったな
260:デフォルトの名無しさん
14/03/06 00:31:59.51 .net
マルチスレッドって使えるところが限られてる
261:デフォルトの名無しさん
14/03/08 13:27:50.88 .net
これからマルチスレッドの勉強をしようと思うんだけど、
参考になるサイトとかコードとかを教えて欲しい。
特にワーカスレッドを複数立て、たくさんのデータブロックを順に渡して処理させるようなサンプルとか。
ネットを検索しても、スレッドが延々と動きつづけるか、処理が終われば使い捨てるものばかりで、
処理の終わったワーカスレッドに次のデータを渡して連続して処理させるものが見つからない。
また、可変長の演算結果を親スレッドに返す方法についても、どうすればいいのやら。
1個の結果データは固定長だけど出てくる個数が可変なので、固定長の電文を複数投げるようなイメージでも可。
動作環境はWin7-x64で、VC++を使いマルチコアCPUのコア数分ワーカスレッドを立てようと思う。
うちのは6コアなので、単純計算で6倍弱には高速化できると思う。
処理内容の原理試作としてシングルスレッドのDOSアプリとして組んで、鍵値に5を与えて動かしてみた結果、
データブロック数は320万個余り、データブロック1個あたりの演算結果はゼロ100KBと幅があるw
そして総処理時間の見込みは60150時間(まだ終わってない)。
鍵値を6にするとブロック数も処理時間も莫大に跳ね上がるから、
たぶん1台のPC内で完結させようとしても終わらない。
262: ◆0uxK91AxII
14/03/08 15:25:57.27 .net
使い捨てと使い回しで、クロックにして1k~2kくらいの差が有るかどうかだから、使い捨てでOK。
263:デフォルトの名無しさん
14/03/08 15:49:40.12 .net
HotspotVMは?
と無茶振りしてみる
264:デフォルトの名無しさん
14/03/08 15:57:35.44 .net
VCならOpenCLかC++AMP使えば良いんじゃね
CPUとGPUで切り替えも出来るし
CPUだけならPPLでも
265:デフォルトの名無しさん
14/03/08 16:20:54.15 .net
VS2013か2012で、C++11のstd::threadとblockingできるqueueとstd::futureあたりを使えばいいんじゃないかな。
266:デフォルトの名無しさん
14/03/09 12:57:11.91 .net
>262-265
トン
スレッドの使いまわしについて、ちょっと説明が言葉足らずだったかな。
やりたいのは最初にn個を起動するのまでは同じなんだけど、
データブロックを1個処理し終わったら次のデータブロックを処理させることで
全てのデータブロックを処理し終わるまでn個を実行している状態を維持したい。
(実際にスレッドをループさせるか破棄/生成を繰り返すかは重要ではない。)
ググって見つけたサンプルは、n個のスレッドを最初に起動して、
n個全てが終わるのを待って次の処理(結果表示とか)に進むような使い方のばっかりで、
起動したうちの1個でも終わったら次の処理をやってまた1個終わるのを待つ、みたいなのが見つからない。
開発環境については、実は結構古いのしか持ってない……
ので、これからVS2013の評価版をDLして試してみようと思う。
現状のx86コード、シングルスレッドでどうやら鍵値5の処理を70時間以内で終われそうな予感。
処理結果のファイルを分割し過ぎて恐ろしい数のファイルを生成しちゃってるので、
マルチスレッド化の際にはもっと纏めてしまわないとなぁ。
鍵値6は複数台のPCへの分散処理とかGPU処理とかを真面目に考えないと無理そうだけど。
267:デフォルトの名無しさん
14/03/09 17:54:14.90 .net
そこまで仕様が決まってるならさっさと書けよって話だが。
268:デフォルトの名無しさん
14/03/09 19:14:48.84 .net
自慢
269:デフォルトの名無しさん
14/03/09 19:44:21.54 .net
なんの?w
270:デフォルトの名無しさん
14/03/09 21:24:29.64 .net
典型的なコード書けない君だったか。
271:デフォルトの名無しさん
14/03/09 21:29:22.95 .net
>>261
OpenMPのparallel forで分割するだけでおk
272:265
14/03/10 02:53:54.21 .net
>>271
もしも、それで済む用件だったら、一番楽だね。
VS2012と2013なら、無料版でもOpenMP使えるし。
手元のコードでOpenMPでforループ2048周をi7-3760Xで6倍速度くらい。
CUDAで780Tiで2048*2048cudaスレッドでさらに18倍くらいだった。
273:デフォルトの名無しさん
14/03/10 06:30:44.63 .net
266の処理は、OpenMPのparallel for schedule (dynamic)でできる
274:デフォルトの名無しさん
14/03/10 12:00:01.04 .net
ここはおまえの日記じゃねーぞ。
275:デフォルトの名無しさん
14/03/10 17:32:15.14 .net
スレッドの数って
CPUのコア数より多くしても意味ないよね?
276:デフォルトの名無しさん
14/03/10 17:42:02.40 .net
>>275
スレッド内の処理でI/O待ちとかしてる場合は意味あるんじゃないの?
277:デフォルトの名無しさん
14/03/10 18:28:34.27 .net
ひたすら計算し続けるなら意味はない。
計算メインというだけならコア数の倍ぐらいまでは
スループットが上がることはある。
278:デフォルトの名無しさん
14/03/10 19:11:36.58 .net
書きたいアルゴリズムを自然に書けるという理由で
マルチスレッドに意味があることはある
GUIなんかそうだろうね
279:デフォルトの名無しさん
14/03/10 19:22:36.70 .net
そんなGUIの実装は見たこと無いです。
280:デフォルトの名無しさん
14/03/10 19:40:06.12 .net
GUI スレッドと別に好きなスレッドを立ててうまくやっていけるってことだろうに‥‥
win16 の泣きそうな世界を知らないのか?
281:デフォルトの名無しさん
14/03/10 19:46:18.78 .net
それはCUIでも同じだろう。
282:デフォルトの名無しさん
14/03/10 21:47:19.99 .net
処理内容・数によるけど大量のパラ処理はCPUのマルチコアやNvidiaのGPGPUからAMDのGPGPUでopenCLが定番になってきたからな
そして、今後はAMDのHSAも定番になるって感じになっているし。
283:デフォルトの名無しさん
14/03/11 17:20:13.24 .net
いつGPGPUが定番になってきたんだ。
むしろまじ使えないってスルーされてる感が半端ない。
284:デフォルトの名無しさん
14/03/11 20:17:22.02 .net
それは nvidia/cuda
285:デフォルトの名無しさん
14/03/13 20:09:50.61 pPziPNkQ.net
インテルのやたらコア数が多い奴にビットコイン掘らせたらよさげよね
286:デフォルトの名無しさん
14/03/13 20:31:14.10 gEHR9Glb.net
GPGPUは特定の局面に限って言えば使えるんだが、一般の用途では
その特定の局面が存在しないというかわいそうな技術。
287:デフォルトの名無しさん
14/03/13 20:32:14.41 gEHR9Glb.net
ちなみにbit coinのマイナーはGPGPUから専用設計のASICに
主戦場が移った。消費電力が段違いなんだとさ。
GPUでやったら電気代で赤字になりそうだ。
288:デフォルトの名無しさん
14/03/13 20:49:30.32 /ZWTiswr.net
>>287
特定用途のみならICにしたほうが良いだろうな。
確かbitcoinでよく使われていたVGAはAMDだったはず。
ゲーム用VGAのGPGPU性能はいまはAMDのほうが良いのかな
289:デフォルトの名無しさん
14/03/13 21:06:24.71 k4ocBl+v.net
FPGA経由でASICな。
しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw
290:デフォルトの名無しさん
14/03/13 22:02:39.26 gEHR9Glb.net
で、自販機の下に落ちてる100円玉を地道に拾うぐらいなら
ショベルカーでATMごと盗んじゃえってのがマウントゴックス。
291:デフォルトの名無しさん
14/03/13 22:18:30.00 hR60BOrR.net
>>290
ワラタ、でもまさにソレ
MtGoxってMTGのカード売りだったと知った時の苦笑いときたら
292:デフォルトの名無しさん
14/03/14 16:35:28.14 8t3OXl/v.net
2年ほど前にbitcoin採掘をしていたが
お前らの想像の千倍くらい時間のかかる処理だったし
今もっと難しくなってるから既に個人で掘るのは無理なんじゃね
293:デフォルトの名無しさん
14/03/14 16:57:23.89 90E4Zs91.net
で、結局どのくらい掘れた?
294:デフォルトの名無しさん
14/03/14 17:00:16.55 UFFJd6rH.net
千倍台で分散する
295:デフォルトの名無しさん
14/03/14 17:37:55.81 p2oYKy+P.net
>bitcoin採掘
どういうこと?
296:デフォルトの名無しさん
14/03/14 17:57:18.99 I0jjMatv.net
>>295
むちゃくちゃ簡単に言うとBitCoinの正規のビットパターンは計算で求まる、でこれの正しい組み合わせを計算する事を採掘(マイニング)って言うだけの話
297:デフォルトの名無しさん
14/03/14 17:59:12.49 Sx19eOr2.net
>>296
ありがとん
298:デフォルトの名無しさん
14/03/15 00:32:35.88 IYjSi/+A.net
ちょいと相談。
データ処理とファイルI/Oを別スレッドに分けてstackを介してやり取りしてるんだけど、
気がつくとやたらメモリを食ってることがある。
調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。
ファイルの生成の様子なんかを観察してる限りで、2つの原因を想像。
A)処理済みデータをstackに積むのに比べてファイルに書き出す処理が追いついていない
B)stackがバカスカとメモリを確保している
ファイル書き出しのスレッドの内部処理は、共用stackからローカルstackにコピーして、
コピーが終わった時点で共用stack占有状態を開放、ローカルstackを順次書き出すようにしている。
Aは大量にデータを溜めることの無いようにファイル書き出しの頻度を上げる方法について、
Bはメモリを無駄に食わない方法について、アドバイスを聞きたい。
stackを使ったのはqueueに比べて頭が固定な分だけメモリの利用効率が高そうだったことと、
データの順番には意味がないから逆順になっても問題がないことによるものなので、
別のコンテナを使ったほうがいいなら、それでも構わない。
299:デフォルトの名無しさん
14/03/15 00:45:28.81 CF1cuZUb.net
>>298
そもそも一旦メモリに載せる必要があるのか?非同期IOじゃだめ?
どうしても載せなきゃいけないとして、Aはあまり意味がない。
よほど頭の悪い実装をしてなければ、現状メモリを喰ってるってことは
inputよりoutputの方が遅いってことだ。頻度で解決する問題じゃない。
Bの方は、conditon variableでスタックのサイズが一定より大きくなったら
inputを待たす方法が一番簡単じゃないか。
300: ◆0uxK91AxII
14/03/15 01:15:15.11 4evGY2gy.net
>調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。
常識的に考えてバグ持ち。
>コピーが終わった時点で共用stack占有状態を開放、
ふつーstack<void *>。
301:デフォルトの名無しさん
14/03/15 08:03:00.01 B9xccETs.net
バッファに制限を設けて
書き込みが詰ったら待てばいいだけでは
302:デフォルトの名無しさん
14/03/15 08:17:50.21 kVDIpCQy.net
リングバッファ、そして新しいバグ
303:デフォルトの名無しさん
14/03/15 08:31:05.02 xmGMuN0W.net
リングバッファてメモリが一杯になったらファイルに書き出すように実装するのが普通?
304:デフォルトの名無しさん
14/03/15 12:26:30.58 GnRScPte.net
普通じゃない
305:デフォルトの名無しさん
14/03/15 13:36:30.86 royCDzaU.net
どうすんの?あふれたら捨てるの?
306:デフォルトの名無しさん
14/03/15 13:43:41.30 E7qCmrfx.net
環境によっては勝手にswapしてくれるかもしれない
307:デフォルトの名無しさん
14/03/15 14:07:58.75 PqTylRc6.net
>>305
ふつうは>>301の言うように空くまで書き込みを待たせるか捨てる。
待てないような要件ならサイズ固定のリングバッファじゃなく可変のキューを使うなりする。
308:デフォルトの名無しさん
14/03/15 14:16:36.02 1lWAVkUO.net
書き出すデータのフォーマットを工夫してサイズを小さくするとか、
書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。
309:デフォルトの名無しさん
14/03/15 14:17:30.95 y0lYdZ+H.net
>>307
ありがとう、バッファーの構造を別にして最大容量は設定しないといけないということですね
>>306
後出しになるけど、リアルタイムシステムのデータ収集のようなもの考えていたので
310:デフォルトの名無しさん
14/03/15 16:35:55.25 x1nRJa7F.net
いるんだよなー、そもそも不可能なことを引き受けちゃう奴って
311:デフォルトの名無しさん
14/03/15 20:31:13.52 9prhxYaH.net
てへ、昔の話がねた
312:デフォルトの名無しさん
14/03/15 22:04:58.47 B9xccETs.net
金あるならFusion-ioを使えばいい
圧縮で減るようなデータならsnappyで圧縮する
313:デフォルトの名無しさん
14/03/15 23:24:57.03 Jbm5xDHA.net
普通のリアルタイムではありえん
314:313
14/03/15 23:26:35.57 Jbm5xDHA.net
訂正 以上です
315:デフォルトの名無しさん
14/03/16 01:00:35.01 67pIoXcC.net
リアルタイムシステムというのがRTOSを使っているという意味なら
送信側か他のタスクがwait入れてなくて書き込みタスクが動いていないとかってバグじゃないかな
>>313
時代は変わりCPUを使って圧縮したほうがIOが減って低レイテンシにできる
316:デフォルトの名無しさん
14/03/16 01:13:20.61 CvhR8B+T.net
リアルタイムっていうのは入力があってから何ms以内に応答を
返せなければならないみたいなシステムのことでしょ。
コンピュータ制御の工作機械で応答が遅くて削りすぎましたとか
許されないから。
317:デフォルトの名無しさん
14/03/16 01:14:58.23 Va0mC41/.net
>261だけど、概ね期待通りの動作になってきた
速度面でも、現在使用中のPCでシングルスレッドだと70時間ほど掛かってたから、
マルチスレッド化で6コアに分散して細部の調整込みで10時間切れれば恩の字と思ってたのに、なんと4時間半を切れたw
最新のCPUを使えば2時間も夢じゃないかも
あとは演算処理orデータのやり取りのバグを潰せばほぼ完成
(結果の個数が少し足りない)
318:デフォルトの名無しさん
14/03/17 12:29:47.16 iella/tJ.net
シングルスレッドのまま細部の調整とやらだけでどこまで行くのやら
319:デフォルトの名無しさん
14/03/17 15:11:57.25 ot8TfsyN.net
どんだけ時間がかかってるのやら。
320:デフォルトの名無しさん
14/06/13 00:28:43.87 cRyKxN+T.net
共有/排他ができるロックと条件変数があるとき、これらを使って
共有から排他にエスカレーションできるロックを構成することってできる?
321:デフォルトの名無しさん
14/06/13 01:34:28.10 +YSiec3A.net
ロックとか条件変数って排他するものだよね。共有できるロックって何?
RCUのこと?
322:デフォルトの名無しさん
14/06/13 08:49:59.19 cRyKxN+T.net
ええと、いわゆるread-writeロックのこと。
323:デフォルトの名無しさん
14/11/06 22:37:47.07 iaZsweTc.net
マルチスレッドは馬鹿には無理
馬鹿は使ったほうがいいところでマルチスレッドを使わずに
使わないほうがいいところっ使ってややこしくしたりする
324:デフォルトの名無しさん
14/11/06 23:24:42.11 ETjlkHcn.net
負荷分散とか難易度高なのにね
325:デフォルトの名無しさん
14/11/09 01:27:34.76 UGYkYxzf.net
スレッディング・ビルディング・ブロックについて勉強し始めた所なんだけど、どうなの?
理解して使うと安全で早くなりそうだとは思ったが、メモリ処理の効率とかどうなるんかな?
とか思ってる所なんだけど・・・
326:デフォルトの名無しさん
14/11/09 07:37:34.59 SGm17f1c.net
安全にするには、ある程度やった人しか...
327:デフォルトの名無しさん
14/11/09 22:48:01.80 wyNvyEnQ.net
メモリ処理の効率って具体的にどういう点?
mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?
328:デフォルトの名無しさん
14/11/10 09:36:09.81 W8sKwQAR.net
オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな
>>325
コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ
329:デフォルトの名無しさん
14/11/12 14:11:39.04 nS55KI9v.net
基礎的な質問で申し訳ないのですが
同じ変数に複数のスレッドがアクセスしてはいけないのはわかりますが
同じコードに複数のスレッドがアクセスするのはいいのでしょうか?
例えば何の変数にもアクセスしない関数を複数のスレッドが同時実行するのはいいのでしょうか?
330:デフォルトの名無しさん
14/11/12 14:21:32.89 Tjo57cUc.net
ダメな理由でも探してるの?
331:デフォルトの名無しさん
14/11/12 14:31:27.32 nS55KI9v.net
>>330
今書いているプログラムで
C#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って
332:デフォルトの名無しさん
14/11/12 14:35:31.55 Tjo57cUc.net
C#のシグナルってよーしらんけど
エラーが出るってことは、質問の内容と違うことやってるんじゃないの
333:デフォルトの名無しさん
14/11/12 15:18:29.39 ghkKScBM.net
同期オブジェクトを保持している変数を上書きしていそうな気がするんだが
334:デフォルトの名無しさん
14/11/12 16:32:42.96 yNtQ/r84.net
いろいろ分かってないだけだろう
335:デフォルトの名無しさん
14/11/13 06:29:27.90 w/Cn+ODk.net
ライブラリがマルチスレッドに対応してないだけかと
336:デフォルトの名無しさん
14/11/13 06:35:25.00 4ACzZkWI.net
/MT
337:デフォルトの名無しさん
14/11/13 13:44:55.73 t6y7WFqt.net
C#ならエラーメッセージやスタックトレースが出てるだろ
338:デフォルトの名無しさん
14/11/15 11:02:51.29 JwZZHuNb.net
>>329
同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数とstatic変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ
339:デフォルトの名無しさん
14/11/16 00:17:15.94 lWtIBSfv.net
同じ変数に複数のスレッドがアクセスするならクリティカルセクションが楽だ
340:デフォルトの名無しさん
14/11/16 19:55:00.63 9ZsvKJox.net
linuxですがスレッドで同じファイルに書き込む場合、競合することってありますかね?
341:デフォルトの名無しさん
14/11/16 20:11:07.08 1qsvk//V.net
勿論。
342:デフォルトの名無しさん
14/11/16 21:20:39.95 4XTrCB2a.net
論外
343:デフォルトの名無しさん
14/11/16 21:40:57.77 Kyr5+wjo.net
>>339
もう win32 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?
344:デフォルトの名無しさん
14/11/30 17:47:06.48 H8djdLBQ.net
複数のスレッドがひとつのミューテックスのアンロックを待っていた場合、
つぎにどのスレッドがミューテックスを取得するかはランダムですか
345:デフォルトの名無しさん
14/11/30 18:09:41.22 ddtepLmv.net
はい
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
346:デフォルトの名無しさん
14/12/01 00:39:51.39 Az7+Eliy.net
いいえ
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります
347:デフォルトの名無しさん
14/12/08 19:13:20.61 PHJZbN+V.net
スレッドとミューテックスだけ覚えたけど
なにを作ったらいいのかわからんたい
348:デフォルトの名無しさん
14/12/08 22:37:39.16 PHJZbN+V.net
チャット作ることにしました
349:デフォルトの名無しさん
14/12/08 22:57:10.96 x3KHTevM.net
consumerとproducerみたいのがいいんじゃないのかなと思ったけど、
チャット作ることにしたのね
がんばってください
350:デフォルトの名無しさん
14/12/08 23:08:56.71 PHJZbN+V.net
>>349
チャットで詰まったら気分変えてConsumer-Producerにも挑戦してみます
あざす
351:350
14/12/09 00:23:00.21 MJarMgeM.net
>>349
いや、ありがとうございます
352:デフォルトの名無しさん
15/05/29 22:45:34.32 gXnjRwZ6.net
Win8.1 Cygwin64bit g++のpthreadなんですが、マルチコアCPUなのに性能改善しません。
なにか特別なコンパイルオプションがあるとか
特別なライブラリをリンクしなければいけないとかあるのでしょうか。
-lpthreadはつけてます。
353:デフォルトの名無しさん
15/05/30 20:09:50.25 WwgHsNSJ.net
エスパー能力はありません
354:デフォルトの名無しさん
15/05/30 20:21:35.33 h4Yx63EK.net
そこをなんとかスーパーエスパーでお願いします
355:デフォルトの名無しさん
15/05/30 21:18:52.04 iD4l02SZ.net
誠意を見せてください
356:デフォルトの名無しさん
15/06/15 23:17:16.10 SZnUF3Ky.net
DISKへのアクセスって並列にしたって意味ないですか?
・・・
FileA読み込み(::ReadFile) 10秒
FileB読み込み(::ReadFile) 20秒
・・・
で30秒以上掛かりますが、
之をスレッドを起こしても意味無い?
357:デフォルトの名無しさん
15/06/16 00:49:42.46 s9cfeU7N.net
よくわかってないけどDISKの特性によるのかなぁとかいってみる。
358:デフォルトの名無しさん
15/06/16 01:06:01.70 ILaOeTTR.net
どういった特性ならどうなるのですか?
359:デフォルトの名無しさん
15/06/16 01:31:46.58 ZNZkvIJW.net
読み込みながら処理をしてみたいにな状態でない限りスレッド分けてファイル読むと遅くなるよ(デバイスが別であればまた違うのだが)
純粋にバイナリデータとしてファイルをメモリに丸ごと読み込むのであればスレッド分ける意味ない(CPUとメモリの方がディスクよりも遙かに速い)
360:デフォルトの名無しさん
15/06/16 01:39:58.55 ILaOeTTR.net
遅くなる理由はなんですか?
361:デフォルトの名無しさん
15/06/16 09:26:39.31 gU9w5dQ4.net
俺様の質問に答えろとさ
362:デフォルトの名無しさん
15/06/16 22:30:15.77 45Me4wJl.net
まともに答えるとまた暴れだすだろ
363:デフォルトの名無しさん
15/06/20 17:07:37.08 2GjEDXn2.net
>>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鹿児島県
364:デフォルトの名無しさん
15/08/25 15:16:47.83 f9VpmzI5.net
いまどきのディスクはインターリーブなんか考慮しても意味無いぞ
365:デフォルトの名無しさん
15/08/25 23:23:52.89 SuXh7n4E.net
>>364
インターリーブってCPUが遅い時代の話だろ?
セクタリードの後でCPUが処理している間に次に読むべきディスク上の物理セクタが通り過ぎてしまうからシーケンシャルなセクタ処理でなくインターリーブした順序付けのセクタ使うって奴
366:デフォルトの名無しさん
15/10/10 23:10:25.42 bMLX+QzX.net
趣味プログラムでInterlockedCompareExchange
で値が交換できた時だけそのスレッドが処理を進められるような感じで
作りこんでいるんだけど、何かこれだと問題ある?
一般的にはクリティカルセクションを使った方がいい的な話を聞くんだけど
sizeof(CRITICAL_SECTION)がチョット大きすぎるので使うのをためらってしまう
367:デフォルトの名無しさん
15/10/11 01:12:22.19 DeMvW0Ba.net
>>366
レースする可能性があるくらいじゃね?
まあ、ほとんど問題ないと思うけど。
368:デフォルトの名無しさん
15/10/11 01:16:20.15 DeMvW0Ba.net
>>367
間違えた。
レースじゃなくてスタベーションだった。
369:デフォルトの名無しさん
15/10/11 10:38:15.80 P9PvwsgL.net
マ
370:デフォルトの名無しさん
16/02/06 07:43:27.68 DtUiRvEm.net
int iで++iにミューテックスが必要ってことはiを同時に2つのスレッドが足しても2増えるだけで必要ないと思うんですけど?1しか増えないってこともあるんですか?
371:デフォルトの名無しさん
16/02/06 08:26:40.76 DtUiRvEm.net
CPUによってアトムが違うから必要ってことですねわかりました。
372:デフォルトの名無しさん
16/02/06 08:57:53.38 AVvIsuem.net
御茶ノ水の博士の設計
373:デフォルトの名無しさん
16/03/07 00:30:59.08 jKz+oF2h.net
>>370
Aスレッド:iから1を読み込んで++して2を代入
Bスレッド:iから1を読み込んで++して2を代入
答えは1増える
374:デフォルトの名無しさん
16/03/08 01:40:29.32 YkHc2UTm.net
レース状態のことやね
375:デフォルトの名無しさん
16/03/20 12:54:59.05 upopZnIF.net
同じcondition_variableでブロックしているスレッドが複数ある場合に、
notify_oneをしたら、どのスレッドが起床するのだろうか。
376:デフォルトの名無しさん
16/03/29 08:51:54.17 /c8bAcK4.net
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
URLリンク(www.youtube.com)宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
377:デフォルトの名無しさん
16/05/20 22:39:11.46 /6R1fTEV.net
>>375
リファレンス読め
378:デフォルトの名無しさん
16/05/23 02:01:11.63 xOdUGJqd.net
CAS命令でロックしている部分を
_xbegin _xend やら xxx_HLEAcquireで代用すればCAS命令分のWaitをチャラにできるかと思ったんだけど
結果微妙に遅くなっただけだった
使い方間違っているのかなTSX
379:デフォルトの名無しさん
16/12/09 07:26:48.14 WzSsU1Dc.net
マルチスレッドにおける変数の排他処理についてなんだけど、
排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?
読み取り最中に書き換えたり、書き換え最中に読み取った場合にデータが破壊されるというだけの話だよね?
例えば2byteの変数があって、スレッドAが1byte目を読み込んだ時点でスレッドBが2byte目を書き換え、
そこでスレッドAが2byte目を読み取った場合に、
データが上位1byteと下位1byteで別のデータを読み取ったことになっておかしくなるってことだよね?
ということは何らかのフラグで下位1bitのみを利用するような変数であれば、
上記のような状況は起きないから排他処理しなくても大丈夫って認識でOK?
380:デフォルトの名無しさん
16/12/09 09:38:28.68 uxrmDz9Z.net
馬鹿乙
381:デフォルトの名無しさん
16/12/09 13:52:04.09 GFY666CI.net
>>379
>>マルチスレッドにおける変数の排他処理についてなんだけど、
>>排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?
変数というだけでは分からない。
構造体とかC++の変数とかはそちらから見ても明らかに問題のはず。
>>ということは何らかのフラグで下位1bitのみを利用するような変数であれば、
>>上記のような状況は起きないから排他処理しなくても大丈夫って認識でOK?
1bit(あるいは1バイト、1ワード)がアトミックにアクセスできる
ことはシステムによって保証されていることが多い。
だから、その1bitの読み書きは出来る。
しかし大丈夫とか問題ないかということは、何を問題とするかを
書かないと答えようがない。
1bitはこれ以上分割できないので1ビットの半分だけ違う値になる、
ということはありえない。そういう心配をしてるなら大丈夫
382:デフォルトの名無しさん
16/12/09 16:50:23.32 WzSsU1Dc.net
ありがとう!
大丈夫かどうかというのは、
排他制御が行われていない変数へのアクセスそのものが原因となってソフトウェアがクラッシュしたり、
OSやハードウェアレベルの問題は起きたりしないよね?って意味
C言語で下位1bitしか使わない排他処理が行われてない変数があり、その1bitをif文で判定して処理を2通りに分ける場合、
必ずその2通りのどちらかになることは保証されるよね?
できるだけ高速化したいから、できるだけ排他処理はしたくない。
383:デフォルトの名無しさん
16/12/09 18:10:37.82 uxrmDz9Z.net
やっぱりアホか
384:デフォルトの名無しさん
16/12/09 18:37:52.31 R3c5DqP6.net
>>382
馬鹿が書くと機械的に壊れることもあります
ソレノイドが焼損とか日常茶飯事
385:デフォルトの名無しさん
16/12/09 21:27:34.75 WzSsU1Dc.net
>>384
どのパーツのソレノイド?
説明してくれ。
パソコンは自作やら修理やらよく頼まれ続けてきてるから専門的な話OKだ。
386:デフォルトの名無しさん
16/12/10 23:59:30.12 mx8/lQPw.net
すいません質問します。
Matlobで、
例えば5000×5000の行列をAとして
その10×10の区分行列をBとします。
Aの対角線上にあるBだけを取り出して他が0行列の行列を作るにはどうすればいいですか?
また、各Bの対角要素だけ取り出すにはどうすればいいですか?
sssp://o.5ch.net/k1za.png
387:デフォルトの名無しさん
16/12/11 00:44:10.55 pm6ghExK.net
・とりあえず全てのパラメータから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を代入する
388:デフォルトの名無しさん
16/12/11 09:12:59.03 nmNJ+GHK.net
アホ
389:デフォルトの名無しさん
16/12/11 10:53:35.53 PFNTM+nw.net
>>387
ありがとうございます。やってみます。
390:デフォルトの名無しさん
16/12/17 10:53:31.14 WxRoohcq.net
>>381
ウソ乙
391:デフォルトの名無しさん
17/03/29 21:36:43.88 QetAZaUg.net
【OS】OSX 10.8.5、Core i5
【言語】 C, C++
【実行環境】 XCode5.1, pthread
pthread を使って for ループを分割して実行するプログラムを書いたのですが、直列処理の方が速いです。
tbbやOpenMP でもやってみたのですが、直列の方が速いです。
上記の環境ではマルチスレッドで効率化を図るには、何か設定が必要なのでしょうか。
ざっくりした質問ですがヒントになるようなことでも教えて下さい。
392:デフォルトの名無しさん
17/03/29 22:31:24.61 urajtArt.net
マカーか
393:デフォルトの名無しさん
17/03/29 23:09:26.86 TE60yoif.net
>>391
プログラムを見ないと分からない。
マカーじゃないから見ても分からないかもしれないけど。
大前提として、マルチスレッド化して速くなるようなジョブなんだよね?
スレッドを作るのもjoinするのもスイッチするのも時間が掛かるので、
それらがペイしないと意味がない。
ちゃんと作っていて遅いのなら、キャッシュの競合の可能性があるかも
394:デフォルトの名無しさん
17/04/02 18:18:24.01 mBDn/7kD.net
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; }
};
395:デフォルトの名無しさん
17/04/02 18:29:20.77 mBDn/7kD.net
書き忘れ >>391 のマカーです。
396:デフォルトの名無しさん
17/04/02 18:45:45.15 mBDn/7kD.net
度々すみません、タイポありました。(多分本筋と関係ないですが)
関数 bool isPrime( int n ) のループ。
誤 for ( int j = 3; j < n; ++j )
正 for ( int j = 2; j < n; ++j )
397:デフォルトの名無しさん
17/05/03 16:23:24.52 E3YCeKkn.net
RelativisticProgrammingを日本語で解説してるとこ、ないかな?
398:デフォルトの名無しさん
17/05/04 03:11:44.69 N/fwOcUx.net
++j
399:デフォルトの名無しさん
17/09/17 19:09:14.78 iyMogwhx.net
#include <stddef.h>
offsetof(type, member-designator);
400:デフォルトの名無しさん
18/05/23 21:43:17.32 Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
4DXJZ
401:デフォルトの名無しさん
18/07/05 00:17:03.60 RfoszcD2.net
Z1B
402:デフォルトの名無しさん
18/10/28 23:21:28.63 bVjvgsxo.net
>>394
超亀レスだしテキトーだけど、counterがシングルトンなら
countのインクリメントでシリアライズされるんじゃね?
403:デフォルトの名無しさん
19/01/13 12:43:26.12 P4nmFhbL.net
Intelのハイパースレッドでスケールするか否かのアルゴやデータ構造のパターンとか、評価基準をまとめた本なりサイトなり御存じでしたら教えてください。
404:デフォルトの名無しさん
19/01/26 17:42:01.46 stTjLhtD.net
400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに掛かってスケールしないと思うんですが、boolの配列(newしたもの)でやるとある程度スケールします。
何でですか?
405:デフォルトの名無しさん
19/01/26 18:19:40.68 yUYodqfD.net
>>404
bool の配列が、例えば、8個の bool 値をまとめて 1バイトとして格納している場合で、
for ( i =0; i < 100000; i++ ) {
dst[i] = src[i];
}
のように書いて、かつ、コンパイラがこのループを「そこまでの」最適化はしなかった場合、
32BIT 環境の場合なら、32回のループで 1 DWORD 分の実メモリやキャッシュ・メモリへの
転送が生じるだけになるかも知れない。その他のメモリアクセスは、基本、code の
fetch だけになり、全てCPU内部のキャッシュ・メモリに乗ってしまう。
だから、マルチスレッドでこのループを分割して行えば、32スレッドまでなら、
高速化が起きる気がする。
そういう問題でなくて?
406:デフォルトの名無しさん
19/01/26 18:25:13.78 VVr2JTND.net
>>404
あ、あと
>400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに
>掛かってスケールしないと思う
これだけど、以外に高速化されたりするかもしれない。
実際の CPUはそんなに賢くないので。
色々複雑。
407:デフォルトの名無しさん
19/01/27 00:13:20.29 UeSsBKpf.net
チップセットや DDR DRAM、バス・アービタなどの事はそんなに詳しくは無いけど、
「ブロック転送命令」みたいなのがあるかも知れない。そして、
CPU で、rep movsd などが実行されるとき、CPU は、自分で転送せずに
チップセットと連携してバス・アービタにその命令を発行し、すぐに次の命令
から実行を再開したりするかも知れない。昔で言う「バスマスタ転送」や「DMA転送」
に似たようなやり方。
なんでそう思うかというと、主記憶(外部メモリ)はCPUのクロック速度にはついていけない
はずなのに、以外に CPU のブロック転送が速い気がするから。
確認は取ってない。
408:デフォルトの名無しさん
19/01/27 19:38:20.44 0CxMXTRb.net
返信ありがとう。
DMA転送できるものをコンパイラが探知できるか疑問に思ってました。CPU機能としてのブロック転送は関係ありそうですね。
ワード単位処理は確かにやってそうです。
マルチコアでスケールできる処理って割りと限られてますね(汗。
409:デフォルトの名無しさん
19/01/27 19:45:29.93 upukWAKG.net
バイナリ見れば済む話だよね^^
410:デフォルトの名無しさん
19/01/27 19:45:46.51 UADZfhGv.net
>>408
[追加]
DMAでなくとも、CPU自身が命令実行の処理とは独立して主記憶の間で
転送をする仕組みは当然あるので、ブロック転送の予約みたいな事で、
実際の転送処理が終わってなくても次の命令に進んだりするようなことは
あるかも知れないと想像してみる。
無いかもしれないけど。
411:デフォルトの名無しさん
19/01/27 19:48:31.17 UeSsBKpf.net
>>409
いや。例えば、バイナリだと、
rep movsd
の1命令がそこにあるだけで、命令表を見ればブロック転送をする命令とあって、
擬似命令レベルでの処理までは書かれているが、バス転送レベルでそれをCPUが
どう処理してるかまでは分からない。
412:デフォルトの名無しさん
19/01/28 03:22:00.62 3CrwaDYk.net
double 1GBをコピー元のデータを加工してからコピーする場合は、どうやってもスケールしないんですかね、この話の感じからして。
書き込みタイミングが結果論でずらせるので、並列化で多少は見込みアルのかな。ーー自分で実験した方が良いですね。
413:デフォルトの名無しさん
19/01/28 11:26:24.99 jKaiFfBH.net
>>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 の処理が終わるまで待機すれば良い。