マルチスレッドプログラミング相談室 その9

1デフォルトの名無しさん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】
【言語】
【実行環境】
【その他特記する事項】

2デフォルトの名無しさん2012/06/15(金) 01:35:25.58
■関連スレ・関連性の高いスレ

ネットワークプログラミング相談室 Port28
http://toro.2ch.net/test/read.cgi/tech/1334736934/

3デフォルトの名無しさん2012/06/15(金) 03:59:42.18
>>1

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

OpenMP なら !$omp parallel do としてコンパイルオプション /Qopenmp

4デフォルトの名無しさん2012/06/15(金) 16:15:07.07
>>前すれ995
そういうオプションがあるのですね,レポートと書き直したソースを添付します.

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

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

>>前すれ997
これは試しにつけてみただけのものです,やはり使い方が違いますか・・.

5デフォルトの名無しさん2012/06/15(金) 18:14:50.61
gfortran -O3 20120528_fast_pararell_subroutine.f90 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=2

6デフォルトの名無しさん2012/06/15(金) 18:54:01.14
彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど
どうすればいいかな

7デフォルトの名無しさん2012/06/15(金) 19:08:46.12
時分割でがんばれ

8デフォルトの名無しさん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];



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

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

ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (100〜0) で並列化は完了。

10デフォルトの名無しさん2012/06/16(土) 12:48:12.18
bに依存がないことくらい解析できてもよさそうなのにね

11デフォルトの名無しさん2012/06/16(土) 16:27:05.54
sho_det呼び出しの2重ループで並列化できるの?

12デフォルトの名無しさん2012/06/16(土) 16:52:50.21
双子と付き合う時はマルチスレッドのチンポ子が欲しい。

13デフォルトの名無しさん2012/06/16(土) 16:54:32.86
クリティカルセクションとかミューテクスって重いんですか?
秒間2500回とかマジキチですか?

14デフォルトの名無しさん2012/06/16(土) 17:00:15.54
400μ秒は今のパソコン環境でも、厳しいんじゃね
何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね

15デフォルトの名無しさん2012/06/16(土) 17:19:32.25
ロックフリー!

16デフォルトの名無しさん2012/06/16(土) 17:33:56.57
>>13
そのあたりだと、API 呼び出しのオーバーヘッドもバカにならないから
自前で実装したほうがいいんじゃね?

17デフォルトの名無しさん2012/06/16(土) 21:17:30.95
https://gist.github.com/2841832
によれば
> Mutex lock/unlock 25 ns

18デフォルトの名無しさん2012/06/16(土) 22:25:28.46
>>13
重いけどそれくらいならいけると思う
できるならスレッドごとにリソースもって
最後に合体させたほうが速い

1942012/06/16(土) 23:07:53.93
申し訳ありません,並列化ですが,解決しました.
/Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました.

ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです.
このループだけ並列化したいっていうような指定ってできるのでしょうか?

20デフォルトの名無しさん2012/06/16(土) 23:18:15.13
>>17
Mutexってスレッド数によると思うんだけどな。
シングルコアならオンキャッシュで対応できるけど、
マルチコアだったりマルチCPUだったらメモリ参照と大差ないと思う。

21デフォルトの名無しさん2012/06/17(日) 02:24:44.41
答え教えてもらって、闇雲にやるのが今風なの?

22デフォルトの名無しさん2012/06/17(日) 02:28:46.34
それって、単純ループがスレッド化されただけじゃねえの?

23デフォルトの名無しさん2012/06/17(日) 03:56:01.16
実行環境に寄って自動で最適化して欲しいよね。
ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。

4coreの環境と64coreの環境といちいち最適化するのめんどくさい。

24デフォルトの名無しさん2012/06/17(日) 04:08:44.71
core数増えたから、早くなるってわけでもないでしょうに

25デフォルトの名無しさん2012/06/17(日) 06:28:14.10
効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS
※ 依存性に目をつぶれという指示ではない

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

そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。
スケールするとかしないとかはそういう話。

26デフォルトの名無しさん2012/06/17(日) 14:48:00.38
速くなってくれないと高額な多コア買った意味無いんだが。

27デフォルトの名無しさん2012/06/17(日) 19:02:58.50
それは、プログラム作ったベンダーに言え。
場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。

28デフォルトの名無しさん2012/06/17(日) 20:27:37.75
分散処理できるように考えるほうが難しいのに
道具によってはできることとできないことがあるでしょ

29デフォルトの名無しさん2012/07/06(金) 19:30:56.61
多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。
そうしないとスケジューリングに費やすコストが無駄だ。

30デフォルトの名無しさん2012/07/06(金) 19:38:42.21
あまり賢そうに見えないな

31デフォルトの名無しさん2012/07/06(金) 19:45:56.15
gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。

32デフォルトの名無しさん2012/07/06(金) 19:58:44.83
標準的な入出力は動くコア決めたほうがいいかもしれんけど
プロセス、スレッドはどのコアで動こうが関係無いような
どうせ、暇な?コアに割り当てられるだろうから

33デフォルトの名無しさん2012/07/06(金) 20:28:22.95
linuxだとこういう指定が出来るようだ
ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html

34デフォルトの名無しさん2012/07/06(金) 22:01:45.18
それぐらいは WindowsNT 4.0 からあるが。

SetProcessAffinityMask
http://msdn.microsoft.com/ja-jp/library/cc429334.aspx

35デフォルトの名無しさん2012/07/06(金) 22:04:26.89
コア数とかうるさい割にapiのことは言わんのね?

36デフォルトの名無しさん2012/07/21(土) 14:53:22.69
pスレッドについて教えてください。


関係性のない処理を行う2つのスレッドA、Bを同時に動かし始めたいのですが、

・スレッドAの待ち状態にpthread_cond_wait(&cond, &mutex1);

・スレッドBの待ち状態にpthread_cond_wait(&cond, &mutex2);

として(condは同じで、mutexが異なる)、これらを動かし始めるために別スレッドで

pthread_cond_broadcast(&cond);

をコールしたのですが、思ったとおりに動いてくれません。
なにがいけないのでしょう?
(pthread_cond_wait()の使い方を間違えている?)

37デフォルトの名無しさん2012/07/21(土) 14:57:02.99
馬鹿には無理

38デフォルトの名無しさん2012/07/21(土) 15:18:21.14
>>36
broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう

39デフォルトの名無しさん2012/07/21(土) 15:33:58.32
>>38
素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね

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


ともかく、ありがとうございました

40デフォルトの名無しさん2012/07/21(土) 15:42:20.05
>>39
pthreadの粒度が小さい場合、threadの実行順序がぐだぐだになるから要注意。
結論としては、充分長い処理でもない限りcond_waitは使えない。

41デフォルトの名無しさん2012/07/21(土) 15:49:59.71
>>40
頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・

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

ありがとうございました

42デフォルトの名無しさん2012/07/21(土) 16:06:39.87
>>41
去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。

43デフォルトの名無しさん2012/08/25(土) 18:20:47.36
いつでもどんな時にでも
スケジュールから外されても動かされても
大丈夫なように作るのが鉄則

44デフォルトの名無しさん2012/08/26(日) 08:54:03.71
そうそう。
だから、Web上のサンプルは当てにならない。

45デフォルトの名無しさん2012/08/26(日) 09:32:08.49
そもそも並列化したいのは高速に処理したいからじゃん?
サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる
まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪

46デフォルトの名無しさん2012/08/26(日) 09:34:18.81
て言うかサンプルってそういうもんだし。

そもそも >>42

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

って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。

47デフォルトの名無しさん2012/08/26(日) 09:57:42.57
マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ

そんなことより、マトがトマるだって・・・・・!喜w

48デフォルトの名無しさん2012/09/01(土) 15:54:33.37
ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・


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

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

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



こういう理解は正しいですか?

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

マルチCPUじゃなく
単一CPUの時のスレッド等の挙動を考えてみませう

50デフォルトの名無しさん2012/09/01(土) 16:04:51.98
同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、
せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?

51デフォルトの名無しさん2012/09/01(土) 16:11:29.80
逝ってるなマルチコアはCPU毎に命令データキャッシュ持ってるでしょ

52デフォルトの名無しさん2012/09/01(土) 16:12:43.77
でも分岐したらダメなのでは?

53デフォルトの名無しさん2012/09/01(土) 16:16:42.15
よく考えたら、分岐するんだったらCPU移らなくてもダメだった
ドピュッ

54デフォルトの名無しさん2012/09/01(土) 16:27:35.25
命令の先読みとかやってるの知ってる?

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

HDDキャッシュとかも同じでしょ

55デフォルトの名無しさん2012/09/01(土) 16:29:03.73
別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、
ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある
OSの裁量次第

56デフォルトの名無しさん2012/09/01(土) 16:32:16.93
キャッシュ知らんでも
スレッド系のプログラム作るのには関係無いような

速度ウンタラは動いてから考えればいい話でしょ

57デフォルトの名無しさん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;

っていうのは安全でしょうか?

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

