マルチスレッドプログラミングについて語るスレ
■前スレ
マルチスレッドプログラミング相談室 その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】
【言語】
【実行環境】
【その他特記する事項】
探検
マルチスレッドプログラミング相談室 その9
2012/06/15(金) 01:31:57.88
2012/06/15(金) 01:35:25.58
2012/06/15(金) 03:59:42.18
2012/06/15(金) 16:15:07.07
>>前すれ995
そういうオプションがあるのですね,レポートと書き直したソースを添付します.
http://www5.puny.jp/uploader/download/1339744079.zip
pass:giko
potential OUTPUT 依存関係
らしいですが,ググってもよくわかりません.依存関係がないように>>前すれ999のようにpureに書き換えたのですが.
>>前すれ997
これは試しにつけてみただけのものです,やはり使い方が違いますか・・.
そういうオプションがあるのですね,レポートと書き直したソースを添付します.
http://www5.puny.jp/uploader/download/1339744079.zip
pass:giko
potential OUTPUT 依存関係
らしいですが,ググってもよくわかりません.依存関係がないように>>前すれ999のようにpureに書き換えたのですが.
>>前すれ997
これは試しにつけてみただけのものです,やはり使い方が違いますか・・.
2012/06/15(金) 18:14:50.61
gfortran -O3 20120528_fast_pararell_subroutine.f90 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=2
2012/06/15(金) 18:54:01.14
彼女二人と同時にデートする時はマルチスレッドじゃないといけないんだけど
どうすればいいかな
どうすればいいかな
2012/06/15(金) 19:08:46.12
時分割でがんばれ
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];
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];
2012/06/16(土) 12:26:31.55
>>4
ループ間で出力変数に依存関係があるかも、という判断。
○ i, j は value 属性を付け、b は戻り値にする。
○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。
ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (100〜0) で並列化は完了。
ループ間で出力変数に依存関係があるかも、という判断。
○ i, j は value 属性を付け、b は戻り値にする。
○ サブルーチン inv の宣言部に interface で sho_det の引数属性を書く。
ここまでで依存はクリア、反復回数が少ないかも、というようになる。
/Qpar-threshold0 オプション (100〜0) で並列化は完了。
2012/06/16(土) 12:48:12.18
bに依存がないことくらい解析できてもよさそうなのにね
2012/06/16(土) 16:27:05.54
sho_det呼び出しの2重ループで並列化できるの?
2012/06/16(土) 16:52:50.21
双子と付き合う時はマルチスレッドのチンポ子が欲しい。
13デフォルトの名無しさん
2012/06/16(土) 16:54:32.86 クリティカルセクションとかミューテクスって重いんですか?
秒間2500回とかマジキチですか?
秒間2500回とかマジキチですか?
2012/06/16(土) 17:00:15.54
400μ秒は今のパソコン環境でも、厳しいんじゃね
何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
何をしたいかにもよるけど、専用環境作ったほうがハマらんかもね
2012/06/16(土) 17:19:32.25
ロックフリー!
2012/06/16(土) 17:33:56.57
2012/06/16(土) 21:17:30.95
18デフォルトの名無しさん
2012/06/16(土) 22:25:28.46194
2012/06/16(土) 23:07:53.93 申し訳ありません,並列化ですが,解決しました.
/Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました.
ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです.
このループだけ並列化したいっていうような指定ってできるのでしょうか?
/Qpar-threshold(並列化のしきい値)の値を100から20ぐらいまで下げたら5スレッドで実行されました.
ただ,ものすごく,計算が遅くなってしまって,なおかつ不必要なところまで並列化されてしまったようです.
このループだけ並列化したいっていうような指定ってできるのでしょうか?
2012/06/16(土) 23:18:15.13
2012/06/17(日) 02:24:44.41
答え教えてもらって、闇雲にやるのが今風なの?
2012/06/17(日) 02:28:46.34
それって、単純ループがスレッド化されただけじゃねえの?
2012/06/17(日) 03:56:01.16
実行環境に寄って自動で最適化して欲しいよね。
ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。
4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
ちょっと違うけどjitみたいに自分でプロファイルとって実行処理罹る所を重点的に最適化とかさ。
4coreの環境と64coreの環境といちいち最適化するのめんどくさい。
2012/06/17(日) 04:08:44.71
core数増えたから、早くなるってわけでもないでしょうに
2012/06/17(日) 06:28:14.10
効率が悪かろうと並列化したいループには !DEC$ PARALLEL ALWAYS
※ 依存性に目をつぶれという指示ではない
> 64core の対応
3日かかる計算を1時間に押し込みたいなら、やる価値はある。
1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。
そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。
スケールするとかしないとかはそういう話。
※ 依存性に目をつぶれという指示ではない
> 64core の対応
3日かかる計算を1時間に押し込みたいなら、やる価値はある。
1分の処理が1秒になることを期待するなら、最適化する時間のほうが長い。
そもそも、大体の 64core での性能問題は 4core では小さくて見えないだけ。
スケールするとかしないとかはそういう話。
2012/06/17(日) 14:48:00.38
速くなってくれないと高額な多コア買った意味無いんだが。
2012/06/17(日) 19:02:58.50
それは、プログラム作ったベンダーに言え。
場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
場合によっては、どれくらい高速化するかの見積もりくらい出してくれるだろ。
2012/06/17(日) 20:27:37.75
分散処理できるように考えるほうが難しいのに
道具によってはできることとできないことがあるでしょ
道具によってはできることとできないことがあるでしょ
29デフォルトの名無しさん
2012/07/06(金) 19:30:56.61 多コア化すれば、将来は、割込優先スレッド用コア、時分割スレッド用コア、OS用コアに別れて、それぞれのコアが空き時間でどうでもしてくれスレッドを処理するようになる気がする。
そうしないとスケジューリングに費やすコストが無駄だ。
そうしないとスケジューリングに費やすコストが無駄だ。
2012/07/06(金) 19:38:42.21
あまり賢そうに見えないな
31デフォルトの名無しさん
2012/07/06(金) 19:45:56.15 gpuが標準的になった時点で、非対称プログラミングが当たり前になるから、コア間に使い分け、役割分担が発生するのは必然じゃないかな。もっともどのコアがどの役割をやるかは、スケジューラが決めることになるけど。
2012/07/06(金) 19:58:44.83
標準的な入出力は動くコア決めたほうがいいかもしれんけど
プロセス、スレッドはどのコアで動こうが関係無いような
どうせ、暇な?コアに割り当てられるだろうから
プロセス、スレッドはどのコアで動こうが関係無いような
どうせ、暇な?コアに割り当てられるだろうから
2012/07/06(金) 20:28:22.95
linuxだとこういう指定が出来るようだ
ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html
ttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html
2012/07/06(金) 22:01:45.18
それぐらいは WindowsNT 4.0 からあるが。
SetProcessAffinityMask
http://msdn.microsoft.com/ja-jp/library/cc429334.aspx
SetProcessAffinityMask
http://msdn.microsoft.com/ja-jp/library/cc429334.aspx
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()の使い方を間違えている?)
関係性のない処理を行う2つのスレッドA、Bを同時に動かし始めたいのですが、
・スレッドAの待ち状態にpthread_cond_wait(&cond, &mutex1);
・スレッドBの待ち状態にpthread_cond_wait(&cond, &mutex2);
として(condは同じで、mutexが異なる)、これらを動かし始めるために別スレッドで
pthread_cond_broadcast(&cond);
をコールしたのですが、思ったとおりに動いてくれません。
なにがいけないのでしょう?
(pthread_cond_wait()の使い方を間違えている?)
2012/07/21(土) 14:57:02.99
馬鹿には無理
2012/07/21(土) 15:18:21.14
>>36
broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
broadcast を受ける側のスレッドは、 broadcast するときに wait していなければいけない
broadcast したときに wait しているスレッドがいなければ、無駄撃ちになる
通常 cond が mutex と一緒に使われるのは、ターゲットが wait に入る一瞬前に broadcast を撃って運悪く外れたりするような事態を回避し、確実に当たるようにするため
思ったとおりに動いてくれないというのなら、あなたの使い方には何か誤りがあって、そういった問題を防ぎ切れていないのだろう
39デフォルトの名無しさん
2012/07/21(土) 15:33:58.32 >>38
素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね
このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には
それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう?
ともかく、ありがとうございました
素朴に待っていると思っていたスレッドが、実は待っていないせいで
シグナルがすり抜けていたということですね
このての、「関数を素朴に並べただけでは思いどおりに動作しない」問題の対応方法には
それぞれに決まった「お作法」「イディオム」がありそうな気がしますが、どうなんでしょう?
ともかく、ありがとうございました
2012/07/21(土) 15:42:20.05
2012/07/21(土) 15:49:59.71
>>40
頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・
自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので
素朴なつくりでもそれなりに動いたかもしれませんが、
再現性のないトラブルが発生する前にそういう問題を認識できてよかったです
ありがとうございました
頭で考えたアルゴリズムを実験するときに「安全装置」を省略したせいで
かんたんなこーどなのにはまるなんてありそうですね・・・・
自分が使いたい本番コードは、各スレッドの処理に十分なマスがあるので
素朴なつくりでもそれなりに動いたかもしれませんが、
再現性のないトラブルが発生する前にそういう問題を認識できてよかったです
ありがとうございました
2012/07/21(土) 16:06:39.87
>>41
去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
去年の暮れ辺りに悩んでいたのが、mutexでスレッドプールを管理していたツールなんだよね。
mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
自分が待たずにロックしちゃうことに。
メインスレッドでmutex_unlock(); mutex_lock()のように書いているのにunlockしたあと
lockするところまで実行できないなんてちょっと想像しにくいぞ。
# 詳細不明だけど、unlockした時点でプールスレッドがスケジュールされてメインスレッドがスケジュールからはずされるっぽい。
2012/08/25(土) 18:20:47.36
いつでもどんな時にでも
スケジュールから外されても動かされても
大丈夫なように作るのが鉄則
スケジュールから外されても動かされても
大丈夫なように作るのが鉄則
2012/08/26(日) 08:54:03.71
そうそう。
だから、Web上のサンプルは当てにならない。
だから、Web上のサンプルは当てにならない。
2012/08/26(日) 09:32:08.49
そもそも並列化したいのは高速に処理したいからじゃん?
サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる
まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
サンプルにかならずあるsleep()を消すと、途端にまともに動かなくなる
まともに動かなくなるならまだいいけど、「ときどき動作がおかしい」これ最悪
2012/08/26(日) 09:34:18.81
て言うかサンプルってそういうもんだし。
そもそも >>42 が
> mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
> 自分が待たずにロックしちゃうことに。
って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
そもそも >>42 が
> mutexは相手がロックしていれば待つけど、相手がスケジュールはずされてロックしてくれていないと
> 自分が待たずにロックしちゃうことに。
って書いてるけど、それ以外にどんな動作を期待してるのか、よくよわからん。
2012/08/26(日) 09:57:42.57
マトが止まっていないとシグナルがすり抜けちゃうなんて最初はわかんないでしょ
そんなことより、マトがトマるだって・・・・・!喜w
そんなことより、マトがトマるだって・・・・・!喜w
2012/09/01(土) 15:54:33.37
ダレモイナイ・・・・・・ダジャレオソルベシ・・・・・
素朴なQなんですが、マルチCPUのマシンで、
@ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く
Aひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、
スレッド単体ではなく、それの属するプロセスが渡り歩いているため
こういう理解は正しいですか?
素朴なQなんですが、マルチCPUのマシンで、
@ひとつのプロセスに属するスレッドは、全部同じCPU(プロセスがいる)で動く
Aひとつひとつのスレッドが独立してCPUを渡り歩いているように見えるのは、
スレッド単体ではなく、それの属するプロセスが渡り歩いているため
こういう理解は正しいですか?
2012/09/01(土) 15:58:04.54
スレッドの割り当てとかはOSが決めてることだからね
OSの挙動に影響しないようなことを考えながらやりませう
マルチCPUじゃなく
単一CPUの時のスレッド等の挙動を考えてみませう
OSの挙動に影響しないようなことを考えながらやりませう
マルチCPUじゃなく
単一CPUの時のスレッド等の挙動を考えてみませう
2012/09/01(土) 16:04:51.98
同じプロセッサ内のコアを移動するならまだしも、別のプロセッサに移動してしまったら、
せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
せっかく溜め込んだキャッシュがおじゃんになってしまうのではないでしょうか?
2012/09/01(土) 16:11:29.80
逝ってるなマルチコアはCPU毎に命令データキャッシュ持ってるでしょ
2012/09/01(土) 16:12:43.77
でも分岐したらダメなのでは?
2012/09/01(土) 16:16:42.15
よく考えたら、分岐するんだったらCPU移らなくてもダメだった
ドピュッ
ドピュッ
2012/09/01(土) 16:27:35.25
命令の先読みとかやってるの知ってる?
同じ領域を読み込む場合に早くなるってのがキャッシなのでは?
HDDキャッシュとかも同じでしょ
同じ領域を読み込む場合に早くなるってのがキャッシなのでは?
HDDキャッシュとかも同じでしょ
2012/09/01(土) 16:29:03.73
別のプロセッサに移動してしまったらキャッシュとかおじゃんになってしまうかもしれないが、
ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある
OSの裁量次第
ひとつのプロセッサに多数のスレッドが集中して別のプロセッサを遊ばせておくくらいならいくつかのスレッドを移した方がいい場合もある
OSの裁量次第
2012/09/01(土) 16:32:16.93
キャッシュ知らんでも
スレッド系のプログラム作るのには関係無いような
速度ウンタラは動いてから考えればいい話でしょ
スレッド系のプログラム作るのには関係無いような
速度ウンタラは動いてから考えればいい話でしょ
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;
っていうのは安全でしょうか?
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;
っていうのは安全でしょうか?
2012/09/05(水) 04:17:50.83
>>57
先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。
要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。
つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか?
それと、cpにNULLが代入されること自体は問題ないの?
先ず基本的にblReference, blDeletingとも、きちんと扱えるようにしないとダメ。
要は、OSの用意しているクリティカルセクションなどの機構を使う必要がある。
つーか、マルチスレッドプログラミングの基本なんだが、大丈夫なんか?
それと、cpにNULLが代入されること自体は問題ないの?
2012/09/05(水) 06:16:48.24
weak_ptr使えハゲと言うしかないレベル
2012/09/05(水) 08:13:29.83
weak_ptrってboost?
マルチスレッドを考慮されていたの?
マルチスレッドを考慮されていたの?
2012/09/09(日) 01:13:55.50
2012/09/09(日) 01:44:44.97
volatile使ったとしてもコンパイラによっては安全だとは言えないんだよ
2012/09/09(日) 01:51:51.18
安全って、思いたい理由の方に興味があるんだけど
2012/09/09(日) 07:41:49.96
むしろ安全だといえるコンパイラを知りたい
2012/09/09(日) 14:24:32.10
volatile使っても結果変わらない事の方が多い気がする
2012/09/09(日) 15:54:34.19
そりゃそうだ
2012/09/09(日) 16:30:00.96
安全だと思うと、コンピュータがそれを理解して動いてくれると思いたいのかな
2012/09/12(水) 00:03:54.96
volatileしてダメだったケースに遭遇したことないなあ。
まあboolでの同期・排他は簡単なケースにしか使ってなくて、
まじめなのはcritical sectionとかmutexで排他・同期するから
気がついてないだけかもしれないけど。
まあboolでの同期・排他は簡単なケースにしか使ってなくて、
まじめなのはcritical sectionとかmutexで排他・同期するから
気がついてないだけかもしれないけど。
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
スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。
>// スレッドA
>while( blReference ){ Sleep(1); } // 1
>blDeleting= true; // 3
>// スレッドB
>while( blDeleting ){ Sleep(1); } // 2
>blReference = true; // 4
スレッドの処理が時間的に番号の順で行われる場合がある。
つまり、この処理はスレッド間の排他にはなっていない。
おとなしくクリティカルセクションを使ってロックした方がいい。
2012/09/22(土) 01:53:58.20
>>69
InterlockedExchangePointerは?
InterlockedExchangePointerは?
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に基づく処理
内部で適切にメモリバリアを行うことが保証されていますか?
例えば、下記のケースにおいて、_WriteBarrier()や_ReadBarrier()は冗長?
(メインスレッド側)
bTerminate = true; // volatile bool型
_WriteBarrier();
SetEvent(hEvent); // スレッドを起床させる
(ワーカースレッド側)
WaitForSingleObject(hEvent); // 起床されるまで待つ
_ReadBarrier();
if (bTerminate) { .... } // メインスレッドから通知されたbTerminateに基づく処理
2012/09/29(土) 20:49:37.13
も一個、volatile bool a, b; があるとして、
a = c;
b = d;
の代入順序は、a, bがたとえatomicな型でvolatileだからといって
プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、
よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は
メモリバリアが 必 須 、
という理解で合っていますか
a = c;
b = d;
の代入順序は、a, bがたとえatomicな型でvolatileだからといって
プロセッサのアウトオブオーダー実行のレベルでは実施される順序が保たれる保証はない、
よって、上記代入を行ったコア以外のコアからaやbを代入順序依存で参照する場合は
メモリバリアが 必 須 、
という理解で合っていますか
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
はい
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
はい
2012/09/30(日) 00:03:39.72
>>64
javacやcscじゃね
javacやcscじゃね
2012/09/30(日) 00:12:53.41
メモリバリアってのはgcc特有の表現で
atomicな処理とは関係ないんだけど
atomicな処理とは関係ないんだけど
2012/09/30(日) 00:30:58.05
2012/09/30(日) 00:56:39.75
ただの最適化抑止のおまじないみたいなもんだよ
2012/09/30(日) 01:05:56.81
>>77
ちょっそれvolatileの方wwwww
まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
ちょっそれvolatileの方wwwww
まあ>73の通り、Windows API内部でよろしくやってくれるので普通はメモリバリアの方は意識しなくて良いっぽい
おそらくUNIXのシステムコールも同様でよろしくやってくれるから知る人ぞ知る知識になってしまうのだろう…
79デフォルトの名無しさん
2012/09/30(日) 01:13:58.152012/09/30(日) 01:14:33.03
gccのvolatileってのは、ちょっと特殊なんだよ
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を使うとメモリバリアも面倒をみてくれるらしい…
真相はもっと複雑怪奇だったりする
http://yamasa.hatenablog.jp/entries/2009/07/20
http://msdn.microsoft.com/ja-jp/library/bb310595%28VS.85%29.aspx
つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
2012/09/30(日) 01:26:29.84
ここらへんの話は
・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛
・volatileによって明示的に最適化が抑制
・システムコール内でメモリバリアの面倒をみてくれる
・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる
といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので
コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
・(インラインでない)関数呼び出しの副作用を恐れてコンパイラが最適化を自粛
・volatileによって明示的に最適化が抑制
・システムコール内でメモリバリアの面倒をみてくれる
・ハードウェアがコア間でキャッシュのコヒーレンスをとってくれる
といった事情が絡み合った結果、運よく問題を生じないケースも多々あるので
コードをバリバリ書いているような人でもきちんと理解していないことがある(あった)
2012/09/30(日) 01:27:48.80
アトミック変数とか作って、ド素人に誤解釈されたらどうすんだろ、この人
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でも持っていない。
> つまり、VC++2005以降である限り、volatileを使うとメモリバリアも面倒をみてくれるらしい…
そこで面倒を見てくれるのは「release/aquireメモリバリアとしてのみ」であることに注意。
http://yamasa.hatenablog.jp/entry/20090816/1250446250
こっちのSequential consistencyの性質は、VC++2005以降のvolatileでも持っていない。
2012/09/30(日) 13:33:02.65
>>83
ドシロウトがなんでスレッド使った開発に加わるんだよ
ドシロウトがなんでスレッド使った開発に加わるんだよ
2012/09/30(日) 13:35:58.01
なんで排他の話ばっか出てくるんだ。
スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。
それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
スレッド間で書き換えしまくるような変数なんて殆ど無いだろ。
それはともかく、C++向けのクロスプラとフォームなスレッドキューって無いものか。
2012/09/30(日) 14:26:20.27
2012/09/30(日) 15:13:14.28
>>86
スレッドの実装が違うだろう、LinuxとUNIXなら同じだが
スレッドの実装が違うだろう、LinuxとUNIXなら同じだが
2012/09/30(日) 15:25:27.37
>>85
じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?
じゃあ、うわっつらの言葉だけ知ってる甘ちゃん系ではどう?
2012/09/30(日) 16:54:17.48
2012/09/30(日) 17:01:09.98
2012/09/30(日) 21:04:28.14
おまえら何回C++におけるatomicとvolatileの話を繰り返せば気がすむの
2012/09/30(日) 21:20:03.98
それしかネタがないからさ
2012/09/30(日) 22:09:45.89
>>92
スレッドキューの話しだせ
スレッドキューの話しだせ
2012/09/30(日) 23:24:16.01
だって手法なんて先駆者が出し尽くしただろ
2012/09/30(日) 23:53:26.29
スレッドキューって何だ?
スレッドセーフなキューってことか?
それともGCDみたいなタスクキューのことか?
スレッドセーフなキューってことか?
それともGCDみたいなタスクキューのことか?
2012/10/01(月) 00:06:38.53
タスクキューのことだよ。
てかスレッドセーフなキューってなんだよ。それだったら
別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
てかスレッドセーフなキューってなんだよ。それだったら
別にキューに限定せずスレッドセーフなコンテナの話でいいだろ。
2012/10/01(月) 07:53:47.16
java.util.concurrent.BlockingQueueのことだろ
2012/10/12(金) 23:18:24.02
同期処理を間違いなく設計するための、何か良い手法やツールはないですかね?
ペーペーのビギナーだというのもあるのですが、
複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、
waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、
そのデバッグで無駄に体力を消耗しています
ペーペーのビギナーだというのもあるのですが、
複数のmutexを混在させなければいけない時にぼんやり書いたコードでデッドロックを発生させたり、
waitに到達していないのにシグナル発射する可能性のあるコードを書いてしまって、
そのデバッグで無駄に体力を消耗しています
100デフォルトの名無しさん
2012/10/13(土) 11:18:48.75 馬鹿には無理
101デフォルトの名無しさん
2012/10/13(土) 13:05:32.66102デフォルトの名無しさん
2012/10/13(土) 18:57:49.84103デフォルトの名無しさん
2012/10/13(土) 22:12:39.46 >>101
やんないと、他に仕事ないんで・・・・
>>102
かなり頭がよくないと、サラリと正しいコード書けないですよね(棋士的な意味の頭のよさ)
そうか、地道にやるしかないのか(´・ω・`)
・・・売り物なんですねimagix
自分の担当業務以外にも使えそうなので、ちょっとチーム内に紹介してみます
とりあえず、今の自分のレベルでミスりやすいところを正しく実装するための比喩をいくつか考案中です
↓
例1
スレッド間同期は、キャッチボール
ボールを受け取る側は、しゃがんでいないとボールをキャッチできない
例2
スレッド再開時の手順は、競馬のスタートと同じ
@ゲートを閉じる(送信側mutexロック)
A馬がゲート前に並ぶ(受信側wait)
Bファンファーレが鳴る(signal)
Cゲートが開く(送信側mutex開放)
やんないと、他に仕事ないんで・・・・
>>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.79106デフォルトの名無しさん
2012/10/14(日) 18:33:06.95 まず10年間C++を勉強しろ
107デフォルトの名無しさん
2012/10/14(日) 20:43:53.62 >>106
C++関係ないやん
C++関係ないやん
108デフォルトの名無しさん
2012/10/15(月) 01:03:58.39109デフォルトの名無しさん
2012/10/15(月) 09:17:51.40 結局無理てことか、初心者というより基本が
110デフォルトの名無しさん
2012/10/21(日) 14:23:48.88111デフォルトの名無しさん
2012/10/21(日) 14:42:59.60112デフォルトの名無しさん
2012/10/21(日) 23:06:50.68 Joel on softwareの和訳ページ『間違ったコードは間違って見えるようにする』
を紹介しようと思ったが今ちょっと繋がらないようなので原文で読んでちょ↓↓↓
http://www.joelonsoftware.com/articles/Wrong.html
を紹介しようと思ったが今ちょっと繋がらないようなので原文で読んでちょ↓↓↓
http://www.joelonsoftware.com/articles/Wrong.html
113デフォルトの名無しさん
2012/10/26(金) 20:45:55.33 教えてください
g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の
効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?
g++でコンパイルしたプログラムのプロファイリング、特にスレッドの動作の
効率を見たいのですが、Linux環境で使える定番のフリーツールはないでしょうか?
114デフォルトの名無しさん
2012/10/28(日) 11:59:56.78 gdb
115デフォルトの名無しさん
2012/10/28(日) 21:28:29.42 マ
ジ ハ ,,ハ
デ (;゚◇゚)z
!?
ジ ハ ,,ハ
デ (;゚◇゚)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を使う。スレッドでの変更が反映されている?
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()より前に
という事は行われないように思えるのですが。
どういった理由でしょうか?
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スレッドをローレベルで使うよりお手軽な気がする。
ちょっと試してみるわ。
の発言で思い出した。
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
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
突っ込みどころあったらご指摘よろ。
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とかあるみたいだけど、そこまではまだ調べられてない。
時間があったらもっと調べてみて、追記してみるよ。
そうみたい。
基本的にはマルチプラットフォームでやりたい場合は${ ~ }の記法と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の方が重いのではないかと考えています
1. ポーリング=Mutexで保護された共有リソースの変更を常に監視
2. サーバー(orクライアント)スレッドでEvent監視+Mutexで共有リソースを保護
余計なCPUリソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
(定性的な評価=プロファイルで調べろは無しでお願いします)
自分は「重さ:Mutex>>>>Event>>>>>>>CriticalSection」というイメージがあるので、
2のマルチスレッドのコンテキストスイッチの重さを考慮しても1の方が重いのではないかと考えています
129デフォルトの名無しさん
2013/01/30(水) 20:42:56.62 (゚Д゚)ハァ?
Mutexを奪い合えばいいだけだし。
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リソースを食うのはどちらなんでしょうか?定性的な評価と理由を教えてください
人から聞いたことを信じるの?
> 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
この順番が逆になることあり、てことだよね?
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 の前に持ってきても結果は変わらないはず。
シングルスレッドのメモリ命令は 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はレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。
でいいかと。
WARはレジスタリネーミングと同じだよ。
上書きするなら依存関係が切れるので命令の実行順序は入れ替え可能になる。
結果を内部で保持しておいて後で書き出す。
そして実際のメモリの内容は命令の順序通りの結果になる(ならなかったら大変)。
でいいかと。
138137
2013/02/18(月) 22:30:08.38 >>137の補足しとくと、同一プロセッサでも異なるアドレスだとリオーダ可能なので
順序が重要な場合はメモリフェンスが必要になる。
別のプロセッサ間でもリオーダ可能ということになる。
別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。
順序が重要な場合はメモリフェンスが必要になる。
別のプロセッサ間でもリオーダ可能ということになる。
別のプロセッサとの同じメモリに対するアクセス順序はタイミング次第で複雑なので
必要に応じてロックプレフィックスを使う。
139デフォルトの名無しさん
2013/02/18(月) 23:53:52.86140デフォルトの名無しさん
2013/02/19(火) 07:57:34.41 >>139
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
キャッシュラインがコピーされた状態ではRARの順番は替わりうると思うけど
RAW自体は入れ替わらないんじゃないかな。
実際のWriteの前にReadが割り込む可能性があるけど、それはタイミング次第ってことで。
141デフォルトの名無しさん
2013/02/19(火) 09:15:14.16 lockプリフィックス使うんじゃあ
142デフォルトの名無しさん
2013/02/23(土) 20:04:20.23 >>139
そうか、マルチスレッドでもリオーダは無いな。他から割り込まれる可能性があるだけだ。
そうか、マルチスレッドでもリオーダは無いな。他から割り込まれる可能性があるだけだ。
143135
2013/02/23(土) 23:41:17.41 >>136-142さん、さんくすでした。
MDSNが正しかったのですか。
> それ RAW じゃね
でした。コードの順番と英語表記は逆になるんですよね。誤解してました・・・。
この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。
MDSNが正しかったのですか。
> それ RAW じゃね
でした。コードの順番と英語表記は逆になるんですよね。誤解してました・・・。
この辺を勉強する本とかないでしょうか?
「The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで」
は読んでみたのですがロックレスアルゴリズムの原理だけでCPUごとの実装は
なかったのであまり役にたたなかったです。
144デフォルトの名無しさん
2013/02/24(日) 10:17:55.94 ハードウェアを実装するとなったらそれこそ本一冊どころではすまないだろうけど、
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。
CPU内の順序はOut of Orderが関係していて、CPUは可能な限り速く実行しようとするから
順番が入れ替わってしまうってことで、それをコントロールするのにメモリバリア命令がある。
アセンブラの最適化にも関係してるから、プロセッサの最適化マニュアルとかも参考になるかも。
マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。
他のプロセッサに割り込まれて困る部分にはlockで保護するとか。
データの同期に関しては何が危険でどうすれば安全に扱えるかが区別できればいいんじゃない?
だから本を買って読むほどでもないような。
CPU内の順序はOut of Orderが関係していて、CPUは可能な限り速く実行しようとするから
順番が入れ替わってしまうってことで、それをコントロールするのにメモリバリア命令がある。
アセンブラの最適化にも関係してるから、プロセッサの最適化マニュアルとかも参考になるかも。
マルチプロセッサではキャッシュコヒーレンシやMESIプロトコルとかの概略を知ってればいいんじゃないかな。
他のプロセッサに割り込まれて困る部分にはlockで保護するとか。
145デフォルトの名無しさん
2013/02/26(火) 14:50:30.35 Java の資料だけど「コンパイラ開発者のためのJSR133クックブック」ってのはどう?
146デフォルトの名無しさん
2013/02/27(水) 12:54:04.48147デフォルトの名無しさん
2013/02/27(水) 23:21:29.29 RafterWってシングルスレッドなら絶対安全?
途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと?
実行cpuが変わることあるかしらないけど
まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
途中で実行cpuが変わってもosが面倒見てくれるから気にする必要はないってこと?
実行cpuが変わることあるかしらないけど
まぁ普通にコード書いてて入れ替わる訳ないから大丈夫か
148デフォルトの名無しさん
2013/03/02(土) 16:47:32.29149デフォルトの名無しさん
2013/03/03(日) 20:26:49.52 >>148
書き方が悪かった。
マルチプロセッサの環境でシングルスレッドのコードを実行してて、
実行CPUが変わったとしても読み書き順が入れ替わらないでしょう?
そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
書き方が悪かった。
マルチプロセッサの環境でシングルスレッドのコードを実行してて、
実行CPUが変わったとしても読み書き順が入れ替わらないでしょう?
そこはOSがプロセス切り替え時に勝手にバリアをかけてるはずだよね?ってこと
150デフォルトの名無しさん
2013/03/03(日) 20:30:18.24 >>149
ああそういうことか、それは大丈夫だと思うよ。
ああそういうことか、それは大丈夫だと思うよ。
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/
なんで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ではこうゆうハードウェア構成は想定してないはず。
外部キャッシュや主記憶のシステムコントローラが、
CPU本体より弱いメモリモデルを採用してる場合に意味を持ってくる。
Windowsではこうゆうハードウェア構成は想定してないはず。
154デフォルトの名無しさん
2013/03/04(月) 10:40:54.32155デフォルトの名無しさん
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
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に劣る。
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言語でも自作できるんですか?
以前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.84176デフォルトの名無しさん
2013/06/21(金) 19:38:33.60 スレち
177デフォルトの名無しさん
2013/06/21(金) 19:52:56.34 スレチというほどじゃないんじゃない?
OSレベルでスレッドのサポートが無い場合は、
言語ランタイムレベルのグリーンスレッド
タイマー等の割り込みの利用
メッセージポンプのループ利用
NT Fiber
スレッドはないけどプロセスのマルチが出来るなら、
パイプなどでプロセス間通信の利用
といったところかな
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 のことね
win31 のことね
182デフォルトの名無しさん
2013/06/21(金) 22:38:33.58 気が早いな
まだ8だぞ
まだ8だぞ
183デフォルトの名無しさん
2013/06/21(金) 23:18:56.88184デフォルトの名無しさん
2013/06/21(金) 23:38:19.83 ファイアー少なくてレアすぎ
185デフォルトの名無しさん
2013/06/21(金) 23:40:35.43 広義だと含むのとちゃうかな
おさ〜ん的にはTSS(TSO)のホスト端末を思い浮かべるけど
おさ〜ん的にはTSS(TSO)のホスト端末を思い浮かべるけど
186デフォルトの名無しさん
2013/06/23(日) 12:58:55.01 ファイバー使ってみたけど、
フェーズとswitchより
シンプルに書けたよ。
フェーズとswitchより
シンプルに書けたよ。
187デフォルトの名無しさん
2013/11/22(金) 08:18:08.42 C/C++ で勉強したいのですが、おすすめの書籍などありますか?
もしくは一から学べるようなWebページがあれば教えてください
もしくは一から学べるような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.02191デフォルトの名無しさん
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();
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
ttp://ci.nii.ac.jp/naid/40000002652
199デフォルトの名無しさん
2014/02/25(火) 00:18:34.64200デフォルトの名無しさん
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が支援するとか、ブロックする可能性がある
システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。
基本的な理屈はそう難しくないけど、実際にはreadとかでどれかのスレッドがプロセスごと
ブロックされると、他に走りたいスレッドが居ても走れなくなっちゃうので、そのへんを
どう手当てするかがカギ(そういった所だけOSが支援するとか、ブロックする可能性がある
システムコールに関連するものは全てスレッドライブラリが面倒を見るとか)。
205デフォルトの名無しさん
2014/02/25(火) 17:33:10.94 よく分らんな。スレッドってそもそもOSが定義したものだろう。
アプリ側がたかが永続性のあるサブルーチン程度のものを
勝手にグリーンススレッドって呼んでるだけじゃないのか?
まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。
アプリ側がたかが永続性のあるサブルーチン程度のものを
勝手にグリーンススレッドって呼んでるだけじゃないのか?
まさしく小学生がBASICで弾の連射実装してるレベルの話。ガッカリ度120%。
206デフォルトの名無しさん
2014/02/25(火) 18:01:22.88207デフォルトの名無しさん
2014/02/25(火) 18:14:03.00 ttp://dl.acm.org/citation.cfm?id=603551
↑これが「小学生がBASICで弾の連射実装してるレベルの話」に見えるのか。
さぞかしスーパープログラマ(笑)様なんだろうな。
↑これが「小学生がBASICで弾の連射実装してるレベルの話」に見えるのか。
さぞかしスーパープログラマ(笑)様なんだろうな。
208デフォルトの名無しさん
2014/02/25(火) 18:19:01.04 その例え話しとその提示したのと繋がりそしてなんでその皮肉になるのか、200文字以内で説明しなさい
209デフォルトの名無しさん
2014/02/25(火) 18:49:55.40 wikipediaのスレッドの項目の所まで加筆してやがるww
バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
そんなのスレッドと何の関係もないのにスレッド言うなや。
バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
そんなのスレッドと何の関係もないのにスレッド言うなや。
210デフォルトの名無しさん
2014/02/25(火) 19:49:47.38 結局、逆の意味でのウィキペディア馬鹿か。
一人で言ってろw
一人で言ってろ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.07216デフォルトの名無しさん
2014/02/26(水) 17:24:33.12 > ユーザースレッド、ユーザ空間でか、なるほど
> カーネルスレッド、カーネル空間でか、なるほど
> グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん
ユーザースレッドとカーネルスレッドという言葉はそれぞれ、
M:Nスレッドモデルとかの議論で、カーネル空間のコードの実行におけるスレッドと、
ユーザー空間のコードの実行におけるスレッド、という意味で使われる。
グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
スレッドAPIの実装を指す。
以上のことが何も理解できないバカには、なにもかもがバズワードに見える。
> カーネルスレッド、カーネル空間でか、なるほど
> グリーンスレッド、仮想機械上でか、で、なんでグリーンやねん
ユーザースレッドとカーネルスレッドという言葉はそれぞれ、
M:Nスレッドモデルとかの議論で、カーネル空間のコードの実行におけるスレッドと、
ユーザー空間のコードの実行におけるスレッド、という意味で使われる。
グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
スレッドAPIの実装を指す。
以上のことが何も理解できないバカには、なにもかもがバズワードに見える。
217デフォルトの名無しさん
2014/02/26(水) 17:25:22.57 バカですがなにか?
218デフォルトの名無しさん
2014/02/26(水) 17:49:55.02 命名の由来のことなのに、Wikipediaから意訳したようなのを偉そうにのたまう、他人を馬鹿呼ばわりする自称天才様w
天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw
天才過ぎてどれもこれも バズワード 扱いしていると思い込んでいるようだしなあ。御愁傷様でw
219デフォルトの名無しさん
2014/02/26(水) 18:13:53.06 > バズワード確定だな。エミュレータでゲーム動かしたらグリーンスレッドかよw
>
> そんなのスレッドと何の関係もないのにスレッド言うなや。
この威勢はどこ行ったのかなぁw
>
> そんなのスレッドと何の関係もないのにスレッド言うなや。
この威勢はどこ行ったのかなぁw
220デフォルトの名無しさん
2014/02/26(水) 18:31:45.02 >グリーンスレッドというのは、スレッドAPIを(可能な限り)ユーザースレッド内で実装した
>スレッドAPIの実装を指す。
ハナからスレッドの定義に当てはまらないのにスレッド言われもなぁ。
WEB2.0と変わらんレベルの造語。
どうせまたジョブスオタクの低脳営業SEが言い出したんだろう。
>スレッド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が管理する最小の実行スタック。
OSが管理する最小の実行スタック。
224デフォルトの名無しさん
2014/02/26(水) 18:44:25.59 >>222
ではキミのスレッドの定義は?
ではキミのスレッドの定義は?
225デフォルトの名無しさん
2014/02/26(水) 19:01:36.43 222じゃないけど、スレッドっていうのはプログラムを実行する最小単位のことでいいんじゃないかな
OSが管理しているかどうかは問わない
スレッドっていう概念が実装されてるプログラミング言語が多いと思うんだけど、
この場合のスレッドはOS上の実装とは切り離されてるんだよね
例えばJavaのThreadクラスとか
OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で
抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?
OSが管理しているかどうかは問わない
スレッドっていう概念が実装されてるプログラミング言語が多いと思うんだけど、
この場合のスレッドはOS上の実装とは切り離されてるんだよね
例えばJavaのThreadクラスとか
OSが管理するものだけをスレッドと定義するとしたら、上記のようなプログラミング言語で
抽象的に実装されてるスレッドはスレッドとは呼ぶべきじゃないということかな?
226デフォルトの名無しさん
2014/02/26(水) 19:17:09.57 実行スタックってなんだ、って思ったらウィキペディア(英語版含む)でそんな表現を使ってるのか。
一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。
一応GNU AWKと、.NETかCOMに、execution stackという用語はあるようだが。
227デフォルトの名無しさん
2014/02/26(水) 20:45:20.03228デフォルトの名無しさん
2014/02/26(水) 21:45:14.58 ワロタw
229デフォルトの名無しさん
2014/02/26(水) 21:46:50.48 中途半端に脳内完結してるんだろな
230デフォルトの名無しさん
2014/02/26(水) 21:49:16.49231デフォルトの名無しさん
2014/02/26(水) 22:31:24.56 ファイバー、タスク、ユーザーレベルスレッドと呼ばれ方はあるが
スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ
OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ
もしやOSを書いたことも言語処理系を書いたこともないのか?
スクリプト言語のスレッドやゲームのタスクシステムの実装などに使われているありふれたテクニックだろ
OSの実装も同じだよ、ただカーネルレベルでやってるからCPUの特権命令が使えたりするってだけ
もしやOSを書いたことも言語処理系を書いたこともないのか?
232デフォルトの名無しさん
2014/02/26(水) 22:43:21.83 意味負
233デフォルトの名無しさん
2014/02/27(木) 06:36:49.81 >>227
JavaのThreadクラスの何処がふざけてるんだ?
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 いいかげにんしろよ、クズ。
その定義ってどれ?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も範囲でいいだろ
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
あるいは「カーネル型」の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至上主義者が通りますよ〜
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内で完結させようとしても終わらない。
参考になるサイトとかコードとかを教えて欲しい。
特にワーカスレッドを複数立て、たくさんのデータブロックを順に渡して処理させるようなサンプルとか。
ネットを検索しても、スレッドが延々と動きつづけるか、処理が終われば使い捨てるものばかりで、
処理の終わったワーカスレッドに次のデータを渡して連続して処理させるものが見つからない。
また、可変長の演算結果を親スレッドに返す方法についても、どうすればいいのやら。
1個の結果データは固定長だけど出てくる個数が可変なので、固定長の電文を複数投げるようなイメージでも可。
動作環境はWin7-x64で、VC++を使いマルチコアCPUのコア数分ワーカスレッドを立てようと思う。
うちのは6コアなので、単純計算で6倍弱には高速化できると思う。
処理内容の原理試作としてシングルスレッドのDOSアプリとして組んで、鍵値に5を与えて動かしてみた結果、
データブロック数は320万個余り、データブロック1個あたりの演算結果はゼロ〜100KBと幅があるw
そして総処理時間の見込みは60〜150時間(まだ終わってない)。
鍵値を6にするとブロック数も処理時間も莫大に跳ね上がるから、
たぶん1台のPC内で完結させようとしても終わらない。
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でも
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処理とかを真面目に考えないと無理そうだけど。
トン
スレッドの使いまわしについて、ちょっと説明が言葉足らずだったかな。
やりたいのは最初に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
OpenMPのparallel forで分割するだけでおk
272265
2014/03/10(月) 02:53:54.21 >>271
もしも、それで済む用件だったら、一番楽だね。
VS2012と2013なら、無料版でもOpenMP使えるし。
手元のコードでOpenMPでforループ2048周をi7-3760Xで6倍速度くらい。
CUDAで780Tiで2048*2048cudaスレッドでさらに18倍くらいだった。
もしも、それで済む用件だったら、一番楽だね。
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のコア数より多くしても意味ないよね?
CPUのコア数より多くしても意味ないよね?
276デフォルトの名無しさん
2014/03/10(月) 17:42:02.40 >>275
スレッド内の処理でI/O待ちとかしてる場合は意味あるんじゃないの?
スレッド内の処理でI/O待ちとかしてる場合は意味あるんじゃないの?
277デフォルトの名無しさん
2014/03/10(月) 18:28:34.27 ひたすら計算し続けるなら意味はない。
計算メインというだけならコア数の倍ぐらいまでは
スループットが上がることはある。
計算メインというだけならコア数の倍ぐらいまでは
スループットが上がることはある。
278デフォルトの名無しさん
2014/03/10(月) 19:11:36.58 書きたいアルゴリズムを自然に書けるという理由で
マルチスレッドに意味があることはある
GUIなんかそうだろうね
マルチスレッドに意味があることはある
GUIなんかそうだろうね
279デフォルトの名無しさん
2014/03/10(月) 19:22:36.70 そんなGUIの実装は見たこと無いです。
280デフォルトの名無しさん
2014/03/10(月) 19:40:06.12 GUI スレッドと別に好きなスレッドを立ててうまくやっていけるってことだろうに‥‥
win16 の泣きそうな世界を知らないのか?
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も定番になるって感じになっているし。
そして、今後は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でやったら電気代で赤字になりそうだ。
主戦場が移った。消費電力が段違いなんだとさ。
GPUでやったら電気代で赤字になりそうだ。
288デフォルトの名無しさん
2014/03/13(木) 20:49:30.32ID:/ZWTiswr289デフォルトの名無しさん
2014/03/13(木) 21:06:24.71ID:k4ocBl+v FPGA経由でASICな。
しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw
しかも最近じゃあ、専用マシン(アクセラレータ?)を手に入れても、掘るより転売するほうが儲かるとかw
290デフォルトの名無しさん
2014/03/13(木) 22:02:39.26ID:gEHR9Glb で、自販機の下に落ちてる100円玉を地道に拾うぐらいなら
ショベルカーでATMごと盗んじゃえってのがマウントゴックス。
ショベルカーでATMごと盗んじゃえってのがマウントゴックス。
291デフォルトの名無しさん
2014/03/13(木) 22:18:30.00ID:hR60BOrR292デフォルトの名無しさん
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の正規のビットパターンは計算で求まる、でこれの正しい組み合わせを計算する事を採掘(マイニング)って言うだけの話
むちゃくちゃ簡単に言うと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に比べて頭が固定な分だけメモリの利用効率が高そうだったことと、
データの順番には意味がないから逆順になっても問題がないことによるものなので、
別のコンテナを使ったほうがいいなら、それでも構わない。
データ処理とファイル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を待たす方法が一番簡単じゃないか。
そもそも一旦メモリに載せる必要があるのか?非同期IOじゃだめ?
どうしても載せなきゃいけないとして、Aはあまり意味がない。
よほど頭の悪い実装をしてなければ、現状メモリを喰ってるってことは
inputよりoutputの方が遅いってことだ。頻度で解決する問題じゃない。
Bの方は、conditon variableでスタックのサイズが一定より大きくなったら
inputを待たす方法が一番簡単じゃないか。
>調子のいいときは数MBしか食わないのに、最悪は2GB食って落ちることもある。
常識的に考えてバグ持ち。
>コピーが終わった時点で共用stack占有状態を開放、
ふつーstack<void *>。
常識的に考えてバグ持ち。
>コピーが終わった時点で共用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:PqTylRc6308デフォルトの名無しさん
2014/03/15(土) 14:16:36.02ID:1lWAVkUO 書き出すデータのフォーマットを工夫してサイズを小さくするとか、
書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。
書き込み先をSSDにしたりとか、動作環境のスペックを見直すという手も。
309デフォルトの名無しさん
2014/03/15(土) 14:17:30.95ID:y0lYdZ+H310デフォルトの名無しさん
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で圧縮する
圧縮で減るようなデータならsnappyで圧縮する
313デフォルトの名無しさん
2014/03/15(土) 23:24:57.03ID:Jbm5xDHA 普通のリアルタイムではありえん
314313
2014/03/15(土) 23:26:35.57ID:Jbm5xDHA 訂正 以上です
315デフォルトの名無しさん
2014/03/16(日) 01:00:35.01ID:67pIoXcC リアルタイムシステムというのがRTOSを使っているという意味なら
送信側か他のタスクがwait入れてなくて書き込みタスクが動いていないとかってバグじゃないかな
>>313
時代は変わりCPUを使って圧縮したほうがIOが減って低レイテンシにできる
送信側か他のタスクが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データのやり取りのバグを潰せばほぼ完成
(結果の個数が少し足りない)
速度面でも、現在使用中の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のこと?
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とかのメモリ管理の効率?それともキャッシュヒット率のような意味?
mallocとかのメモリ管理の効率?それともキャッシュヒット率のような意味?
328デフォルトの名無しさん
2014/11/10(月) 09:36:09.81ID:W8sKwQAR オライリーのTBBの本買ったけど途中まで読んで放置してたw
ラムダ式を使えばoperator()使わなくていいなら改めて勉強しなおそうかな
>>325
コンカレントコンテナとかは並列にメモリ割り当てしたり、キャッシュラインの競合を考慮した
アロケータを持ってるみたいだから、自前でやるのと変わらないぐらいにはなってるんじゃない?
TBBの本も中古ならかなり安いから買ってみるといいよ
ラムダ式を使えば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#の関数の中でシグナルを使っているのですが
他のスレッドからその関数を呼ぼうとするとエラーが起こるのです・・・
もしかしたら関数自体にシグナルをかけなければいけないのかなぁと思って
今書いているプログラムで
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変数さえ使わなければ何個起動しても排他も何も考えなくてよいぞ
同じ関数は実行するのは、スレッドが違えばコンテキストスイッチが起きて、レジスタとかスタックが入れ替わるから大丈夫
メンバ変数と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 のクリティカルセクションとイベントオブジェクトでおなかいっぱい、というかこれだけでたいがいうまくいくのでは?
もう 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+V352デフォルトの名無しさん
2015/05/29(金) 22:45:34.32ID:gXnjRwZ6 Win8.1 Cygwin64bit g++のpthreadなんですが、マルチコアCPUなのに性能改善しません。
なにか特別なコンパイルオプションがあるとか
特別なライブラリをリンクしなければいけないとかあるのでしょうか。
-lpthreadはつけてます。
なにか特別なコンパイルオプションがあるとか
特別なライブラリをリンクしなければいけないとかあるのでしょうか。
-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秒以上掛かりますが、
之をスレッドを起こしても意味無い?
・・・
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とメモリの方がディスクよりも遙かに速い)
純粋にバイナリデータとしてファイルをメモリに丸ごと読み込むのであればスレッド分ける意味ない(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鹿児島県
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が処理している間に次に読むべきディスク上の物理セクタが通り過ぎてしまうからシーケンシャルなセクタ処理でなくインターリーブした順序付けのセクタ使うって奴
インターリーブってCPUが遅い時代の話だろ?
セクタリードの後でCPUが処理している間に次に読むべきディスク上の物理セクタが通り過ぎてしまうからシーケンシャルなセクタ処理でなくインターリーブした順序付けのセクタ使うって奴
366デフォルトの名無しさん
2015/10/10(土) 23:10:25.42ID:bMLX+QzX 趣味プログラムでInterlockedCompareExchange
で値が交換できた時だけそのスレッドが処理を進められるような感じで
作りこんでいるんだけど、何かこれだと問題ある?
一般的にはクリティカルセクションを使った方がいい的な話を聞くんだけど
sizeof(CRITICAL_SECTION)がチョット大きすぎるので使うのをためらってしまう
で値が交換できた時だけそのスレッドが処理を進められるような感じで
作りこんでいるんだけど、何かこれだと問題ある?
一般的にはクリティカルセクションを使った方がいい的な話を聞くんだけど
sizeof(CRITICAL_SECTION)がチョット大きすぎるので使うのをためらってしまう
367デフォルトの名無しさん
2015/10/11(日) 01:12:22.19ID:DeMvW0Ba368デフォルトの名無しさん
2015/10/11(日) 01:16:20.15ID:DeMvW0Ba369デフォルトの名無しさん
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+oF2h374デフォルトの名無しさん
2016/03/08(火) 01:40:29.32ID:YkHc2UTm レース状態のことやね
375デフォルトの名無しさん
2016/03/20(日) 12:54:59.05ID:upopZnIF 同じcondition_variableでブロックしているスレッドが複数ある場合に、
notify_oneをしたら、どのスレッドが起床するのだろうか。
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代エリート
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
_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?
排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?
読み取り最中に書き換えたり、書き換え最中に読み取った場合にデータが破壊されるというだけの話だよね?
例えば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ビットの半分だけ違う値になる、
ということはありえない。そういう心配をしてるなら大丈夫
>>マルチスレッドにおける変数の排他処理についてなんだけど、
>>排他制御していない状態で複数のスレッドが同じ変数に同時にアクセスすることそのものは問題ないよね?
変数というだけでは分からない。
構造体とか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通りのどちらかになることは保証されるよね?
できるだけ高速化したいから、できるだけ排他処理はしたくない。
大丈夫かどうかというのは、
排他制御が行われていない変数へのアクセスそのものが原因となってソフトウェアがクラッシュしたり、
OSやハードウェアレベルの問題は起きたりしないよね?って意味
C言語で下位1bitしか使わない排他処理が行われてない変数があり、その1bitをif文で判定して処理を2通りに分ける場合、
必ずその2通りのどちらかになることは保証されるよね?
できるだけ高速化したいから、できるだけ排他処理はしたくない。
383デフォルトの名無しさん
2016/12/09(金) 18:10:37.82ID:uxrmDz9Z やっぱりアホか
384デフォルトの名無しさん
2016/12/09(金) 18:37:52.31ID:R3c5DqP6385デフォルトの名無しさん
2016/12/09(金) 21:27:34.75ID:WzSsU1Dc386デフォルトの名無しさん
2016/12/10(土) 23:59:30.12ID:mx8/lQPw すいません質問します。
Matlobで、
例えば5000×5000の行列をAとして
その10×10の区分行列をBとします。
Aの対角線上にあるBだけを取り出して他が0行列の行列を作るにはどうすればいいですか?
また、各Bの対角要素だけ取り出すにはどうすればいいですか?
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を代入する
・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 でもやってみたのですが、直列の方が速いです。
上記の環境ではマルチスレッドで効率化を図るには、何か設定が必要なのでしょうか。
ざっくりした質問ですがヒントになるようなことでも教えて下さい。
【言語】 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するのもスイッチするのも時間が掛かるので、
それらがペイしないと意味がない。
ちゃんと作っていて遅いのなら、キャッシュの競合の可能性があるかも
プログラムを見ないと分からない。
マカーじゃないから見ても分からないかもしれないけど。
大前提として、マルチスレッド化して速くなるようなジョブなんだよね?
スレッドを作るのも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; }
};
下記のコードを試したのですが、直列実行した方が速かったです。
これってそもそも並列化しても速くならない類の処理なのでしょうか?
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 )
関数 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
399デフォルトの名無しさん
2017/09/17(日) 19:09:14.78ID:iyMogwhx #include <stddef.h>
offsetof(type, member-designator);
offsetof(type, member-designator);
400デフォルトの名無しさん
2018/05/23(水) 21:43:17.32ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
4DXJZ
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
4DXJZ
401デフォルトの名無しさん
2018/07/05(木) 00:17:03.60ID:RfoszcD2 Z1B
402デフォルトの名無しさん
2018/10/28(日) 23:21:28.63ID:bVjvgsxo403デフォルトの名無しさん
2019/01/13(日) 12:43:26.12ID:P4nmFhbL Intelのハイパースレッドでスケールするか否かのアルゴやデータ構造のパターンとか、評価基準をまとめた本なりサイトなり御存じでしたら教えてください。
404デフォルトの名無しさん
2019/01/26(土) 17:42:01.46ID:stTjLhtD 400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに掛かってスケールしないと思うんですが、boolの配列(newしたもの)でやるとある程度スケールします。
何でですか?
何でですか?
405デフォルトの名無しさん
2019/01/26(土) 18:19:40.68ID:yUYodqfD >>404
bool の配列が、例えば、8個の bool 値をまとめて 1バイトとして格納している場合で、
for ( i =0; i < 100000; i++ ) {
dst[i] = src[i];
}
のように書いて、かつ、コンパイラがこのループを「そこまでの」最適化はしなかった場合、
32BIT 環境の場合なら、32回のループで 1 DWORD 分の実メモリやキャッシュ・メモリへの
転送が生じるだけになるかも知れない。その他のメモリアクセスは、基本、code の
fetch だけになり、全てCPU内部のキャッシュ・メモリに乗ってしまう。
だから、マルチスレッドでこのループを分割して行えば、32スレッドまでなら、
高速化が起きる気がする。
そういう問題でなくて?
bool の配列が、例えば、8個の bool 値をまとめて 1バイトとして格納している場合で、
for ( i =0; i < 100000; i++ ) {
dst[i] = src[i];
}
のように書いて、かつ、コンパイラがこのループを「そこまでの」最適化はしなかった場合、
32BIT 環境の場合なら、32回のループで 1 DWORD 分の実メモリやキャッシュ・メモリへの
転送が生じるだけになるかも知れない。その他のメモリアクセスは、基本、code の
fetch だけになり、全てCPU内部のキャッシュ・メモリに乗ってしまう。
だから、マルチスレッドでこのループを分割して行えば、32スレッドまでなら、
高速化が起きる気がする。
そういう問題でなくて?
406デフォルトの名無しさん
2019/01/26(土) 18:25:13.78ID:VVr2JTND >>404
あ、あと
>400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに
>掛かってスケールしないと思う
これだけど、以外に高速化されたりするかもしれない。
実際の CPUはそんなに賢くないので。
色々複雑。
あ、あと
>400MBのデータを一括でコピーする処理を並列化してもノイマンボトルネックに
>掛かってスケールしないと思う
これだけど、以外に高速化されたりするかもしれない。
実際の CPUはそんなに賢くないので。
色々複雑。
407デフォルトの名無しさん
2019/01/27(日) 00:13:20.29ID:UeSsBKpf チップセットや DDR DRAM、バス・アービタなどの事はそんなに詳しくは無いけど、
「ブロック転送命令」みたいなのがあるかも知れない。そして、
CPU で、rep movsd などが実行されるとき、CPU は、自分で転送せずに
チップセットと連携してバス・アービタにその命令を発行し、すぐに次の命令
から実行を再開したりするかも知れない。昔で言う「バスマスタ転送」や「DMA転送」
に似たようなやり方。
なんでそう思うかというと、主記憶(外部メモリ)はCPUのクロック速度にはついていけない
はずなのに、以外に CPU のブロック転送が速い気がするから。
確認は取ってない。
「ブロック転送命令」みたいなのがあるかも知れない。そして、
CPU で、rep movsd などが実行されるとき、CPU は、自分で転送せずに
チップセットと連携してバス・アービタにその命令を発行し、すぐに次の命令
から実行を再開したりするかも知れない。昔で言う「バスマスタ転送」や「DMA転送」
に似たようなやり方。
なんでそう思うかというと、主記憶(外部メモリ)はCPUのクロック速度にはついていけない
はずなのに、以外に CPU のブロック転送が速い気がするから。
確認は取ってない。
408デフォルトの名無しさん
2019/01/27(日) 19:38:20.44ID:0CxMXTRb 返信ありがとう。
DMA転送できるものをコンパイラが探知できるか疑問に思ってました。CPU機能としてのブロック転送は関係ありそうですね。
ワード単位処理は確かにやってそうです。
マルチコアでスケールできる処理って割りと限られてますね(汗。
DMA転送できるものをコンパイラが探知できるか疑問に思ってました。CPU機能としてのブロック転送は関係ありそうですね。
ワード単位処理は確かにやってそうです。
マルチコアでスケールできる処理って割りと限られてますね(汗。
409デフォルトの名無しさん
2019/01/27(日) 19:45:29.93ID:upukWAKG バイナリ見れば済む話だよね^^
410デフォルトの名無しさん
2019/01/27(日) 19:45:46.51ID:UADZfhGv >>408
[追加]
DMAでなくとも、CPU自身が命令実行の処理とは独立して主記憶の間で
転送をする仕組みは当然あるので、ブロック転送の予約みたいな事で、
実際の転送処理が終わってなくても次の命令に進んだりするようなことは
あるかも知れないと想像してみる。
無いかもしれないけど。
[追加]
DMAでなくとも、CPU自身が命令実行の処理とは独立して主記憶の間で
転送をする仕組みは当然あるので、ブロック転送の予約みたいな事で、
実際の転送処理が終わってなくても次の命令に進んだりするようなことは
あるかも知れないと想像してみる。
無いかもしれないけど。
411デフォルトの名無しさん
2019/01/27(日) 19:48:31.17ID:UeSsBKpf >>409
いや。例えば、バイナリだと、
rep movsd
の1命令がそこにあるだけで、命令表を見ればブロック転送をする命令とあって、
擬似命令レベルでの処理までは書かれているが、バス転送レベルでそれをCPUが
どう処理してるかまでは分からない。
いや。例えば、バイナリだと、
rep movsd
の1命令がそこにあるだけで、命令表を見ればブロック転送をする命令とあって、
擬似命令レベルでの処理までは書かれているが、バス転送レベルでそれをCPUが
どう処理してるかまでは分からない。
412デフォルトの名無しさん
2019/01/28(月) 03:22:00.62ID:3CrwaDYk double 1GBをコピー元のデータを加工してからコピーする場合は、どうやってもスケールしないんですかね、この話の感じからして。
書き込みタイミングが結果論でずらせるので、並列化で多少は見込みアルのかな。ーー自分で実験した方が良いですね。
書き込みタイミングが結果論でずらせるので、並列化で多少は見込みアルのかな。ーー自分で実験した方が良いですね。
413デフォルトの名無しさん
2019/01/28(月) 11:26:24.99ID:jKaiFfBH >>412
1. 「加工」が単純に N 個に分割して処理できるものなら、N core の CPU の場合は、
大体 N 倍高速化できる可能性がある。
2. 加工の処理を大体同じ時間がかかる N 回のステージに分割できる場合、1つずつの
ステージを別々のCore で処理すれば、上手くすれば、大体 N 倍高速化できる。
ステージ 1 の出力をステージ2の入力にして、ステージ2の出力をステージ3の
入力にして・・・、という具合にするが、N が十分大きければ、高速化できる。
CPU 内部のスーパー・パイプラインも同じ考え方で、1つの命令をなるべく
たくさんのステージに分割することで、1つずつのステージの処理自体は軽く
されている。処理が軽ければロジックの入力から出力結果が出るまでの時間が
短く出来るのでクロック数を上げることができる。これと同じことが、ソフトウェア
の世界でも成り立つ。。
3. コピーの処理が完全に終わるのを待つ必要が無いなら、コピーを Sub Core で行えば、
Main Core は、待ち時間 0 で次の命令の実行に移れる。コピー後のデータを読み取る
必要が出てきた場所で初めて、同期オブジェクトの WaitForSingleObject()、
SetEvent() などで Main Core が Sub Core の処理が終わるまで待機すれば良い。
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 の処理が終わるまで待機すれば良い。
414デフォルトの名無しさん
2019/01/31(木) 02:15:04.55ID:1/qzJ5j1 キャッシュにデータを書き込むけどメモリに書き込まない、とか
キャッシュのデータをメモリに書き込む動作をC++など言語で実装できないでしょうか。
勘でやる他ないのでしょうか。
キャッシュのデータをメモリに書き込む動作をC++など言語で実装できないでしょうか。
勘でやる他ないのでしょうか。
415デフォルトの名無しさん
2019/01/31(木) 13:32:39.64ID:OGxiQZdZ >>414
自分で inline アセンブラか、単体のアセンブラを使えば出来る。
ただし、VC++ の inline アセンブラを使う場合は、結局、どんなコード
になるか分からない部分があるので、アセンブリ・ソース出力オプションか、
または、IDE の逆アセンブラでコードを確認する必要があると思うが。
ただ、個人的には、それ以上に、IA32のキャッシュ制御命令は、大量の
文書を読んで理解するのが大変に思うけれど。
自分で inline アセンブラか、単体のアセンブラを使えば出来る。
ただし、VC++ の inline アセンブラを使う場合は、結局、どんなコード
になるか分からない部分があるので、アセンブリ・ソース出力オプションか、
または、IDE の逆アセンブラでコードを確認する必要があると思うが。
ただ、個人的には、それ以上に、IA32のキャッシュ制御命令は、大量の
文書を読んで理解するのが大変に思うけれど。
416デフォルトの名無しさん
2019/04/02(火) 09:07:07.70ID:KCTAV4Kj417デフォルトの名無しさん
2019/04/02(火) 12:22:49.68ID:ZD2r0ERn 確か、もっと古いCPUでも、
mfence や、movxxxxx 系の命令でも色々出来たと思う。
物凄い複雑なので、ちゃんと理解してないけど。
mfence や、movxxxxx 系の命令でも色々出来たと思う。
物凄い複雑なので、ちゃんと理解してないけど。
418デフォルトの名無しさん
2019/04/02(火) 12:29:24.16ID:LpV8NoZ4 以下のようなものも関係している。複雑すぎて理解してない。
https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-429.html
・WBINVD, PREFETCHh, CLFLUSH, CLFLUSHOPT,
・非一時的な移動命令(MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS,
MOVNTPD, INVD)
・第3レベルのキャッシュ無効化フラグ(IA32_MISC_ENABLE MSRのビット6)
https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-429.html
・WBINVD, PREFETCHh, CLFLUSH, CLFLUSHOPT,
・非一時的な移動命令(MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS,
MOVNTPD, INVD)
・第3レベルのキャッシュ無効化フラグ(IA32_MISC_ENABLE MSRのビット6)
419デフォルトの名無しさん
2019/07/19(金) 00:38:16.38ID:eyVpHwMv 質問:
ある資源を生成破棄するメーカースレッドがひとつと、その資源を使うユーザースレッドが複数ある。
メーカースレッドとユーザースレッドは排他的に資源にアクセスするが、ユーザースレッド同士は排他的でない。
どのように排他処理を実装すればよいか。
ある資源を生成破棄するメーカースレッドがひとつと、その資源を使うユーザースレッドが複数ある。
メーカースレッドとユーザースレッドは排他的に資源にアクセスするが、ユーザースレッド同士は排他的でない。
どのように排他処理を実装すればよいか。
420デフォルトの名無しさん
2019/07/19(金) 02:31:14.72ID:jdncuoqE421デフォルトの名無しさん
2019/07/19(金) 03:55:47.52ID:J62Ms8NU 課題
422デフォルトの名無しさん
2019/07/19(金) 20:31:45.43ID:XW48gDPw 2コア4スレッドってCPUだと
4スレッド同時に動くの?
4スレッド同時に動くの?
423デフォルトの名無しさん
2019/07/19(金) 21:19:16.26ID:oxWniFkv 動くよ
ただしハードウェアリソース的に余裕がある部分(SSEとか)位しかあまり効果がないな
マルチスレッドではやや分がある
というのはコンテキストスイッチの負荷が純粋に1/2になる
レジスタの内容をメモリに退避する回数が1/2になればそりゃ軽くなるよね
整数演算ではあまり期待しない方がいい
ただしハードウェアリソース的に余裕がある部分(SSEとか)位しかあまり効果がないな
マルチスレッドではやや分がある
というのはコンテキストスイッチの負荷が純粋に1/2になる
レジスタの内容をメモリに退避する回数が1/2になればそりゃ軽くなるよね
整数演算ではあまり期待しない方がいい
424デフォルトの名無しさん
2019/07/19(金) 22:46:03.30ID:tF13LP95 同時に動いてないなら排他制御しなくていいみたいな勘違いしてそうな質問だ。
425デフォルトの名無しさん
2019/07/19(金) 23:08:15.01ID:JGHPeX3b そこまで深くは考えてなかったんだけど。
CPUコアひとつなのにどうやって2スレッド同時に動くのか不思議だったから。
CPUコアひとつなのにどうやって2スレッド同時に動くのか不思議だったから。
426デフォルトの名無しさん
2019/07/20(土) 10:22:32.66ID:aCn5nh8Q 実際に鯖用CPUではHT切ってあるもんな
かえってパフォーマンスが低下するとかで
最近の例の脆弱性との絡みもある
その代わり最初からコアいっぱい積んでいる
かえってパフォーマンスが低下するとかで
最近の例の脆弱性との絡みもある
その代わり最初からコアいっぱい積んでいる
427デフォルトの名無しさん
2019/07/20(土) 10:23:03.60ID:aCn5nh8Q ×切ってある
◯BIOSで自分で切っている
◯BIOSで自分で切っている
428デフォルトの名無しさん
2019/07/20(土) 12:15:42.11ID:D7d7RY7Z on/offをアプリ側で指定できないし、
性能が線形に上がらない時点でHTを考慮した設計は面倒すぎる。
性能が線形に上がらない時点でHTを考慮した設計は面倒すぎる。
429デフォルトの名無しさん
2019/07/20(土) 13:01:11.01ID:aCn5nh8Q マルチスレッド・デザインパターンの本にあった例だけど
ワーカースレッド(スレッドプール)を実装せよ
なお言語は自由とする
ワーカースレッド(スレッドプール)を実装せよ
なお言語は自由とする
430デフォルトの名無しさん
2019/07/20(土) 22:48:42.36ID:xFVhhGJz マルチスレッドの解説本はいくつもあるけど
マルチプロセッサのプログラミングって参考書ないのかね。
マルチプロセッサのプログラミングって参考書ないのかね。
431デフォルトの名無しさん
2019/07/21(日) 00:29:38.70ID:9qa3Jnjy マルチスレッドの解説本でカバー出来ないくらいのマルチプロセッサのプログラミングだと
かなりマニアックというかプロセッサ固有の問題の割合が大きくなると思うので
そういう方面で探すしかないのではないか
それだけに特化した専門書は無いかもね
かなりマニアックというかプロセッサ固有の問題の割合が大きくなると思うので
そういう方面で探すしかないのではないか
それだけに特化した専門書は無いかもね
432デフォルトの名無しさん
2019/07/21(日) 00:46:58.94ID:gryZIvyQ 行列演算を並列処理とかそういう粒度の細かな並列化の話ばっかりで。
せっかく10コアとかあるんだから、各コアに別々のプログラムを走らせておいて
同期しながら処理とかしたいんだけどどうするのがいいかよく分からない。
fork させてメッセージやりとりすれば良さそうなんだけど。
やりたいことがちょっと特殊かもね。
せっかく10コアとかあるんだから、各コアに別々のプログラムを走らせておいて
同期しながら処理とかしたいんだけどどうするのがいいかよく分からない。
fork させてメッセージやりとりすれば良さそうなんだけど。
やりたいことがちょっと特殊かもね。
433デフォルトの名無しさん
2019/07/21(日) 01:03:16.42ID:oN+9KGia 質問の低レベル化が甚だしい。アセンブラを勉強して基礎固めを。
434デフォルトの名無しさん
2019/07/21(日) 01:24:11.69ID:YuxLcsPo OpenMPみたいなのを手動でやるって話かな
マルチコアだとメモリ帯域がボトルネックになりやすいから
巨大な行列計算は少し粒度を荒くしたMPIの方が強いよね
マルチコアだとメモリ帯域がボトルネックになりやすいから
巨大な行列計算は少し粒度を荒くしたMPIの方が強いよね
435デフォルトの名無しさん
2019/07/21(日) 01:57:36.05ID:dcJVZcgj 10コアとかいってるからマルチプロセッサというよりメニーコア活用術?
436デフォルトの名無しさん
2019/07/21(日) 08:19:29.20ID:gryZIvyQ437デフォルトの名無しさん
2019/07/21(日) 08:23:47.17ID:nevBE1rB 並列処理じゃなくて並行処理で探せば
438デフォルトの名無しさん
2019/12/05(木) 19:00:58.65ID:sV2dE7Px マルチスレッドの排他処理で詰まってスレ検索して来てみたけどこのスレは高尚過ぎるなw
初心者スレにでも行こう
初心者スレにでも行こう
439デフォルトの名無しさん
2021/03/04(木) 23:27:05.69ID:320wEDvY _beginthreadex() を使ったマルチスレッドプログラムについて質問です。
この関数の説明を見ると、「_beginthreadex() のコールに成功すると、スレッドのために
タイムスライスが割り当てられたか否かによらず、スレッドはアクティブ(non-signal)になる」
とあったのですが、_beginthread() がスレッドハンドルを返すよりも前にスレッド関数内の
処理が実行される(完了する)ことはありえますか?
この関数の説明を見ると、「_beginthreadex() のコールに成功すると、スレッドのために
タイムスライスが割り当てられたか否かによらず、スレッドはアクティブ(non-signal)になる」
とあったのですが、_beginthread() がスレッドハンドルを返すよりも前にスレッド関数内の
処理が実行される(完了する)ことはありえますか?
440デフォルトの名無しさん
2021/03/05(金) 15:45:04.28ID:0Dz+Yobc >成功した場合、これらの各関数は、新しく作成されたスレッドへのハンドルを返します。ただし、新しく作成されたスレッドが短時間で終了した場合、 _beginthread は有効なハンドルを返さない可能性があります。 (「解説」の説明を参照してください)。
>_Beginthread よりも _beginthreadex を使用する方が安全です。 _Beginthread によって生成されるスレッドが短時間で終了した場合は、 _beginthread の呼び出し元に返されるハンドルが無効であるか、別のスレッドを指している可能性があります。 ただし、 _beginthreadex によって返されるハンドルは _beginthreadex の呼び出し元によって閉じられる必要があるため、 _beginthreadex がエラーを返さなかった場合は、有効なハンドルであることが保証されます。
ハンドルが有効であることは保証されているけど
実行順についての言及はないし、
そもそも別スレッドなら、どちらが先に行われるかについては何の保証もないと考えるべきじゃないのかな
「APIから戻る」のだって実行権がなければ後回しにされる可能性はあるんだから
>_Beginthread よりも _beginthreadex を使用する方が安全です。 _Beginthread によって生成されるスレッドが短時間で終了した場合は、 _beginthread の呼び出し元に返されるハンドルが無効であるか、別のスレッドを指している可能性があります。 ただし、 _beginthreadex によって返されるハンドルは _beginthreadex の呼び出し元によって閉じられる必要があるため、 _beginthreadex がエラーを返さなかった場合は、有効なハンドルであることが保証されます。
ハンドルが有効であることは保証されているけど
実行順についての言及はないし、
そもそも別スレッドなら、どちらが先に行われるかについては何の保証もないと考えるべきじゃないのかな
「APIから戻る」のだって実行権がなければ後回しにされる可能性はあるんだから
441sage
2021/03/06(土) 05:17:04.33ID:0GCeIGT3442デフォルトの名無しさん
2021/03/06(土) 11:08:41.13ID:pd/Aiz5V ちなみにCentOSはスレッドのコアが指定できるよ。
443デフォルトの名無しさん
2021/03/06(土) 11:30:24.47ID:UzpsIFsk macOSだとコア指定できない。
444デフォルトの名無しさん
2021/03/06(土) 13:08:47.51ID:VGFn/kw3 あわしろ氏によると、Macは既にオワコンなので、WSLを使うと良いらしい。
445デフォルトの名無しさん
2021/03/25(木) 15:15:49.52ID:LuSagST9 針に糸を通す( thread a needle
糸をつむぐ( spin thread [yarn]
糸が切れた( The thread broke.
琴の糸を締める( tighten a string of a koto
糸をかき鳴らす( strum the strings
糸をつむぐ( spin thread [yarn]
糸が切れた( The thread broke.
琴の糸を締める( tighten a string of a koto
糸をかき鳴らす( strum the strings
446デフォルトの名無しさん
2021/04/03(土) 09:59:34.29ID:CHs8071g このスレ来年で10年か
スレ推奨図書とかないの?
スレ推奨図書とかないの?
447デフォルトの名無しさん
2022/04/14(木) 16:49:21.50ID:wwxSZsaE マルチスレッド処理の花形といえばハードなリアルタイムスレッドとバックグラウンドスレッドの間のデータのやり取りだと思ってるんだが
スレの過疎っぷりを見るに、殆どの人にとって必要のないものだったんだな
スレの過疎っぷりを見るに、殆どの人にとって必要のないものだったんだな
448デフォルトの名無しさん
2022/05/26(木) 01:42:01.15ID:EhvYdlEg449デフォルトの名無しさん
2022/05/26(木) 16:41:59.49ID:kr4vk/7I450デフォルトの名無しさん
2023/10/18(水) 18:12:44.04ID:k+tvnK8M >>432
とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。
サブスレッドはイベント処理とWaitForSingleObjectで待たせておいて、メインスレッドから情報を送って
SetEventでイベントを動かす。メインスレッドはサブスレッド9個からSetEventでイベントが返らない限り
イベントとWaitForSingleObjectを駆使して止めておく。
とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。
サブスレッドはイベント処理とWaitForSingleObjectで待たせておいて、メインスレッドから情報を送って
SetEventでイベントを動かす。メインスレッドはサブスレッド9個からSetEventでイベントが返らない限り
イベントとWaitForSingleObjectを駆使して止めておく。
451デフォルトの名無しさん
2023/10/18(水) 18:13:06.20ID:k+tvnK8M >>432
とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。
サブスレッドはイベント処理とWaitForSingleObjectで待たせておいて、メインスレッドから情報を送って
SetEventでイベントを動かす。メインスレッドはサブスレッド9個からSetEventでイベントが返らない限り
イベントとWaitForSingleObjectを駆使して止めておく。
とりあえず、メインスレッド1個にサブスレッドを9個用意し、基本的な管理はメインスレッド管理。
イベントハンドルは9×2個用意する。
サブスレッドはイベント処理とWaitForSingleObjectで待たせておいて、メインスレッドから情報を送って
SetEventでイベントを動かす。メインスレッドはサブスレッド9個からSetEventでイベントが返らない限り
イベントとWaitForSingleObjectを駆使して止めておく。
452デフォルトの名無しさん
2023/10/18(水) 18:16:53.34ID:k+tvnK8M453デフォルトの名無しさん
2023/10/19(木) 01:25:35.07ID:8UDFhheE >>365
REID 1 みたいな例があるから必ずしも昔の技術というわけではないな。
REID 1 みたいな例があるから必ずしも昔の技術というわけではないな。
454デフォルトの名無しさん
2023/10/19(木) 01:28:22.25ID:8UDFhheE >>16
あれって、OSの機能だから気にしなくても良いというのでは駄目か?
あれって、OSの機能だから気にしなくても良いというのでは駄目か?
455デフォルトの名無しさん
2025/05/12(月) 13:23:26.42ID:Zw0HuL6G 1000msecでコンテキストスイッチ何回発生するんだこれ
456デフォルトの名無しさん
2025/05/12(月) 13:41:45.50ID:zCv6/zTu ここで multi process な質問は反則?
457デフォルトの名無しさん
2025/05/13(火) 15:19:11.88ID:lpqGnCjc 高級言語しか使えない身で話すけど
Pythonで超重量級のCPU処理とOpenAIに対するリクエストで数秒I/Oに飛ぶ処理の二つがそれぞれタスクに分解されてるとき、
前者のタスクが処理完了すると後者のタスクで数個~数十個くらいタスクが新規作成されて、(c, c, c, i, i, i, i, i, i, c, i, i,...)
内部どうなってるのか知らんけどI/OでGIL解放されても後続のタスクが何個も後者のタスクだから前者のタスクがくそ遅延するってあり得る?
両者のタスクを別々のプロセスに切り分けたら前者のタスクが遅延するとかいうことなくなったんだけどさ
Pythonで超重量級のCPU処理とOpenAIに対するリクエストで数秒I/Oに飛ぶ処理の二つがそれぞれタスクに分解されてるとき、
前者のタスクが処理完了すると後者のタスクで数個~数十個くらいタスクが新規作成されて、(c, c, c, i, i, i, i, i, i, c, i, i,...)
内部どうなってるのか知らんけどI/OでGIL解放されても後続のタスクが何個も後者のタスクだから前者のタスクがくそ遅延するってあり得る?
両者のタスクを別々のプロセスに切り分けたら前者のタスクが遅延するとかいうことなくなったんだけどさ
458デフォルトの名無しさん
2025/05/14(水) 17:07:33.93ID:uDIzjmjF そういう場合
同じ状況になる再現コードを貼りましょう
同じ状況になる再現コードを貼りましょう
459デフォルトの名無しさん
2025/05/14(水) 17:34:26.40ID:Ga6mti+e 5次方程式に新公式を発見:ルートを超える新理論
2025.05.14 17:05:56 WEDNESDAY
https://nazology.kusuguru.co.jp/archives/177496
>>オーストラリアのニューサウスウェールズ大学(UNSW)で行われた研究
プログらまーも覚えるとよい
125年越しに解決したかもしれない「ヒルベルトの第6問題」とは?
2025年05月10日 15時00分
https://gigazine.net/news/20250510-hilberts-6th-problem-solved/
2025.05.14 17:05:56 WEDNESDAY
https://nazology.kusuguru.co.jp/archives/177496
>>オーストラリアのニューサウスウェールズ大学(UNSW)で行われた研究
プログらまーも覚えるとよい
125年越しに解決したかもしれない「ヒルベルトの第6問題」とは?
2025年05月10日 15時00分
https://gigazine.net/news/20250510-hilberts-6th-problem-solved/
レスを投稿する
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 [ぐれ★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 外務局長「中国さんごめんなさぁ...」小野田「中国なんかどうでもいいっ!」高市「首脳会談したい」マスコミ「立憲が悪いっ!!」 [237216734]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【悲報】日本人「日本が中国と戦争になったら世界中の国が応援してくれるぞ!」 [616817505]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
