[過去ログ] マルチスレッドプログラミング相談室 その8 (1001レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
1: 2009/09/21(月)17:19 AAS
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その7
2chスレ:tech

■過去スレ
その1 2chスレ:tech
その2 2chスレ:tech
その3 2chスレ:tech
その4 2chスレ:tech
その5 2chスレ:tech
その6 2chスレ:tech

OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ
【OS】
【言語】
【実行環境】
【その他特記する事項】
875: 2012/02/23(木)01:04 AAS
>>874
SSDから。
876: 2012/02/23(木)01:07 AAS
いやだから。
SSDがとんだけ普及してるか、は実測値に影響する項なのか?ってことだろ
877: 2012/02/23(木)01:23 AAS
普及してるかどうかは実測値には影響しないよ。
SSD上での実測値改善が見られるとありがたいけど、
世の中SSD搭載してないPCも多いから、
SSDだけで速くなるプログラムはよくないよねって話しだし。
878: 2012/02/23(木)01:25 AAS
そっちかよ
自分とこの環境で動かすんじゃないのか
879
(2): 2012/02/23(木)01:49 AAS
自作のハッシュ計算ツールだけど、MD5計算速度はキャッシュに乗ってる状態だと
3GHz弱のCore2Duo程度のCPUでも300MB/sは超えてるぞ。
計算のが十倍遅いってどういうことだ?
HDDなんて速くても100MB/s題だと思うが…
880: 2012/02/23(木)01:57 AAS
スレッド構成を書いてもらわないとなんとも言えないなぁ
単にシングルスレッドなら100MB/s超えるしね
881: 2012/02/23(木)01:59 AAS
>>879
読み込み時間を差し引いた計算時間はどれぐらいだったの?
882: 2012/02/23(木)02:05 AAS
>>879
300MB/sってのは、MD5の関数なりクラスなりが1秒間に
計算できた情報量という理解であってる?
883: 2012/02/23(木)02:07 AAS
読み込みと計算は別スレッドで同時にやってるから正確には分からんな。
まあいろいろ状況によって時間が変わるけど、計算だけなら最速時で400MB/sくらいだった希ガス。
ああもちろん、読み込みやってもキャッシュに乗ってたら最速だとほぼ同じくらいまで行くよ。
884: 2012/02/23(木)02:31 AAS
純粋な計算速度が負けるってのは構成が gcc+linux+Phenom X4 1.8Ghz だからなのかねぇ
885
(1): 2012/02/25(土)14:26 AAS
ちょっとスレッドとは違うかもしれないんだけど
メッセージキューを設計しています
シグナルハンドラからキューに積みたいんですが
どうしても排他制御ができません
うまい方法はありますでしょうか
886: 885 2012/02/25(土)14:28 AAS
自己解決しました
887
(1): 2012/02/28(火)00:27 AAS
C# の.NET4.0なんですけど

List<Double> hoge は適当な値が入っているとして

Parallel.For(0,hoge.Count,(val)=>
{
hoge[val] = 0.0;
});

とした場合、常にhogeの中身が全て0.0になりますか?
この処理はLockしなくても大丈夫のような気がするんですが少し心配です。
888: 2012/02/28(火)00:38 AAS
MSの今のList<T>の実装では問題ないはずだけど保証されているわけではない
でもそれデリゲート呼び出しのコストがかさむから普通にループ回したほうが速いだろ
並列でやるんなら、4コアなら領域を4分割して中でループ回したほうがいい
889: 2012/02/28(火)00:46 AAS
つまり、>>887

Parallel.Invoke(()=>
{
 for(int i = 0;hoge.Count/4;i++)
  {
   hoge[i] = 0.0;
  }
},
()=>
{
   for(int i = hoge.Count/4;(hoge.Count/4)*2;i++)
  {
   hoge[i] = 0.0;
  }
} ・・・(以下略)
とした方が良いということですか?
890: 2012/02/28(火)00:47 AAS
訂正
読み取りだけならスレッドセーフだと書いてあるな
891
(1): 2012/02/29(水)12:48 AAS
いくつかstatic変数があって、それぞれに書き込み続ける
スレッドを作ったのですが、コンテキストスイッチが発生
しまくってます(2000〜3000/秒)
int a, b, c;
DWORD __stdcall A(void*){ a = ... }
DWORD __stdcall B(void*){ b = ... }
DWORD __stdcall C(void*){ c = ... }
それぞれのスレッドを単独で実行させた場合は、それほど
スイッチしないので、キャッシュ競合が原因なんでしょうか。
それぞれの変数が同じキャッシュラインに乗らないようにするには
どうすれば良いですか?
それともキャッシュは関係ないですか?
VC10です。
892: 2012/02/29(水)21:27 AAS
なんでキャッシュでコンテキストスイッチが起こるのよ…
893
(1): 2012/02/29(水)22:05 AAS
>>891
コンテキストスイッチは関係ない。

>それぞれの変数が同じキャッシュラインに乗らないようにするには

キャッシュは8〜32バイトぐらいの単位で管理しているから、
適当に無駄なメモリを確保して、それぞれのメモリアドレスが
隣接しないようにすればよい。
894: 2012/02/29(水)22:19 AAS
>それぞれのスレッドを単独で実行させた場合
はああ?
895: 2012/03/01(木)00:23 AAS
メモリバリアの間違い?
896: 2012/03/01(木)00:47 AAS
なんでメモリバリアが出てくんだよ
897
(1): 2012/03/01(木)00:55 AAS
コンテキストスイッチみたいなのはCPUを占有すると起こるものなの
無限ループしてパソコンがハングしたらどうするつもりなんだろうね
898
(1): 2012/03/01(木)01:28 AAS
1スレッドで実行→コンテキストスイッチが起こらない
3スレッドで実行→コンテキストスイッチが起こりまくる

これのどこが悪いのか俺にはわからないのだがとりあえずCPUはいくつある?
899: 2012/03/01(木)08:36 AAS
>>898
cpuは4コアです。

>>897
各ループにSleepは挟んでます。

>>893
無駄なメモリを置いて、キャッシュ対策しようと思います。
また、コンテキストスイッチ数が多いのは、別の原因を探してみます。
900: 2012/03/01(木)08:45 AAS
Sleep入れたらそりゃぁ、コンテキストスイッチもするだろうよ。
901: 2012/03/01(木)15:54 AAS
コンテキストスイッチさせるのがSleepの目的のひとつだもんよ。
902: 2012/03/01(木)16:16 AAS
static変数に書き込み続けるスレッドとか
Sleep挟んでますとか
キャッシュ競合を避けるとか
    何 考 え て る の よ ?
903: 2012/03/01(木)16:43 AAS
マルチプロセスほど枯れきっちゃいない技術だから、ということでしょうがあんめぇ
904: 2012/03/01(木)17:01 AAS
スレッドとかどう捉えてるんだろうね?
905: 2012/03/01(木)19:41 AAS
>Sleep
噴いたわw
906: 2012/03/01(木)20:09 AAS
Windowsなんて常時、100スレッド以上動いてるのに。
907
(1): ◆0uxK91AxII 2012/03/01(木)20:27 AAS
4CPU環境、速い順に
キャッシュラインを別にした3thread
キャッシュラインが同じっぽい3thread
threadを作らずに1thread
908: 2012/03/01(木)20:42 AAS
>>907
>キャッシュラインが同じっぽい3thread
>threadを作らずに1thread

このふたつどっちが早いかは環境やプログラムによるだろ。
後者の方が早くなる事もあるよ。
909: ◆0uxK91AxII 2012/03/02(金)10:33 AAS
環境と粒度に依存。
910
(8): 2012/03/26(月)15:59 AAS
メインプロセスと同じ物理コア内のHyperThreading論理コアで実行されている
サブプロセスが、メインプロセスの動作を邪魔しないようにするためのAPI関数は
ありませんか?

例えば、SetProcessAffinityMaskを同じ値にした2つのプロセスは
SetPriorityClassでサブの優先度を下げれば、メインプロセスが
動いているときはサブプロセスはほとんど動作しなくなります。

しかし、SetProcessAffinityMaskを、メインプロセスで1、サブプロセスで2に
した場合、サブプロセスの優先度が低いにもかかわらず、メインプロセスと
CPUリソースを均等に割り振っているようです。

これを防ぐための、SetProcessPriorityに変わるようなAPI関数はありませんか?
911
(1): 910 2012/03/26(月)16:18 AAS
superπを2つのフォルダにコピーして1つをメイン、もう1つをサブとする。
メインのPriorityClassをNORMAL、AffinityMaskを1に固定。
サブのPriorityClassとAffinityMaskを変化させたときの、2つのsuperπの
838万桁計算時間を比較。

記号 P サブのPriorityClass, A: サブのAffinityMask: メインの時間/サブの時間
A P NORMAL, A 1: 5:19/5:22
B P BELOW, A 1: 2:57/5:38
C P NORMAL, A 2: 3:31/3:30
D P BELOW, A 2: 3:30/3:30
E P NORMAL, A 4: 2:53/2:47
F P BELOW, A 4: 2:52/2:47

Dのパターンでのタイムを見ると、サブの優先度がメインより低いにもかかわらず
Cのパターンと同じになっています。

この状況でメインのタイムはFと同等で、サブのタイムはBよりは短くなるような、
SetPriorityClassのような関数はありませんか?
912: 2012/03/26(月)16:27 AAS
そんなaffinity maskを設定するのが悪い
913: ◆0uxK91AxII 2012/03/26(月)16:47 AAS
下手の考え休むに似たり。
914: 910 2012/03/26(月)16:56 AAS
AffinityMaskを設定したのは、確実に再現させるためです。
実際には設定しなくても、多くのプロセスが動いている場合に
優先度の高いプロセスが、優先度の低いプロセスに阻害される
可能性を排除したいのです。
915
(1): 2012/03/26(月)20:42 AAS
そんなπとかどーでもいいもん計算せずに実用的なもんつくれよ。
πなんて20桁でもあれば地球の外周を計算できるぞ。
916: 2012/03/26(月)22:29 AAS
>>910
>メインプロセスの動作を邪魔しないようにするためのAPI関数はありませんか?
OSは何?

>Dのパターンでのタイムを見ると、サブの優先度がメインより低いにもかかわらず
>Cのパターンと同じになっています。
もしかしてWindows?
Windowsにはプライオリティブーストなど、CPU占有率の高いプロセスのプライ
オリティを強制的に下げる機能や、アクティブウィンドウを持つプロセスの
プライオリティを強制的に上げる機能があるから、設定した通りのプライオリティ
で動作している事は保証されないよ?
917
(2): 910 2012/03/27(火)09:12 AAS
>そんなπとか
superπを作っているのではなく、優先度の制御ソフトを作ろうとしています。
具体的には動画エンコードしながらゲームしているのですが、
core 2のときはエンコーダのプロセス優先度をIDLEかBELOW_NORMALにしておけば
ゲームのフレームレートが落ちることはなかったのですが、
core i7にしたら落ちるようになってしまったのです。
918: 910 2012/03/27(火)09:28 AAS
>OSは何?
Windows全般ですが、7固有のAPIでもかまいません。

PriorityBoostで優先度が動的に上下するのは知っています。
BのパターンのメインプロセスはE/Fに比べて
若干時間が長くなっており、これがPriorityBoostなどによる
効果だと思いますが、これくらいは問題としていません。
919
(1): 2012/03/27(火)09:36 AAS
>>917
動画エンコードプロセスに対して、Battle Encoder Shirase みたいな制御をするとか?
920
(1): 2012/03/27(火)10:12 AAS
>優先度の高いプロセスが、優先度の低いプロセスに阻害される
HTに係るCPUの内部状態を、そのCPU上で動いているプロセスから、
ソフト的に制御する方法なんて無いよ。
ICEでも使って外部からコントロールするなら兎も角。
・・・っていうか、そのアプローチは不可能に近いって何となくわからない?

>Cのパターンと同じになっています。
ソフト(OS)から見たら、HTなんて関係ないし、二つのCPUは等価なのだから、
ソフトにスケジューリングを任せてたら、
二つのスレッドの実行時間がほぼ同じになるのは当然。

>>917
>core i7にしたら落ちるようになってしまったのです。
それホントにCPU依存の話か?
Core2とi7はソケット形状が違うので、CPU以外にも色々と構成が違うはずだが。
VIAとかの互換CPUならともかく、インテル純正CPUでその手の話って聞かないからさ。

もしかしてCore i7のCPU内蔵GPUを殺すと意図したとおりに動いたりとかしないか?
だとしたらGPUとCPUでメモリバス食いあってるか、GPUのハードウェアエンコーダが
有効になってて、GPU食いあってるだけだと思うぞ。
921: 910 2012/03/27(火)10:53 AAS
>>919 このソフトを試してみたいと思います。
これでうまくいくようなら、メインプロセスと同じ物理コアの別論理コアで
動くスレッドに対して同じような処理をするプログラムを作ってみようと思います。

>>920 ハード的に制御してくれるAPIがないか知りたかったのです。
エンコーダはマルチスレッドですが、GPUは使っていません。
ゲームとエンコーダをE/Fのパターンのように違う物理コアのAffinityMaskにしてしまえば
ゲームのフレームレートが落ちないことは確認しました。
922: 営利利用に関するLR審議中@詳細は自治スレへ 2012/03/29(木)23:58 AAS
>>911
その計算時間どういう操作してどう計ったの?
838万ケタを同時に計算開始しただけ?

論理CPUの割り当てが別なら優先度なんて関係ないに決まってるんだが、意味分かってるか?
ゲームメインを物理コアにだけマスク指定したら問題なさそうな気がするが、それじゃうまくいかないか?
923
(1): 910 2012/04/02(月)12:23 AAS
計算時間はsuperπが計測しています。
同時に計算開始しました。
2つの開始ボタンを押す間の数百ミリ秒は、今回は無視です。

>論理CPUの割り当てが〜
だから、それを優先付けるAPIはないかという質問です。
HyperThreadingを使用するとパフォーマンスが落ちると問題視され
Pentium4からずいぶん時間がたったので、そろそろ出ていないかと思いました。
ないので代替案を提示してくださってるのだと思いますが。

>ゲームメインを物理〜
それだと、論理コアが1つ遊んでしまいます。
924
(1): 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)17:53 AAS
遊べば他方を圧迫しない、働けば圧迫する
HTのために2つあるのは状態に関するレジスタ類だけだもの
925: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)20:40 AAS
自分で設定する気が無いんならOSに任せろ
926: 915 2012/04/02(月)20:57 AAS
>>923
SetProcessAffinityMask
外部リンク[aspx]:msdn.microsoft.com