59デフォルトの名無しさん2012/09/05(水) 06:16:48.24
weak_ptr使えハゲと言うしかないレベル

60デフォルトの名無しさん2012/09/05(水) 08:13:29.83
weak_ptrってboost?
マルチスレッドを考慮されていたの?

61デフォルトの名無しさん2012/09/09(日) 01:13:55.50
>>58
volatileしておけば、
まあいいんじゃない

sleep で待つのは効率はよくなさそうだけど

62デフォルトの名無しさん2012/09/09(日) 01:44:44.97
volatile使ったとしてもコンパイラによっては安全だとは言えないんだよ

63デフォルトの名無しさん2012/09/09(日) 01:51:51.18
安全って、思いたい理由の方に興味があるんだけど

64デフォルトの名無しさん2012/09/09(日) 07:41:49.96
むしろ安全だといえるコンパイラを知りたい

65デフォルトの名無しさん2012/09/09(日) 14:24:32.10
volatile使っても結果変わらない事の方が多い気がする

66デフォルトの名無しさん2012/09/09(日) 15:54:34.19
そりゃそうだ

67デフォルトの名無しさん2012/09/09(日) 16:30:00.96
安全だと思うと、コンピュータがそれを理解して動いてくれると思いたいのかな

68デフォルトの名無しさん2012/09/12(水) 00:03:54.96
volatileしてダメだったケースに遭遇したことないなあ。

まあboolでの同期・排他は簡単なケースにしか使ってなくて、
まじめなのはcritical sectionとかmutexで排他・同期するから
気がついてないだけかもしれないけど。

69デフォルトの名無しさん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

スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。

70デフォルトの名無しさん2012/09/22(土) 01:53:58.20
>>69
InterlockedExchangePointerは?

71デフォルトの名無しさん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に基づく処理

72デフォルトの名無しさん2012/09/29(土) 20:49:37.13
も一個、volatile bool a, b; があるとして、
 a = c;
 b = d;
の代入順序は、a, bがたとえatomicな型でvolatileだからといって
プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、
よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は
メモリバリアが 必 須 、
という理解で合っていますか

73デフォルトの名無しさん2012/09/29(土) 21:08:56.80
>>71
http://msdn.microsoft.com/en-us/library/ms686355%28VS.85%29.aspx
> The following synchronization functions use the appropriate barriers to ensure memory ordering:
> ・Functions that enter or leave critical sections
> ・Functions that signal synchronization objects
> ・Wait functions
> ・Interlocked functions

>>72
はい

74デフォルトの名無しさん2012/09/30(日) 00:03:39.72
>>64
javacやcscじゃね

75デフォルトの名無しさん2012/09/30(日) 00:12:53.41
メモリバリアってのはgcc特有の表現で
atomicな処理とは関係ないんだけど

76デフォルトの名無しさん2012/09/30(日) 00:30:58.05
>>73
dクス
SetEvent()は2番目(・Functions that signal synchronization objects)、
WaitForSingleObject()は3番目(・Wait functions)ってことでおkそうですね

>>75
メモリバリアはアウトオブオーダー実行するアーキテクチャに共通する概念であってGCC固有というわけではないですにょ
とかいろいろあるが説明がマンドクセ、

77デフォルトの名無しさん2012/09/30(日) 00:56:39.75
ただの最適化抑止のおまじないみたいなもんだよ

78デフォルトの名無しさん2012/09/30(日) 01:05:56.81
>>77
ちょっそれvolatileの方wwwww

まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…

79デフォルトの名無しさん2012/09/30(日) 01:13:58.15
マルチコア時代の並列プログラミング
〜ロックとメモリオーダリング〜
http://www.nminoru.jp/~nminoru/data/b2con2006_nminoru.pdf

80デフォルトの名無しさん2012/09/30(日) 01:14:33.03
gccのvolatileってのは、ちょっと特殊なんだよ

81デフォルトの名無しさん2012/09/30(日) 01:21:19.22
>>77,78
真相はもっと複雑怪奇だったりする
http://yamasa.hatenablog.jp/entries/2009/07/20
http://msdn.microsoft.com/ja-jp/library/bb310595%28VS.85%29.aspx

つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…

82デフォルトの名無しさん2012/09/30(日) 01:26:29.84
ここらへんの話は
 ・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛
 ・volatileによって明示的に最適化が抑制
 ・システムコール内でメモリバリアの面倒をみてくれる
 ・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる
といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので
コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)

83デフォルトの名無しさん2012/09/30(日) 01:27:48.80
アトミック変数とか作って、ド素人に誤解釈されたらどうすんだろ、この人

84デフォルトの名無しさん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でも持っていない。

85デフォルトの名無しさん2012/09/30(日) 13:33:02.65
>>83
ドシロウトがなんでスレッド使った開発に加わるんだよ

86デフォルトの名無しさん2012/09/30(日) 13:35:58.01
なんで排他の話ばっか出てくるんだ。
スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。

それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。

87デフォルトの名無しさん2012/09/30(日) 14:26:20.27
>>86
>なんで排他の話ばっか出てくるんだ。

マルチスレッドで問題になるところと言うか、排他を最近覚えた奴が
使いたくてしょうがないんだろ。

88デフォルトの名無しさん2012/09/30(日) 15:13:14.28
>>86
スレッドの実装が違うだろう、LinuxとUNIXなら同じだが

89デフォルトの名無しさん2012/09/30(日) 15:25:27.37
>>85
じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?

90デフォルトの名無しさん2012/09/30(日) 16:54:17.48
>>88
boostとか抽象化レイヤー用意すればできるだろ。

しかし、仕様の安定したスレッドキューがない。
もう、自作スレッドキューを保守するのは嫌だお

91デフォルトの名無しさん2012/09/30(日) 17:01:09.98
>>90
皮かぶせりゃいいだろうけど、

そこまでして、

そこまでしても

92デフォルトの名無しさん2012/09/30(日) 21:04:28.14
おまえら何回C++におけるatomicとvolatileの話を繰り返せば気がすむの

93デフォルトの名無しさん2012/09/30(日) 21:20:03.98
それしかネタがないからさ

94デフォルトの名無しさん2012/09/30(日) 22:09:45.89
>>92
スレッドキューの話しだせ

95デフォルトの名無しさん2012/09/30(日) 23:24:16.01
だって手法なんて先駆者が出し尽くしただろ

96デフォルトの名無しさん2012/09/30(日) 23:53:26.29
スレッドキューって何だ?
スレッドセーフなキューってことか?
それともGCDみたいなタスクキューのことか?

97デフォルトの名無しさん2012/10/01(月) 00:06:38.53
タスクキューのことだよ。
てかスレッドセーフなキューってなんだよ。それだったら
別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。

98デフォルトの名無しさん2012/10/01(月) 07:53:47.16
java.util.concurrent.BlockingQueueのことだろ

99デフォルトの名無しさん2012/10/12(金) 23:18:24.02
同期処理を間違いなく設計するための、何か良い手法やツールはないですかね?

ペーペーのビギナーだというのもあるのですが、
複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、
waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、
そのデバッグで無駄に体力を消耗しています

100デフォルトの名無しさん2012/10/13(土) 11:18:48.75
馬鹿には無理

101デフォルトの名無しさん2012/10/13(土) 13:05:32.66
>>99
排他処理、スレッドモデルと実装を勉強すれば

ビギナーには無理と思うが

102デフォルトの名無しさん2012/10/13(土) 18:57:49.84
>>99
もうそこは、共有している資源と mutex の一覧表作って、地道に設計してレビューで
確認するしかない。

imagix とか確認を支援するツールはあるけど。

103デフォルトの名無しさん2012/10/13(土) 22:12:39.46
>>101
やんないと、他に仕事ないんで・・・・

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

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




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

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

例2
スレッド再開時の手順は、競馬のスタートと同じ
@ゲートを閉じる(送信側mutexロック)
A馬がゲート前に並ぶ(受信側wait)
Bファンファーレが鳴る(signal)
Cゲートが開く(送信側mutex開放)

104デフォルトの名無しさん2012/10/13(土) 23:51:02.32
mutexなんか使わずfuture、promisで凌げ

105デフォルトの名無しさん2012/10/14(日) 17:05:55.79
>>103
転職したほうがよくね
ハロワ通いでもしてみたら

106デフォルトの名無しさん2012/10/14(日) 18:33:06.95
まず10年間C++を勉強しろ

107デフォルトの名無しさん2012/10/14(日) 20:43:53.62
>>106
C++関係ないやん

108デフォルトの名無しさん2012/10/15(月) 01:03:58.39
>>103
比喩を作ることができるならすでに理解できてるんじゃないの?ってことで、
結局比喩は不要だよねって流れにならないのかな。

109デフォルトの名無しさん2012/10/15(月) 09:17:51.40
結局無理てことか、初心者というより基本が

110デフォルトの名無しさん2012/10/21(日) 14:23:48.88
>>103
とにかくソースコードをきれいに書け
そうすれば、ソースコードが間違いを教えてくれる