ムダだろうがこれ使ってみれば?
927: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)21:05 AAS
既出か。メンゴメンゴ。
928
(1): 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)21:25 AAS
>>ゲームメインを物理〜
>それだと、論理コアが1つ遊んでしまいます。

何を言ってるのか分からなくなってきた。
論理コアをあそばせるのがもったいないほどCPUを使い切るマルチスレッド化が出来てるのか?
もうちょっと詳しくどういう動作をさせてるのか、どういうスレッド構成になってるのか書いてくれ。

まさかCPUパワーが余ってるのに論理コアが遊んでるのは許せないとかとち狂ったこと言ってないよな、念のために聞くが。
929: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)21:29 AAS
>>928
どんな理由でもかまわないだろ・・・
930: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)21:44 AAS
結局のところ>>924でどうにもならないんじゃないの?
931: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/02(月)23:47 AAS
元の質問に誰も答えないのは、万が一あったりするとアレだからだろうねぇ。
でも、さすがに無いと思うよ、そんなAPIは。

別な方法で妥協するしかないんじゃないかな。
932: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/03(火)07:42 AAS
あるか否かは、CPUのニーモニックコードのリストを見ればわかるよ。
そこに命令が用意されていないなら、CPUの内部状態をコントロールしようがない。

非公開命令が用意されている可能性は残るけどな。
933: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/03(火)11:36 AAS
結局一緒じゃねーか。
あとそういうニーモニックがあるかどうかじゃ確実には分からんよ。

無いと思うけどね仕組み上から考えても。
934
(1): 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/03(火)14:07 AAS
なんでハードウェアの話になってしまったのかよくわかんないけど、
OS のスケジューリングの話じゃないの?
こんなのとか。
外部リンク:kerneltrap.org

Windows も HT を意識したスケジューリングをしてくれればいいのにね。
935: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/03(火)15:03 AAS
そりゃOSレベルじゃ制御してない部分の話だもん。
どころかハードレベルでも制御不能だろってのが優勢。
936: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)07:28 AAS
>>934
してるよ
外部リンク[htm]:www.dosv.jp
APIでプログラマに公開されてるかは知らんが
937: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)10:42 AAS
物理マルチコアにHTなんていらないんじゃないかな
938: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)10:44 AAS
HTをONにすると2000ではひっかかりまくるが、XPではスムーズ。
どうみても対応している。
939: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)11:02 AAS
ただlinuxみたいに同一物理コアの別論理コアに割り当てられたスレッドの優先順位を考慮して
タイムスライスの比率を変えるようなことはしてないね。
940: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)11:08 AAS
別コアなのにタイムスライスって、スレッドを一時停止してるっことなんだが、
Linuxではそんなことしてるのか。逆にコスト高くつくんじゃないのか。
941
(1): 910 2012/04/04(水)11:42 AAS
HyperThreadingは空いている演算器を有効に使うためのものなのに
メインで使っている演算器も奪ってしまうのはおかしいと考えており
別のOSでは実際にそれを回避するようにもなっているということで
とりあえず安心しました。
942: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)13:07 AAS
なんというか・・・
同時に動かすから、空いてるのを有効に使えるのよ
そして同時に動かせば他方を圧迫する
圧迫を回避する=片方を止める=空いてるのを使えてない なのよ
943: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)14:29 AAS
>>941
なってねーよ馬鹿かお前は。
944: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/04(水)14:30 AAS
あいつは人の話を聞かないからなあ。
何でも都合よく解釈しやがる。
945: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/05(木)13:36 AAS
そんな理論武装で大丈夫か?
946
(1): 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/06(金)15:00 AAS
pthread_rwlockの使い方をおしえて
947: 営利利用に関するLR審議中@詳細は自治スレへ 2012/04/06(金)16:30 AAS
>>946
その前に聞くが、pthread_mutex_lockの使い方くらいは知っているのか?
pthread_rwlockはそれより厄介だぞ。
外部リンク:www.tsoftware.jpの図4が理解できないならやめとけ。
つーか、本当にrwlockが必要なのか?
948: 2012/05/11(金)15:36 AAS
2CoreのCPUなら問題ないのに、
HTをONにするとフリーズしたり不安定になるプログラムって何が原因なんだろう?
949: 2012/05/11(金)15:41 AAS
複数のスレッドを使うプログラムだろうから、スレッド間の同期がいい加減なのだろう。
950: 2012/05/12(土)01:16 AAS
同時に動くとまずいコードがあるんだろう
951: 2012/05/12(土)12:53 AAS
2Coreなら大丈夫というのがおかしい。
952: 2012/05/12(土)13:07 AAS
別におかしくないよ。
953
(3): 2012/05/12(土)13:38 AAS
いやおかしい。
おかしくないなら、2CoreでOKで、HTだとダメなパターンプリーズ。
954: 2012/05/12(土)13:45 AAS
ドライバレベルなら昔あったな。
省電力でCPUクロックダウン/休止させる時にHTなので全部止まっちゃいました(テヘっ)ってのが。
955: 2012/05/12(土)13:47 AAS
試してみて動いた=OKだと思ってるなら根本的に勘違いしてる
956: 2012/05/12(土)13:51 AAS
>>953
そんなこと考えてる暇あったら、HT時に起こってる問題を正確に掴むべき。
ちょっとしたタイミングの違いで動いたり、動かなかったりなんてのはいくらでもある。
957: 2012/05/12(土)13:53 AAS
おまえの勘違い半端ねぇ
958: 2012/05/12(土)13:54 AAS
たまたまの話ならどうでもいい。
頭の悪い突っ込みは必要ないから。
959: 2012/05/12(土)13:55 AAS
突っ込みはしたものの、
HTだけダメなパターンはなに一つも思いつきませんでした。
ごめんなさい。
960: 2012/05/12(土)14:01 AAS
お前に思いつくかどうかなんてどうでも良いんだよ。
961: 2012/05/12(土)14:03 AAS
>ちょっとしたタイミングの違いで動いたり、動かなかったりなんてのはいくらでもある。