111デフォルトの名無しさん2012/10/21(日) 14:42:59.60
>>110
> そうすれば、ソースコードが間違いを教えてくれる

おっ、なんか響きがいい言葉だな。

112デフォルトの名無しさん2012/10/21(日) 23:06:50.68
Joel on softwareの和訳ページ『間違ったコードは間違って見えるようにする』
を紹介しようと思ったが今ちょっと繋がらないようなので原文で読んでちょ↓↓↓
http://www.joelonsoftware.com/articles/Wrong.html

113デフォルトの名無しさん2012/10/26(金) 20:45:55.33
教えてください

g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の
効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?

114デフォルトの名無しさん2012/10/28(日) 11:59:56.78
gdb

115デフォルトの名無しさん2012/10/28(日) 21:28:29.42

ジ  ハ ,,ハ
デ (;゚◇゚)z
!?

116デフォルトの名無しさん2012/12/05(水) 09:54:15.94
プロファイラでわかるのはどの部分が処理時間の何%を使ってるか
ぐらいであって、スレッドの動作効率なんていう個人の価値観みたい
なものは測定できんだろ。

117デフォルトの名無しさん2012/12/31(月) 15:20:38.31
C#です。
C#ではローカル変数にvolatileを付けられませんが
以下の場合、最適化でスレッドの変更が反映されない場合はありますか?