この原因は二つ。
・同期処理をしていない。
・同期処理が必要な部分を洗い出せていない。

HTがダメで2CoreがOKな理由になってないなぁ。
考える暇がないのか考える頭がないのか。
962: 2012/05/12(土)14:06 AAS
相談スレで相談したら自分でやれって言う奴を相手にするな。
ただ煽りたいだけの馬鹿なんだから。
963: 2012/05/12(土)14:06 AAS
現に原因不明の不具合を目の前にして、そんな事考えるだけ無駄だと分からないやつは開発向いてない。
964: 2012/05/12(土)15:03 AAS
問題の起きるメカニズムを解明するのは興味深いが、
解明したところで自己満足以外に得られるものがないからな
結局きっちり同期するしかないんだし
965
(1): 2012/05/12(土)15:05 AAS
二つの処理が30ナノ秒以内に終わらないとタイムアウト
するウンコな処理があって2CPUだと偶然動いたとか。

KUSOなコードに論理性を求めるほうが時間の無駄。
単にHT環境で再現するという明らかな不具合を直せばよろしい。
966: 2012/05/12(土)18:26 AAS
Pen4の頃のHTを使っていた時は明らかに普通のデュアルCPUと
タイミングが違ってバグの出方も全然違ったよ

>>965の言っているように運よく再現できる環境があるなら
そこで治せばいいんじゃない
967: 2012/05/12(土)20:16 AAS
>>953
1スレッドがループ内でレジスタを使い切るパターンだろ
フリーズまではいかんが、挙動が悪くなる
968: 2012/05/12(土)20:37 AAS
自分で2CoreではセーフなのにHTをオンにしたら動かない!って言ってるのに、
「そんなパターンは無い!」とか分裂症ですか?って感じ。
そんなパターンがあるからその現象が発生してるのは明らかなのに。
現実逃避もいい加減にしろよ。
969: 2012/05/12(土)21:02 AAS
スペック厨で、自分の最強ハードに問題が有るって事が気に入らないんだろう

目の前で起きてる問題をどう解決するかが問題なんだがオタクは空気がよめないね
970: 2012/05/12(土)21:07 AAS
HTをオフにしたら動きました。
971
(1): 2012/05/12(土)21:19 AAS
>>953
void threadA(){
while(1);
}

void threadB(){
while(1);
}
972: 2012/05/13(日)02:00 AAS
それのどこがHTがダメなんだ?
973: 2012/05/14(月)09:08 AAS
>>971
シングルコアならOSがタイムシェアリングして均等に実行してくれる。

マルチコアならOSがそれぞれのコアに割り当てて均等に実行してくれる。

HTだとOSはそれぞれの仮想コアに割り当てて均等に実行しているつもりでも、
片方のスレッドが動いている間、もう片方のスレッドは満足に実行されない。
上のようなBusyLoop場合とくに顕著で、何もしない処理がCPUを占有する事になる。
これを防ぐために何もしないから他の仮想コアに処理を渡してよい事を示す
命令が追加されている。
974: 2012/05/14(月)16:30 AAS
htでもだいたい均等に割り振られるが。
975: 2012/05/14(月)17:15 AAS
HT非対応なんだろ
976
(2): 2012/05/18(金)21:50 AAS
すいません。教えてください。
signalマスクをかけたスレッドの関数内で、popenをコールしてるんですが、ctrl+Cするとポインタ(NULLでないpopenの戻り値)からのfgetsが成功する時としない時があるんですが留意する事って何かありますか?
ちゃんとpthread_joinは出来ているのでマスクには問題無いと思うのですが。
宜しくお願いします。
977: 2012/05/21(月)08:21 AAS
>>976
どうやってマスクかけたのか、コードをしめせ
978: 2012/05/23(水)22:08 AAS
>>976
そうだな。エラーコードには留意するんだな。
979
(2): 2012/06/13(水)20:18 AAS
並列化できるはずのプログラムをコンパイルして,
タスクマネージャーのリソースモニタで見ても,
スレッド数が1にしかなりません,どなたか,解決策を教えてください