var init = new ManualResetEventSlim(false);
int val = 0;
var t = new Thread(() =>
{
 val = …; // valに何らかの値を入れる
 init.Set(); // valを初期化したことを知らせる
    :
 // スレッドの処理が続く
};

t.Start();
init.Wait(); // スレッドでvalが初期化されるまで待つ
// valを使う。スレッドでの変更が反映されている?

118デフォルトの名無しさん2012/12/31(月) 16:48:21.02
あります

119デフォルトの名無しさん2012/12/31(月) 19:09:35.15
>>118
どういった理由でしょうか?

http://www.albahari.com/threading/part4.aspx
>The following implicitly generate full fences:
>Setting and waiting on a signaling construct

という記述を見つけたのですが、これによれば
valへの書き込みをinit.Set()より後に、valからの読み込みをinit.Wait()より前に
という事は行われないように思えるのですが。

120デフォルトの名無しさん2013/01/01(火) 04:47:40.84
判ってるのに質問するなボケが

121デフォルトの名無しさん2013/01/01(火) 12:37:44.23
それを否定されたから理由を聞いてるんじゃないのか

122デフォルトの名無しさん2013/01/04(金) 04:09:28.62
C#が自ら自身の仕様を質問すること自体が。
まぁ、人間だって自身についてどれだけ知っているか怪しいもんだが。

123デフォルトの名無しさん2013/01/05(土) 12:19:18.18
>>96
の発言で思い出した。
GCDといえば、最近WindowsとLinuxにも移植されたっぽいんだよね。
http://opensource.mlba-team.de/xdispatch/docs/current/index.html

pThreadとかWin32スレッドをローレベルで使うよりお手軽な気がする。
ちょっと試してみるわ。

124デフォルトの名無しさん2013/01/05(土) 18:17:06.97
123だけど、
XDispatchだが、Windowsであっけなく使えた。
こりゃいいぜ。Win、Mac、Linuxで同一ソースでGrand Central Dispatchが使える。
マルチスレッドプログラミング新時代到来って感じだw

125デフォルトの名無しさん2013/01/08(火) 19:15:30.57
XDispatchの導入記事を書いてみた。
https://docs.google.com/document/pub?id=1miIRZh8QteYzjIiU7GjcGSshTp470qHbRQUh0wf12Sw

突っ込みどころあったらご指摘よろ。

126デフォルトの名無しさん2013/01/08(火) 20:13:02.13
libdispatch + α、って感じなのか

127デフォルトの名無しさん2013/01/09(水) 01:22:43.52
>>126
そうみたい。
基本的にはマルチプラットフォームでやりたい場合は${ ~ }の記法とautoを使えばオッケー。
他にも標準のlibdispathには無い機能とか、Qtユーザー向けのQtDispatchとかあるみたいだけど、そこまではまだ調べられてない。
時間があったらもっと調べてみて、追記してみるよ。

128デフォルトの名無しさん2013/01/30(水) 19:59:09.23
Win32でのプロセス間リソース共有の仕方で悩んでます

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

余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
(定性的な評価=プロファイルで調べろは無しでお願いします)
自分は「重さ:Mutex>>>>Event>>>>>>>CriticalSection」というイメージがあるので、
2のマルチスレッドのコンテキストスイッチの重さを考慮しても1の方が重いのではないかと考えています

129デフォルトの名無しさん2013/01/30(水) 20:42:56.62
(゚Д゚)ハァ?
Mutexを奪い合えばいいだけだし。

130デフォルトの名無しさん2013/01/30(水) 21:22:17.63
Event vs. Pollingは宗教戦争

131デフォルトの名無しさん2013/01/30(水) 21:52:45.99
何もすることがなきゃ寝て待ってればいいだけ
何かしたけりゃイベント来るまでしてればよかろう

132デフォルトの名無しさん2013/01/31(木) 08:42:39.84
Mutexが重いんじゃなくてポーリングが重いんだろ
イベントやメッセージ等の非同期通知が使えるなら、そっちのほうが軽いのは当然

133デフォルトの名無しさん2013/01/31(木) 22:24:51.03
>>128
> Win32でのプロセス間リソース共有の仕方で悩んでます
winすれで聞いたら
> 余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?

134デフォルトの名無しさん2013/02/01(金) 07:29:56.93
効率を気にする香具師が2chで質問するとかもうね

135デフォルトの名無しさん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

この順番が逆になることあり、てことだよね?

136デフォルトの名無しさん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 の前に持ってきても結果は変わらないはず。

137デフォルトの名無しさん2013/02/18(月) 21:54:23.31
>>135
WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。

でいいかと。

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

別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。

139デフォルトの名無しさん2013/02/18(月) 23:53:52.86
>>135
MSDNのほうが正しい。
昔はIntelのdeveloper manualの記述が曖昧だったこともあり、
間違った解説が結構ある。

>>136-138
マルチスレッドでもRAW以外は入れ替わらないよ。

140デフォルトの名無しさん2013/02/19(火) 07:57:34.41
>>139
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。

141デフォルトの名無しさん2013/02/19(火) 09:15:14.16
lockプリフィックス使うんじゃあ

142デフォルトの名無しさん2013/02/23(土) 20:04:20.23
>>139
そうか、マルチスレッドでもリオーダは無いな。他から割り込まれる可能性があるだけだ。

1431352013/02/23(土) 23:41:17.41
>>136-142さん、さんくすでした。
MDSNが正しかったのですか。

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

この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。

144デフォルトの名無しさん2013/02/24(日) 10:17:55.94
ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。

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

マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。
他のプロセッサに割り込まれて困る部分にはlockで保護するとか。

145デフォルトの名無しさん2013/02/26(火) 14:50:30.35
Java の資料だけど「コンパイラ開発者のためのJSR133クックブック」ってのはどう?

146デフォルトの名無しさん2013/02/27(水) 12:54:04.48
>>145
邦訳版はダメ。
肝心のアーキテクチャ毎の表などが古いままで間違っている。

147デフォルトの名無しさん2013/02/27(水) 23:21:29.29
RafterWってシングルスレッドなら絶対安全?
途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと?
実行cpuが変わることあるかしらないけど

まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か

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

普通に入れ替わるだろ。
切替前に読み込んだ情報は、違う CPU でもちゃんと復帰するから
問題ないはず。

149デフォルトの名無しさん2013/03/03(日) 20:26:49.52
>>148
書き方が悪かった。

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

そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと

150デフォルトの名無しさん2013/03/03(日) 20:30:18.24
>>149
ああそういうことか、それは大丈夫だと思うよ。

151 ◆0uxK91AxII 2013/03/03(日) 22:58:29.83
バーリアー!平気だもーん!

152デフォルトの名無しさん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/

153デフォルトの名無しさん2013/03/04(月) 09:03:05.32
マルチコアでないマルチプロセッサ構成で、
外部キャッシュや主記憶のシステムコントローラが、
CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。
Windowsではこうゆうハードウェア構成は想定してないはず。

154デフォルトの名無しさん2013/03/04(月) 10:40:54.32
>>153
違うよ。全然違うよ。
とりあえず、これでもじっくり読め。
msdn.microsoft.com/ja-jp/magazine/jj883956.aspx

155デフォルトの名無しさん2013/03/04(月) 11:45:37.38
ところでmfenceは何でSSE2の制御命令に分類されてるの?

156デフォルトの名無しさん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

157デフォルトの名無しさん2013/03/11(月) 14:35:12.41
>>155
xFENCE命令はMOVNTPS, MOVNTPD,などのNon Temporal転送命令向けの機能で、
この系統の命令だけx86のメモリモデルに従わないので専用のFENCE命令が必要となった。
このうちLFENCEとMFENCEは普通のx86命令にも効果があるが、
パフォーマンスがxchgに劣る。

158デフォルトの名無しさん2013/03/11(月) 15:38:43.70
なんでxchgがバリアとして使えるの?

159デフォルトの名無しさん2013/03/11(月) 17:50:17.45
メモリに対するxchgは自動的にlockを伴う

160片山博文MZパンク ◆0lBZNi.Q7evd 2013/06/18(火) 23:59:01.86
確率的にいつ終わるかわからない時間の掛かる処理をマルチスレッドを使って複数同時に
実行させると、シングルスレッドよりも早い時間で終わる確率が高くなると思うが、これについて貴様らはどう思う?

161片山博文MZパンク ◆0lBZNi.Q7evd 2013/06/19(水) 00:04:03.77
ちなみにクロスワード自動作成ソフトを作ってますっ

162デフォルトの名無しさん2013/06/19(水) 01:02:30.98
辞書ひく時間が糞長いから、マルチスレッドやっても大して変わらない

163デフォルトの名無しさん2013/06/19(水) 06:32:32.99
>クロスワード自動作成ソフト

どこらへんを並列化できるのん?

164デフォルトの名無しさん2013/06/19(水) 09:30:45.19
バックトラック乱れ打ちじゃねーの

165デフォルトの名無しさん2013/06/20(木) 07:49:26.95
同じレスを各板に乱れ撃ちする作業だろ?

166デフォルトの名無しさん2013/06/20(木) 15:25:09.57
マルチスレッドにしたら5〜8時間に1回エラーが出るようになった。でもデバックできないよorz

167デフォルトの名無しさん2013/06/20(木) 20:17:10.50
つログ

168デフォルトの名無しさん2013/06/20(木) 22:19:34.34
同期もわかってないのにマルチスレッドにするからだ。

169デフォルトの名無しさん2013/06/20(木) 22:26:19.30
同期とったら並列の意味がなくなりそうでためらうときがあるな
待ち合わせキューにするくらいなら順番に処理した方がましな気がする

170デフォルトの名無しさん2013/06/21(金) 00:07:54.88
つスーパースカラー

171デフォルトの名無しさん2013/06/21(金) 00:28:22.79
粒度変えりゃいいじゃん

172デフォルトの名無しさん2013/06/21(金) 04:34:35.98
マルチスレッドって自作できるんですか?
以前nyの書籍を読んだときに、開発者の人がマルチスレッドを自作したと書いてたような気がするのですが
C言語でも自作できるんですか?

173デフォルトの名無しさん2013/06/21(金) 04:48:19.55
マルチスレッド・マルチタスクで動いているように見せることは出来る。

並列動作させたい複数の処理を細切れにしてちょっとづつ実行して
グルグル回す。

174デフォルトの名無しさん2013/06/21(金) 15:03:05.45
>>173
タイムシェアリングみたいにやるってことですか

175デフォルトの名無しさん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は
マルチタスクの能力を持っていないのが当たり前のようにあり、
これでマルチ動作させるのに当たり前のように使われる手法。

176デフォルトの名無しさん2013/06/21(金) 19:38:33.60
スレち

177デフォルトの名無しさん2013/06/21(金) 19:52:56.34
スレチというほどじゃないんじゃない?

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

スレッドはないけどプロセスのマルチが出来るなら、
パイプなどでプロセス間通信の利用
といったところかな

178デフォルトの名無しさん2013/06/21(金) 20:25:17.31
俺もスレチじゃないと思う

179デフォルトの名無しさん2013/06/21(金) 20:31:18.12
windows 3.1 を思い出すな

180デフォルトの名無しさん2013/06/21(金) 20:41:54.83
ファイバーってレアすぎ

181デフォルトの名無しさん2013/06/21(金) 22:30:00.37
>>175
win31 のことね

182デフォルトの名無しさん2013/06/21(金) 22:38:33.58
気が早いな
まだ8だぞ

183デフォルトの名無しさん2013/06/21(金) 23:18:56.88
2000があるのに…

>>175をタイムシェアリングだと思ってたな。もう少し勉強しよう。

184デフォルトの名無しさん2013/06/21(金) 23:38:19.83
ファイアー少なくてレアすぎ

185デフォルトの名無しさん2013/06/21(金) 23:40:35.43
広義だと含むのとちゃうかな
おさ〜ん的にはTSS(TSO)のホスト端末を思い浮かべるけど

186デフォルトの名無しさん2013/06/23(日) 12:58:55.01
ファイバー使ってみたけど、
フェーズとswitchより
シンプルに書けたよ。

187デフォルトの名無しさん2013/11/22(金) 08:18:08.42
C/C++ で勉強したいのですが、おすすめの書籍などありますか?
もしくは一から学べるようなWebページがあれば教えてください

188デフォルトの名無しさん2013/11/22(金) 09:05:54.07
D の方が良いよ

189デフォルトの名無しさん2013/11/22(金) 13:04:58.77
猫でもわかる

190デフォルトの名無しさん2013/11/23(土) 05:39:10.02
>>188
D のほうが書きやすい?触れたことないのでわからんです
>>189
猫でもわかる は、Web版が俺にはちょっと分かりづらかった記憶が
書籍だとそうでもないのかな

C++のBoostを利用したThreadプログラミングの解説ページがあったので今はそれ見てます

191デフォルトの名無しさん2013/11/23(土) 09:00:39.63
>>190
触ってもいいお

192デフォルトの名無しさん2013/11/23(土) 13:19:59.45
>>191
どれどれ

193デフォルトの名無しさん2013/11/23(土) 13:24:53.59
>>191
ペロペロ

194デフォルトの名無しさん2014/02/23(日) 09:00:04.29
マルチスレッドって自力だとどうやって書くの?

195デフォルトの名無しさん2014/02/23(日) 09:43:27.54
pthread_create()

196KUSO KOTE ◆unko./w.Osri 2014/02/23(日) 10:15:16.84
>>194
std::thread th{
 []{std::this_thread::sleep_for(std::chrono::milliseconds(3000));}
};
std::printf("うんこ\n");
th.join();

197デフォルトの名無しさん2014/02/24(月) 17:57:18.01
例の金子がny作るときにマルチスレッドは自作したんじゃなかったっけ?

198デフォルトの名無しさん2014/02/24(月) 18:45:47.70
なんとかしてこれを読むと良い
ttp://ci.nii.ac.jp/naid/40000002652

199デフォルトの名無しさん2014/02/25(火) 00:18:34.64
>>197
あれ、シングルスレッドだよ。
Windows3.1みたいな方法で複数のタスク回してる。

200デフォルトの名無しさん2014/02/25(火) 06:43:17.74
小学生がBASICで弾の連射実装してるレベルだろ。

201デフォルトの名無しさん2014/02/25(火) 12:01:20.77
グリーンスレッドとは違うの?

202デフォルトの名無しさん2014/02/25(火) 17:16:14.73
グリーンスレッドなんて初耳。wikip見たらなんかトンデモな説明なんだが。
これは誰が言い出したんだ? バズワードくさい。

203デフォルトの名無しさん2014/02/25(火) 17:27:19.90
レッドスレッド、ブルースレッドはあるのでしょうか?

204デフォルトの名無しさん2014/02/25(火) 17:28:25.61
OSが関与しないスレッドの実装のこと。ウィキペディアの記述がタコってるのはいつものこと。

基本的な理屈はそう難しくないけど、実際にはreadとかでどれかのスレッドがプロセスごと
ブロックされると、他に走りたいスレッドが居ても走れなくなっちゃうので、そのへんを
どう手当てするかがカギ(そういった所だけOSが支援するとか、ブロックする可能性がある
システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。

205デフォルトの名無しさん2014/02/25(火) 17:33:10.94
よく分らんな。スレッドってそもそもOSが定義したものだろう。
アプリ側がたかが永続性のあるサブルーチン程度のものを
勝手にグリーンススレッドって呼んでるだけじゃないのか?

まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。

206デフォルトの名無しさん2014/02/25(火) 18:01:22.88
ユーザースレッド、ユーザ空間でか、なるほど
カーネルスレッド、カーネル空間でか、なるほど
グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん。それこそ>>203

207デフォルトの名無しさん2014/02/25(火) 18:14:03.00
ttp://dl.acm.org/citation.cfm?id=603551
↑これが「小学生がBASICで弾の連射実装してるレベルの話」に見えるのか。
さぞかしスーパープログラマ(笑)様なんだろうな。

208デフォルトの名無しさん2014/02/25(火) 18:19:01.04
その例え話しとその提示したのと繋がりそしてなんでその皮肉になるのか、200文字以内で説明しなさい

209デフォルトの名無しさん2014/02/25(火) 18:49:55.40
wikipediaのスレッドの項目の所まで加筆してやがるww
バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw

そんなのスレッドと何の関係もないのにスレッド言うなや。

210デフォルトの名無しさん2014/02/25(火) 19:49:47.38
結局、逆の意味でのウィキペディア馬鹿か。
一人で言ってろw

211デフォルトの名無しさん2014/02/26(水) 05:28:26.83
グリーンCPU。
グリーンプロセス。
グリーンヒープメモリ。
グリーンスタックメモリ。
グリーン仮想メモリ。
グリーン物理メモリ。
グリーンマルチタスク。
グリーンネットワーク。
グリーンアップル。

おれもいっぱい考えました。

212デフォルトの名無しさん2014/02/26(水) 08:36:42.11
グリーンPC
グリーンディスプレイ

が抜けている

213デフォルトの名無しさん2014/02/26(水) 08:51:32.57
ソイレント

214デフォルトの名無しさん2014/02/26(水) 13:23:35.72
MZ-80Kの話をしてるのかと思ったぜ

215デフォルトの名無しさん2014/02/26(水) 14:34:56.07
>>214
そりゃMZ80Cだ!
MZ80Kはモノクロだ!

216デフォルトの名無しさん2014/02/26(水) 17:24:33.12
> ユーザースレッド、ユーザ空間でか、なるほど
> カーネルスレッド、カーネル空間でか、なるほど
> グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん

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

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

以上のことが何も理解できないバカには、なにもかもがバズワードに見える。

217デフォルトの名無しさん2014/02/26(水) 17:25:22.57
バカですがなにか?

218デフォルトの名無しさん2014/02/26(水) 17:49:55.02
命名の由来のことなのに、Wikipediaから意訳したようなのを偉そうにのたまう、他人を馬鹿呼ばわりする自称天才様w
天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw

219デフォルトの名無しさん2014/02/26(水) 18:13:53.06
> バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
>
> そんなのスレッドと何の関係もないのにスレッド言うなや。

この威勢はどこ行ったのかなぁw

220デフォルトの名無しさん2014/02/26(水) 18:31:45.02
>グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
>スレッドAPIの実装を指す。

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

WEB2.0と変わらんレベルの造語。
どうせまたジョブスオタクの低脳営業SEが言い出したんだろう。

221デフォルトの名無しさん2014/02/26(水) 18:36:03.83
スレッドの定義ってなんだ?

222デフォルトの名無しさん2014/02/26(水) 18:38:20.17
コイツの脳内ではシステムコールで実装されたものだけがスレッド、という定義なんだろう。
聞くだけ無駄だよ。

223デフォルトの名無しさん2014/02/26(水) 18:43:07.52
>>221
OSが管理する最小の実行スタック。

224デフォルトの名無しさん2014/02/26(水) 18:44:25.59
>>222
ではキミのスレッドの定義は?

225デフォルトの名無しさん2014/02/26(水) 19:01:36.43
222じゃないけど、スレッドっていうのはプログラムを実行する最小単位のことでいいんじゃないかな
OSが管理しているかどうかは問わない

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

OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で
抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?

226デフォルトの名無しさん2014/02/26(水) 19:17:09.57
実行スタックってなんだ、って思ったらウィキペディア(英語版含む)でそんな表現を使ってるのか。

一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。

227デフォルトの名無しさん2014/02/26(水) 20:45:20.03
>>225
そんなトンデモ言われてるも議論する気にもならん。
じゃあ、関数もスレッドなんですね。

もうアホかと。しかもJavaの〜とかふざけてるとしか。

228デフォルトの名無しさん2014/02/26(水) 21:45:14.58
ワロタw

229デフォルトの名無しさん2014/02/26(水) 21:46:50.48
中途半端に脳内完結してるんだろな

230デフォルトの名無しさん2014/02/26(水) 21:49:16.49
グリーンスレッド言ってた >>222 が定義を言わず逃げちゃった。

グリーンラナウェイ。

231デフォルトの名無しさん2014/02/26(水) 22:31:24.56
ファイバー、タスク、ユーザーレベルスレッドと呼ばれ方はあるが
スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ
OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ
もしやOSを書いたことも言語処理系を書いたこともないのか?

232デフォルトの名無しさん2014/02/26(水) 22:43:21.83
意味負

233デフォルトの名無しさん2014/02/27(木) 06:36:49.81
>>227
JavaのThreadクラスの何処がふざけてるんだ?

234デフォルトの名無しさん2014/02/27(木) 07:43:24.03
>>231
さっさとおまえの定義を言えよ、低脳。

235デフォルトの名無しさん2014/02/27(木) 07:47:45.64
もはや人格攻撃しかできないモードに縮退したか。

236デフォルトの名無しさん2014/02/27(木) 07:49:46.46
POSIXのスレッドAPIを実装したものがスレッド、という定義でいいだろ。

237デフォルトの名無しさん2014/02/27(木) 07:54:15.34
トンデモグリーンスレッド連呼してたのにそのスレッドの定義聞いたら答えないで
逃げ回ってるんだからもはや人格の問題でしかない。

クズである。

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

自分がクズだろ。

239デフォルトの名無しさん2014/02/27(木) 08:56:57.51
>>237
自己紹介乙、でどうでしょう

240デフォルトの名無しさん2014/02/27(木) 09:11:19.33
>>238
その定義ってどれ?w いいかげにんしろよ、クズ。

241デフォルトの名無しさん2014/02/27(木) 10:03:13.14
いい加減スレチ

242デフォルトの名無しさん2014/02/27(木) 12:12:54.02
グリーンスレッドはどう考えてもスレッドじゃないからな。
スレチ。

243デフォルトの名無しさん2014/02/27(木) 12:47:18.23
コンテキストの切り替えが出来るならスレッドの範疇でいいとちゃうの
LWTやFiberも範囲でいいだろ

244デフォルトの名無しさん2014/02/27(木) 15:48:00.75
Java屋は馬鹿だからな。なに言っても無駄。

245デフォルトの名無しさん2014/02/27(木) 17:43:54.80
馬鹿でわるかったなー

246デフォルトの名無しさん2014/02/27(木) 18:44:32.81
キチガイに触るな
居座っちゃうだろ

247デフォルトの名無しさん2014/02/28(金) 03:22:01.11
マルチスレッドとタイムシェアリングは違うの?

248デフォルトの名無しさん2014/02/28(金) 04:10:21.51
>>247
まずプロセスとスレッドの違いを理解してから

249デフォルトの名無しさん2014/02/28(金) 06:26:56.06
まずグリーンプロセスとグリーンスレッドの違いを説明してほしい。

250デフォルトの名無しさん2014/02/28(金) 22:47:18.43
グリーンスライムよりは手強そうなイメージ

251デフォルトの名無しさん2014/03/01(土) 06:43:57.25
グリーンプロセス()

252デフォルトの名無しさん2014/03/01(土) 13:24:07.27
このスレはカーネルレベルでの実装オンリーのスレになりました、ってことでFAね。
あるいは「カーネル型」のw

253デフォルトの名無しさん2014/03/01(土) 13:27:09.68
まだいるのかグリーンスレッド君

254デフォルトの名無しさん2014/03/01(土) 14:11:27.38
まだいるのかカーネル至上主義者君

255デフォルトの名無しさん2014/03/01(土) 14:14:20.18
v-sync割り込みでマルチタスクだお〜
DOS至上主義者が通りますよ〜

256デフォルトの名無しさん2014/03/01(土) 19:50:36.19
[要出典]

257デフォルトの名無しさん2014/03/01(土) 21:16:37.40
>>255
マウス用割り込みの方が良い。

258デフォルトの名無しさん2014/03/02(日) 21:38:31.73
マウスの付いてるパソコンはカッコ悪い

259デフォルトの名無しさん2014/03/02(日) 21:41:29.98
わーるかったな

260デフォルトの名無しさん2014/03/06(木) 00:31:59.51
マルチスレッドって使えるところが限られてる

261デフォルトの名無しさん2014/03/08(土) 13:27:50.88
これからマルチスレッドの勉強をしようと思うんだけど、
参考になるサイトとかコードとかを教えて欲しい。

特にワーカスレッドを複数立て、たくさんのデータブロックを順に渡して処理させるようなサンプルとか。
ネットを検索しても、スレッドが延々と動きつづけるか、処理が終われば使い捨てるものばかりで、
処理の終わったワーカスレッドに次のデータを渡して連続して処理させるものが見つからない。
また、可変長の演算結果を親スレッドに返す方法についても、どうすればいいのやら。
1個の結果データは固定長だけど出てくる個数が可変なので、固定長の電文を複数投げるようなイメージでも可。

動作環境はWin7-x64で、VC++を使いマルチコアCPUのコア数分ワーカスレッドを立てようと思う。
うちのは6コアなので、単純計算で6倍弱には高速化できると思う。

処理内容の原理試作としてシングルスレッドのDOSアプリとして組んで、鍵値に5を与えて動かしてみた結果、
データブロック数は320万個余り、データブロック1個あたりの演算結果はゼロ〜100KBと幅があるw
そして総処理時間の見込みは60〜150時間(まだ終わってない)。
鍵値を6にするとブロック数も処理時間も莫大に跳ね上がるから、
たぶん1台のPC内で完結させようとしても終わらない。

262 ◆0uxK91AxII 2014/03/08(土) 15:25:57.27
使い捨てと使い回しで、クロックにして1k~2kくらいの差が有るかどうかだから、使い捨てでOK。

263デフォルトの名無しさん2014/03/08(土) 15:49:40.12
HotspotVMは?
と無茶振りしてみる

264デフォルトの名無しさん2014/03/08(土) 15:57:35.44
VCならOpenCLかC++AMP使えば良いんじゃね
CPUとGPUで切り替えも出来るし
CPUだけならPPLでも

265デフォルトの名無しさん2014/03/08(土) 16:20:54.15
VS2013か2012で、C++11のstd::threadとblockingできるqueueとstd::futureあたりを使えばいいんじゃないかな。

266デフォルトの名無しさん2014/03/09(日) 12:57:11.91
>262-265
トン

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


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

現状のx86コード、シングルスレッドでどうやら鍵値5の処理を70時間以内で終われそうな予感。
処理結果のファイルを分割し過ぎて恐ろしい数のファイルを生成しちゃってるので、
マルチスレッド化の際にはもっと纏めてしまわないとなぁ。
鍵値6は複数台のPCへの分散処理とかGPU処理とかを真面目に考えないと無理そうだけど。

267デフォルトの名無しさん2014/03/09(日) 17:54:14.90
そこまで仕様が決まってるならさっさと書けよって話だが。

268デフォルトの名無しさん2014/03/09(日) 19:14:48.84
自慢

269デフォルトの名無しさん2014/03/09(日) 19:44:21.54
なんの?w

270デフォルトの名無しさん2014/03/09(日) 21:24:29.64
典型的なコード書けない君だったか。

271デフォルトの名無しさん2014/03/09(日) 21:29:22.95
>>261
OpenMPのparallel forで分割するだけでおk

2722652014/03/10(月) 02:53:54.21
>>271
もしも、それで済む用件だったら、一番楽だね。
VS2012と2013なら、無料版でもOpenMP使えるし。
手元のコードでOpenMPでforループ2048周をi7-3760Xで6倍速度くらい。
CUDAで780Tiで2048*2048cudaスレッドでさらに18倍くらいだった。

273デフォルトの名無しさん2014/03/10(月) 06:30:44.63
266の処理は、OpenMPのparallel for schedule (dynamic)でできる

274デフォルトの名無しさん2014/03/10(月) 12:00:01.04
ここはおまえの日記じゃねーぞ。

275デフォルトの名無しさん2014/03/10(月) 17:32:15.14
スレッドの数って
CPUのコア数より多くしても意味ないよね?

276デフォルトの名無しさん2014/03/10(月) 17:42:02.40
>>275
スレッド内の処理でI/O待ちとかしてる場合は意味あるんじゃないの?

277デフォルトの名無しさん2014/03/10(月) 18:28:34.27
ひたすら計算し続けるなら意味はない。
計算メインというだけならコア数の倍ぐらいまでは
スループットが上がることはある。

278デフォルトの名無しさん2014/03/10(月) 19:11:36.58
書きたいアルゴリズムを自然に書けるという理由で
マルチスレッドに意味があることはある
GUIなんかそうだろうね

279デフォルトの名無しさん2014/03/10(月) 19:22:36.70
そんなGUIの実装は見たこと無いです。

280デフォルトの名無しさん2014/03/10(月) 19:40:06.12
GUI スレッドと別に好きなスレッドを立ててうまくやっていけるってことだろうに‥‥
win16 の泣きそうな世界を知らないのか?

281デフォルトの名無しさん2014/03/10(月) 19:46:18.78
それはCUIでも同じだろう。

282デフォルトの名無しさん2014/03/10(月) 21:47:19.99
処理内容・数によるけど大量のパラ処理はCPUのマルチコアやNvidiaのGPGPUからAMDのGPGPUでopenCLが定番になってきたからな
そして、今後はAMDのHSAも定番になるって感じになっているし。

283デフォルトの名無しさん2014/03/11(火) 17:20:13.24
いつGPGPUが定番になってきたんだ。
むしろまじ使えないってスルーされてる感が半端ない。

284デフォルトの名無しさん2014/03/11(火) 20:17:22.02
それは nvidia/cuda

285デフォルトの名無しさん2014/03/13(木) 20:09:50.61ID:pPziPNkQ
インテルのやたらコア数が多い奴にビットコイン掘らせたらよさげよね

286デフォルトの名無しさん2014/03/13(木) 20:31:14.10ID:gEHR9Glb
GPGPUは特定の局面に限って言えば使えるんだが、一般の用途では
その特定の局面が存在しないというかわいそうな技術。

287デフォルトの名無しさん2014/03/13(木) 20:32:14.41ID:gEHR9Glb
ちなみにbit coinのマイナーはGPGPUから専用設計のASICに
主戦場が移った。消費電力が段違いなんだとさ。
GPUでやったら電気代で赤字になりそうだ。

288デフォルトの名無しさん2014/03/13(木) 20:49:30.32ID:/ZWTiswr
>>287
特定用途のみならICにしたほうが良いだろうな。

確かbitcoinでよく使われていたVGAはAMDだったはず。
ゲーム用VGAのGPGPU性能はいまはAMDのほうが良いのかな

289デフォルトの名無しさん2014/03/13(木) 21:06:24.71ID:k4ocBl+v
FPGA経由でASICな。

しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw

290デフォルトの名無しさん2014/03/13(木) 22:02:39.26ID:gEHR9Glb
で、自販機の下に落ちてる100円玉を地道に拾うぐらいなら
ショベルカーでATMごと盗んじゃえってのがマウントゴックス。

291デフォルトの名無しさん2014/03/13(木) 22:18:30.00ID:hR60BOrR
>>290
ワラタ、でもまさにソレ
MtGoxってMTGのカード売りだったと知った時の苦笑いときたら

292デフォルトの名無しさん2014/03/14(金) 16:35:28.14ID:8t3OXl/v
2年ほど前にbitcoin採掘をしていたが
お前らの想像の千倍くらい時間のかかる処理だったし
今もっと難しくなってるから既に個人で掘るのは無理なんじゃね

293デフォルトの名無しさん2014/03/14(金) 16:57:23.89ID:90E4Zs91
で、結局どのくらい掘れた?

294デフォルトの名無しさん2014/03/14(金) 17:00:16.55ID:UFFJd6rH
千倍台で分散する

295デフォルトの名無しさん2014/03/14(金) 17:37:55.81ID:p2oYKy+P
>bitcoin採掘
どういうこと?

296デフォルトの名無しさん2014/03/14(金) 17:57:18.99ID:I0jjMatv
>>295
むちゃくちゃ簡単に言うとBitCoinの正規のビットパターンは計算で求まる、でこれの正しい組み合わせを計算する事を採掘(マイニング)って言うだけの話

297デフォルトの名無しさん2014/03/14(金) 17:59:12.49ID:Sx19eOr2
>>296
ありがとん

298デフォルトの名無しさん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に比べて頭が固定な分だけメモリの利用効率が高そうだったことと、
データの順番には意味がないから逆順になっても問題がないことによるものなので、
別のコンテナを使ったほうがいいなら、それでも構わない。

299デフォルトの名無しさん2014/03/15(土) 00:45:28.81ID:CF1cuZUb
>>298
そもそも一旦メモリに載せる必要があるのか?非同期IOじゃだめ?
どうしても載せなきゃいけないとして、Aはあまり意味がない。
よほど頭の悪い実装をしてなければ、現状メモリを喰ってるってことは
inputよりoutputの方が遅いってことだ。頻度で解決する問題じゃない。
Bの方は、conditon variableでスタックのサイズが一定より大きくなったら
inputを待たす方法が一番簡単じゃないか。

300 ◆0uxK91AxII 2014/03/15(土) 01:15:15.11ID:4evGY2gy
>調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。
常識的に考えてバグ持ち。

>コピーが終わった時点で共用stack占有状態を開放、
ふつーstack<void *>。

301デフォルトの名無しさん2014/03/15(土) 08:03:00.01ID:B9xccETs
バッファに制限を設けて
書き込みが詰ったら待てばいいだけでは

302デフォルトの名無しさん2014/03/15(土) 08:17:50.21ID:kVDIpCQy
リングバッファ、そして新しいバグ

303デフォルトの名無しさん2014/03/15(土) 08:31:05.02ID:xmGMuN0W
リングバッファてメモリが一杯になったらファイルに書き出すように実装するのが普通?

304デフォルトの名無しさん2014/03/15(土) 12:26:30.58ID:GnRScPte
普通じゃない

305デフォルトの名無しさん2014/03/15(土) 13:36:30.86ID:royCDzaU
どうすんの?あふれたら捨てるの?

306デフォルトの名無しさん2014/03/15(土) 13:43:41.30ID:E7qCmrfx
環境によっては勝手にswapしてくれるかもしれない

307デフォルトの名無しさん2014/03/15(土) 14:07:58.75ID:PqTylRc6
>>305
ふつうは>>301の言うように空くまで書き込みを待たせるか捨てる。
待てないような要件ならサイズ固定のリングバッファじゃなく可変のキューを使うなりする。

308デフォルトの名無しさん2014/03/15(土) 14:16:36.02ID:1lWAVkUO
書き出すデータのフォーマットを工夫してサイズを小さくするとか、
書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。

309デフォルトの名無しさん2014/03/15(土) 14:17:30.95ID:y0lYdZ+H
>>307
ありがとう、バッファーの構造を別にして最大容量は設定しないといけないということですね

>>306
後出しになるけど、リアルタイムシステムのデータ収集のようなもの考えていたので

310デフォルトの名無しさん2014/03/15(土) 16:35:55.25ID:x1nRJa7F
いるんだよなー、そもそも不可能なことを引き受けちゃう奴って

311デフォルトの名無しさん2014/03/15(土) 20:31:13.52ID:9prhxYaH
てへ、昔の話がねた

312デフォルトの名無しさん2014/03/15(土) 22:04:58.47ID:B9xccETs
金あるならFusion-ioを使えばいい
圧縮で減るようなデータならsnappyで圧縮する

313デフォルトの名無しさん2014/03/15(土) 23:24:57.03ID:Jbm5xDHA
普通のリアルタイムではありえん

3143132014/03/15(土) 23:26:35.57ID:Jbm5xDHA
訂正 以上です

315デフォルトの名無しさん2014/03/16(日) 01:00:35.01ID:67pIoXcC
リアルタイムシステムというのがRTOSを使っているという意味なら
送信側か他のタスクがwait入れてなくて書き込みタスクが動いていないとかってバグじゃないかな
>>313
時代は変わりCPUを使って圧縮したほうがIOが減って低レイテンシにできる

316デフォルトの名無しさん2014/03/16(日) 01:13:20.61ID:CvhR8B+T
リアルタイムっていうのは入力があってから何ms以内に応答を
返せなければならないみたいなシステムのことでしょ。
コンピュータ制御の工作機械で応答が遅くて削りすぎましたとか
許されないから。

317デフォルトの名無しさん2014/03/16(日) 01:14:58.23ID:Va0mC41/
>261だけど、概ね期待通りの動作になってきた
速度面でも、現在使用中のPCでシングルスレッドだと70時間ほど掛かってたから、
マルチスレッド化で6コアに分散して細部の調整込みで10時間切れれば恩の字と思ってたのに、なんと4時間半を切れたw
最新のCPUを使えば2時間も夢じゃないかも

あとは演算処理orデータのやり取りのバグを潰せばほぼ完成
(結果の個数が少し足りない)

318デフォルトの名無しさん2014/03/17(月) 12:29:47.16ID:iella/tJ
シングルスレッドのまま細部の調整とやらだけでどこまで行くのやら

319デフォルトの名無しさん2014/03/17(月) 15:11:57.25ID:ot8TfsyN
どんだけ時間がかかってるのやら。

320デフォルトの名無しさん2014/06/13(金) 00:28:43.87ID:cRyKxN+T
共有/排他ができるロックと条件変数があるとき、これらを使って
共有から排他にエスカレーションできるロックを構成することってできる?

321デフォルトの名無しさん2014/06/13(金) 01:34:28.10ID:+YSiec3A
ロックとか条件変数って排他するものだよね。共有できるロックって何?
RCUのこと?

322デフォルトの名無しさん2014/06/13(金) 08:49:59.19ID:cRyKxN+T
ええと、いわゆるread-writeロックのこと。

323デフォルトの名無しさん2014/11/06(木) 22:37:47.07ID:iaZsweTc
マルチスレッドは馬鹿には無理
馬鹿は使ったほうがいいところでマルチスレッドを使わずに
使わないほうがいいところっ使ってややこしくしたりする

324デフォルトの名無しさん2014/11/06(木) 23:24:42.11ID:ETjlkHcn
負荷分散とか難易度高なのにね

325デフォルトの名無しさん2014/11/09(日) 01:27:34.76ID:UGYkYxzf
スレッディング・ビルディング・ブロックについて勉強し始めた所なんだけど、どうなの?
理解して使うと安全で早くなりそうだとは思ったが、メモリ処理の効率とかどうなるんかな?
とか思ってる所なんだけど・・・

326デフォルトの名無しさん2014/11/09(日) 07:37:34.59ID:SGm17f1c
安全にするには、ある程度やった人しか...

327デフォルトの名無しさん2014/11/09(日) 22:48:01.80ID:wyNvyEnQ
メモリ処理の効率って具体的にどういう点?
mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?

328デフォルトの名無しさん2014/11/10(月) 09:36:09.81ID:W8sKwQAR
オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな

>>325
コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ

329デフォルトの名無しさん2014/11/12(水) 14:11:39.04ID:nS55KI9v
基礎的な質問で申し訳ないのですが
同じ変数に複数のスレッドがアクセスしてはいけないのはわかりますが
同じコードに複数のスレッドがアクセスするのはいいのでしょうか?
例えば何の変数にもアクセスしない関数を複数のスレッドが同時実行するのはいいのでしょうか?

330デフォルトの名無しさん2014/11/12(水) 14:21:32.89ID:Tjo57cUc
ダメな理由でも探してるの?

331デフォルトの名無しさん2014/11/12(水) 14:31:27.32ID:nS55KI9v
>>330
今書いているプログラムで
C#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って

332デフォルトの名無しさん2014/11/12(水) 14:35:31.55ID:Tjo57cUc
C#のシグナルってよーしらんけど
エラーが出るってことは、質問の内容と違うことやってるんじゃないの

333デフォルトの名無しさん2014/11/12(水) 15:18:29.39ID:ghkKScBM
同期オブジェクトを保持している変数を上書きしていそうな気がするんだが

334デフォルトの名無しさん2014/11/12(水) 16:32:42.96ID:yNtQ/r84
いろいろ分かってないだけだろう

335デフォルトの名無しさん2014/11/13(木) 06:29:27.90ID:w/Cn+ODk
ライブラリがマルチスレッドに対応してないだけかと

336デフォルトの名無しさん2014/11/13(木) 06:35:25.00ID:4ACzZkWI
/MT

337デフォルトの名無しさん2014/11/13(木) 13:44:55.73ID:t6y7WFqt
C#ならエラーメッセージやスタックトレースが出てるだろ

338デフォルトの名無しさん2014/11/15(土) 11:02:51.29ID:JwZZHuNb
>>329
同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数とstatic変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ

339デフォルトの名無しさん2014/11/16(日) 00:17:15.94ID:lWtIBSfv
同じ変数に複数のスレッドがアクセスするならクリティカルセクションが楽だ

340デフォルトの名無しさん2014/11/16(日) 19:55:00.63ID:9ZsvKJox
linuxですがスレッドで同じファイルに書き込む場合、競合することってありますかね?

341デフォルトの名無しさん2014/11/16(日) 20:11:07.08ID:1qsvk//V
勿論。

342デフォルトの名無しさん2014/11/16(日) 21:20:39.95ID:4XTrCB2a
論外

343デフォルトの名無しさん2014/11/16(日) 21:40:57.77ID:Kyr5+wjo
>>339
もう win32 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?

344デフォルトの名無しさん2014/11/30(日) 17:47:06.48ID:H8djdLBQ
複数のスレッドがひとつのミューテックスのアンロックを待っていた場合、
つぎにどのスレッドがミューテックスを取得するかはランダムですか

345デフォルトの名無しさん2014/11/30(日) 18:09:41.22ID:ddtepLmv
はい
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります

346デフォルトの名無しさん2014/12/01(月) 00:39:51.39ID:Az7+Eliy
いいえ
待っていなかった別のスレッドがちょうどいいところに来てミューテックスを取得していくこともあります

347デフォルトの名無しさん2014/12/08(月) 19:13:20.61ID:PHJZbN+V
スレッドとミューテックスだけ覚えたけど
なにを作ったらいいのかわからんたい

348デフォルトの名無しさん2014/12/08(月) 22:37:39.16ID:PHJZbN+V
チャット作ることにしました

349デフォルトの名無しさん2014/12/08(月) 22:57:10.96ID:x3KHTevM
consumerとproducerみたいのがいいんじゃないのかなと思ったけど、
チャット作ることにしたのね
がんばってください

350デフォルトの名無しさん2014/12/08(月) 23:08:56.71ID:PHJZbN+V
>>349
チャットで詰まったら気分変えてConsumer-Producerにも挑戦してみます
あざす

3513502014/12/09(火) 00:23:00.21ID:MJarMgeM
>>349
いや、ありがとうございます

352デフォルトの名無しさん2015/05/29(金) 22:45:34.32ID:gXnjRwZ6
Win8.1 Cygwin64bit g++のpthreadなんですが、マルチコアCPUなのに性能改善しません。
なにか特別なコンパイルオプションがあるとか
特別なライブラリをリンクしなければいけないとかあるのでしょうか。
-lpthreadはつけてます。

353デフォルトの名無しさん2015/05/30(土) 20:09:50.25ID:WwgHsNSJ
エスパー能力はありません

354デフォルトの名無しさん2015/05/30(土) 20:21:35.33ID:h4Yx63EK
そこをなんとかスーパーエスパーでお願いします

355デフォルトの名無しさん2015/05/30(土) 21:18:52.04ID:iD4l02SZ
誠意を見せてください

356デフォルトの名無しさん2015/06/15(月) 23:17:16.10ID:SZnUF3Ky
DISKへのアクセスって並列にしたって意味ないですか?

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

で30秒以上掛かりますが、
之をスレッドを起こしても意味無い?

357デフォルトの名無しさん2015/06/16(火) 00:49:42.46ID:s9cfeU7N
よくわかってないけどDISKの特性によるのかなぁとかいってみる。

358デフォルトの名無しさん2015/06/16(火) 01:06:01.70ID:ILaOeTTR
どういった特性ならどうなるのですか?

359デフォルトの名無しさん2015/06/16(火) 01:31:46.58ID:ZNZkvIJW
読み込みながら処理をしてみたいにな状態でない限りスレッド分けてファイル読むと遅くなるよ(デバイスが別であればまた違うのだが)
純粋にバイナリデータとしてファイルをメモリに丸ごと読み込むのであればスレッド分ける意味ない(CPUとメモリの方がディスクよりも遙かに速い)

360デフォルトの名無しさん2015/06/16(火) 01:39:58.55ID:ILaOeTTR
遅くなる理由はなんですか?

361デフォルトの名無しさん2015/06/16(火) 09:26:39.31ID:gU9w5dQ4
俺様の質問に答えろとさ

362デフォルトの名無しさん2015/06/16(火) 22:30:15.77ID:45Me4wJl
まともに答えるとまた暴れだすだろ

363デフォルトの名無しさん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鹿児島県

364デフォルトの名無しさん2015/08/25(火) 15:16:47.83ID:f9VpmzI5
いまどきのディスクはインターリーブなんか考慮しても意味無いぞ

365デフォルトの名無しさん2015/08/25(火) 23:23:52.89ID:SuXh7n4E
>>364
インターリーブってCPUが遅い時代の話だろ?
セクタリードの後でCPUが処理している間に次に読むべきディスク上の物理セクタが通り過ぎてしまうからシーケンシャルなセクタ処理でなくインターリーブした順序付けのセクタ使うって奴

366デフォルトの名無しさん2015/10/10(土) 23:10:25.42ID:bMLX+QzX
趣味プログラムでInterlockedCompareExchange
で値が交換できた時だけそのスレッドが処理を進められるような感じで
作りこんでいるんだけど、何かこれだと問題ある?
一般的にはクリティカルセクションを使った方がいい的な話を聞くんだけど
sizeof(CRITICAL_SECTION)がチョット大きすぎるので使うのをためらってしまう

367デフォルトの名無しさん2015/10/11(日) 01:12:22.19ID:DeMvW0Ba
>>366
レースする可能性があるくらいじゃね?
まあ、ほとんど問題ないと思うけど。

368デフォルトの名無しさん2015/10/11(日) 01:16:20.15ID:DeMvW0Ba
>>367
間違えた。
レースじゃなくてスタベーションだった。

369デフォルトの名無しさん2015/10/11(日) 10:38:15.80ID:P9PvwsgL

370デフォルトの名無しさん2016/02/06(土) 07:43:27.68ID:DtUiRvEm
int iで++iにミューテックスが必要ってことはiを同時に2つのスレッドが足しても2増えるだけで必要ないと思うんですけど?1しか増えないってこともあるんですか?

371デフォルトの名無しさん2016/02/06(土) 08:26:40.76ID:DtUiRvEm
CPUによってアトムが違うから必要ってことですねわかりました。

372デフォルトの名無しさん2016/02/06(土) 08:57:53.38ID:AVvIsuem
御茶ノ水の博士の設計

373デフォルトの名無しさん2016/03/07(月) 00:30:59.08ID:jKz+oF2h
>>370
Aスレッド:iから1を読み込んで++して2を代入
Bスレッド:iから1を読み込んで++して2を代入
答えは1増える

374デフォルトの名無しさん2016/03/08(火) 01:40:29.32ID:YkHc2UTm
レース状態のことやね

375デフォルトの名無しさん2016/03/20(日) 12:54:59.05ID:upopZnIF
同じcondition_variableでブロックしているスレッドが複数ある場合に、
notify_oneをしたら、どのスレッドが起床するのだろうか。

376デフォルトの名無しさん2016/03/29(火) 08:51:54.17ID:/c8bAcK4
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート

377デフォルトの名無しさん2016/05/20(金) 22:39:11.46ID:/6R1fTEV
>>375
リファレンス読め

378デフォルトの名無しさん2016/05/23(月) 02:01:11.63ID:xOdUGJqd
CAS命令でロックしている部分を
_xbegin _xend やら xxx_HLEAcquireで代用すればCAS命令分のWaitをチャラにできるかと思ったんだけど
結果微妙に遅くなっただけだった
使い方間違っているのかなTSX

379デフォルトの名無しさん2016/12/09(金) 07:26:48.14ID:WzSsU1Dc
マルチスレッドにおける変数の排他処理についてなんだけど、
排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?
読み取り最中に書き換えたり、書き換え最中に読み取った場合にデータが破壊されるというだけの話だよね?

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

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

380デフォルトの名無しさん2016/12/09(金) 09:38:28.68ID:uxrmDz9Z
馬鹿乙

381デフォルトの名無しさん2016/12/09(金) 13:52:04.09ID:GFY666CI
>>379
>>マルチスレッドにおける変数の排他処理についてなんだけど、
>>排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?

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

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

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

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

1bitはこれ以上分割できないので1ビットの半分だけ違う値になる、
ということはありえない。そういう心配をしてるなら大丈夫

382デフォルトの名無しさん2016/12/09(金) 16:50:23.32ID:WzSsU1Dc
ありがとう!
大丈夫かどうかというのは、
排他制御が行われていない変数へのアクセスそのものが原因となってソフトウェアがクラッシュしたり、
OSやハードウェアレベルの問題は起きたりしないよね?って意味

C言語で下位1bitしか使わない排他処理が行われてない変数があり、その1bitをif文で判定して処理を2通りに分ける場合、
必ずその2通りのどちらかになることは保証されるよね?
できるだけ高速化したいから、できるだけ排他処理はしたくない。

383デフォルトの名無しさん2016/12/09(金) 18:10:37.82ID:uxrmDz9Z
やっぱりアホか

384デフォルトの名無しさん2016/12/09(金) 18:37:52.31ID:R3c5DqP6
>>382
馬鹿が書くと機械的に壊れることもあります
ソレノイドが焼損とか日常茶飯事

385デフォルトの名無しさん2016/12/09(金) 21:27:34.75ID:WzSsU1Dc
>>384
どのパーツのソレノイド?
説明してくれ。
パソコンは自作やら修理やらよく頼まれ続けてきてるから専門的な話OKだ。

386デフォルトの名無しさん2016/12/10(土) 23:59:30.12ID:mx8/lQPw
すいません質問します。
Matlobで、
例えば5000×5000の行列をAとして
その10×10の区分行列をBとします。
Aの対角線上にあるBだけを取り出して他が0行列の行列を作るにはどうすればいいですか?
また、各Bの対角要素だけ取り出すにはどうすればいいですか?

387デフォルトの名無しさん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を代入する

388デフォルトの名無しさん2016/12/11(日) 09:12:59.03ID:nmNJ+GHK
アホ

389デフォルトの名無しさん2016/12/11(日) 10:53:35.53ID:PFNTM+nw
>>387
ありがとうございます。やってみます。

390デフォルトの名無しさん2016/12/17(土) 10:53:31.14ID:WxRoohcq
>>381
ウソ乙

391デフォルトの名無しさん2017/03/29(水) 21:36:43.88ID:QetAZaUg
【OS】OSX 10.8.5、Core i5
【言語】 C, C++
【実行環境】 XCode5.1, pthread

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

上記の環境ではマルチスレッドで効率化を図るには、何か設定が必要なのでしょうか。
ざっくりした質問ですがヒントになるようなことでも教えて下さい。

392デフォルトの名無しさん2017/03/29(水) 22:31:24.61ID:urajtArt
マカーか

393デフォルトの名無しさん2017/03/29(水) 23:09:26.86ID:TE60yoif
>>391
プログラムを見ないと分からない。
マカーじゃないから見ても分からないかもしれないけど。

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

ちゃんと作っていて遅いのなら、キャッシュの競合の可能性があるかも

394デフォルトの名無しさん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; }
};

395デフォルトの名無しさん2017/04/02(日) 18:29:20.77ID:mBDn/7kD
書き忘れ >>391 のマカーです。

396デフォルトの名無しさん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 )

397デフォルトの名無しさん2017/05/03(水) 16:23:24.52ID:E3YCeKkn
RelativisticProgrammingを日本語で解説してるとこ、ないかな?

398デフォルトの名無しさん2017/05/04(木) 03:11:44.69ID:N/fwOcUx
++j

新着レスの表示
レスを投稿する