【OS】 win 7 pro
【言語】 fortran
【実行環境】 インテルR Visual Fortran コンパイラー 11.1
visual studio 2008
【その他特記する事項】
クラーメルの公式で逆行列を求めるプログラムです.
並列化したい部分は以下の通りです.
nは行列の行数,aはもともとの行列,bは逆行列の成分です.
サブルーチンでは,aの値を読むだけで,変化はさせていないです.
その意味でreal*8,valueにしようとしたら,コンパイラに怒られました.
プロジェクトのプロパティで,
構成プロパティ-fortran-最適化-並列化onにしています.

do i=1,n !-全行に対して
do j=1,n !-全列に対して
call sho_det(n,i,j,a,b(i,j))
enddo
enddo
980
(1): 2012/06/13(水)20:20 AAS
>並列化できるはず
並列実行できるようなプログラム書かないと
981
(1): 2012/06/13(水)20:28 AAS
>>980
少なくとも,i,jはいかなる順番で計算しても問題ないという意味では,並列実行できるのではないかと考えましたが,
サブルーチン化しては並列実行できないのでしょうか?
982
(1): 2012/06/13(水)20:57 AAS
sho_det
に並列実行してくれるしかけがあるの?
983: 2012/06/13(水)21:13 AAS
>>982
ありません.
984: 2012/06/13(水)21:21 AAS
じゃあ、自力でできるようにするしか
並列処理したから早くなるというもんでもないだろうに
並列処理できるようにする方が難易度高
985: 2012/06/13(水)21:34 AAS
>>979
sho_detの中身をくわしく。
特にbへの代入
986: 2012/06/13(水)23:14 AAS
なぁなぁ、くらーめるの公式ってことは内部で余因子展開やってるよね?
余因子展開は並列和を行うため、一つの行列式は一個のスレッドで固まってないとだめ(もしくはプリフィクススキャン)なので
call sho_det(n,i,j,a,b(i,j))がどうやら行列の個々の要素ごとに演算を行なっているように見えるので
このループ全体が並列化の対象でない限りはcall sho_det(n,i,j,a,b(i,j))だけがマルチスッドレでもだめなんじゃないの?

みたいなことを素人が書いてみましたがどうですか?^^
987
(2): 2012/06/13(水)23:42 AAS
サブルーチン呼び出しは副作用を仮定して並列化不可能とみなす。
最適化を実行速度以上、かつプロシージャ間の最適化有効なら
コンパイラーの気分がいい時にはやるときもある。

とりあえず診断に自動パラレライザーのレポートがあるならそれを付けろ。
988
(1): 2012/06/14(木)12:17 AAS
ソースを示した方が早くてわかりやすいと思うので,アップします.
外部リンク:www5.puny.jp
pass:giko

>>987
レポートはこれで合ってますでしょうか?
プロジェクト '20120528_fast_pararell_subroutine'、構成 'Release|x64' の中間ファイルと出力ファイルを削除しています。
コンパイルしています インテル(R) Visual Fortran 11.1.067 [インテル(R) 64]...
ifort /nologo /Qparallel /module:"x64\Release\\" /object:"x64\Release\\"
/libs:static /threads /c /Qvc9 /Qlocation,link,"c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64"
"C:\Users\my_note\Desktop\fortran\20120528_fast_pararell_subroutine\20120528_fast_pararell_subroutine\20120528_fast_pararell_subroutine.f90"
リンクしています...
Link /OUT:"x64\Release\20120528_fast_pararell_subroutine.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST
/MANIFESTFILE:"C:\Users\my_note\Desktop\fortran\20120528_fast_pararell_subroutine\20120528_fast_pararell_subroutine\x64\Release\20120528_fast_pararell_subroutine.exe.intermediate.manifest"
/SUBSYSTEM:CONSOLE /IMPLIB:"C:\Users\my_note\Desktop\fortran\20120528_fast_pararell_subroutine\20120528_fast_pararell_subroutine\x64\Release\20120528_fast_pararell_subroutine.lib" "x64\Release\20120528_fast_pararell_subroutine.obj"
Link: executing 'link'

マニフェストを埋め込んでいます...
mt.exe /nologo /outputresource:"C:\Users\my_note\Desktop\fortran\20120528_fast_pararell_subroutine\20120528_fast_pararell_subroutine\x64\Release\20120528_fast_pararell_subroutine.exe;#1"
/manifest "C:\Users\my_note\Desktop\fortran\20120528_fast_pararell_subroutine\20120528_fast_pararell_subroutine\x64\Release\20120528_fast_pararell_subroutine.exe.intermediate.manifest"

20120528_fast_pararell_subroutine - エラー 0、警告 0
989
(1): 988 2012/06/14(木)12:22 AAS
ダウンロードパスはこちらでお願いします.
外部リンク:www5.puny.jp
990
(1): 2012/06/14(木)12:40 AAS
ちなみに,サブルーチンに入れる前でも,マルチスレッド化はされませんでした.
i,jのdo内で,コールしている部分にそのままサブルーチンの中身を書いていました.

その際,shoi(),shoj(),k,min_more,sekiなど,
ローカルな変数はすべて配列化して,引数に(i,j)をとり,
コンパイラにはdoの順序が任意であるように伝わるようにしたのですが,
それでもだめでした.
991
(1): 2012/06/14(木)16:19 AAS
クラーメルの公式って並列処理できるものなの?
から考えませう
992: 2012/06/14(木)20:35 AAS
>>987
(´・∀・`)ヘー単にライブラリ追加するだけのオプションじゃないのか
993
(2): 2012/06/14(木)21:58 AAS
>>989
リンク先に該当ファイルがないよ
994
(1): 2012/06/14(木)22:30 AAS
>>993
外部リンク[f90]:www5.puny.jp
すみません、アップローダになれないもので。pass:giko

>>991
考えた結果、>>981,990のように、出来ると結論づけました。
間違っているなら、間違っているところを指摘お願いします。
995: 2012/06/14(木)23:39 AAS
オプション /Qpar-report3を付けてコンパイルするんだ。

並列化阻害要因が表示されるはず。
996: 2012/06/14(木)23:43 AAS
/Qpar_report3だったかも。
997: 2012/06/15(金)00:19 AAS
>>994
omp parallel
って、そういう使い方するもんじゃないような、よーしらんけど
998: 2012/06/15(金)00:28 AAS
上の続き
単純な2重ループだけだと、スレッド化してくれん

ループが二組以上でデータ等の依存関係がない場合にそれぞれのループをスレッド化してくれる

って、バカなりに解釈したけど
999: 2012/06/15(金)00:35 AAS
とりあえずサブルーチン化により並列実行でマズそうな点は解消されてるっぽいが
まぁコンパイラーの /Qparallel じゃ分からないくらいには複雑と思われる。

>>979
> VALUE属性はスカラ仮引数にのみ指定可能です。
外部リンク[html]:www.nag-j.co.jp

そういう意味を明示するなら引数授受特性を書いて
PURE 手続きにしてやると上手くいくかもしれない?
外部リンク[htm]:www.xlsoft.com

pure subroutine sho_det(n,i,j,a,b)
implicit none
  integer, intent(in) :: n,i,j
  real*8, intent(in) :: a(n,n)
  real*8, intent(inout) :: b
略)
1000: 2012/06/15(金)00:52 AAS
!!-----------小行列用に,i,jを飛ばした自然数の並びを作成
の部分は最適化できそうだけど、自力で...
1001: 1001 Over 1000 Thread AAS
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.033s