オフィシャルサイト
http://www.openmp.org/
リンクなどは>>2以下で
OpenMPプログラミング
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
NGNG199デフォルトの名無しさん
2009/05/10(日) 05:00:40 icc の -openmp-lib compat って必須だったけ?
200デフォルトの名無しさん
2009/05/10(日) 05:09:57 追加。
191の例だとcx,cly,clzの要素を参照するときに干渉が起こってそう。
たぶん一次元でそんなに大きくない配列だろうから、添字iとjのループの間で
この3変数をコピーしてみてはどうだろうか?
localcx[n]=cx[n]...みたいな。んでlocalcx, localcly...はprivate属性を付ける。
並列で無い場合には余計な動作だからかえって遅くなりそうだが。
gccはそこをうまくさばいているのかもしれないな。
>>198
お団子ありがとうw
おそらく添字kのループはunrollingの対象になるから、
そのままprivateな並列対象のままで良い気もするけどどうだろう?
191の例だとcx,cly,clzの要素を参照するときに干渉が起こってそう。
たぶん一次元でそんなに大きくない配列だろうから、添字iとjのループの間で
この3変数をコピーしてみてはどうだろうか?
localcx[n]=cx[n]...みたいな。んでlocalcx, localcly...はprivate属性を付ける。
並列で無い場合には余計な動作だからかえって遅くなりそうだが。
gccはそこをうまくさばいているのかもしれないな。
>>198
お団子ありがとうw
おそらく添字kのループはunrollingの対象になるから、
そのままprivateな並列対象のままで良い気もするけどどうだろう?
201デフォルトの名無しさん
2009/05/10(日) 05:13:51 さらに追加。cx, cly, clz については
CLY[index_x]=CLY[(IDX[i][j][k])]なんだから、
CLY[i][j][k] で表現できると思うんだけど。
暴力的ないい方だけど今ってメモリが青天井に近いから
係数の3次元配列つくってもいいんじゃないかな?
いずれにしてもコードいじるからなあ・・・。gccで幸せならそのまま、という手も。
CLY[index_x]=CLY[(IDX[i][j][k])]なんだから、
CLY[i][j][k] で表現できると思うんだけど。
暴力的ないい方だけど今ってメモリが青天井に近いから
係数の3次元配列つくってもいいんじゃないかな?
いずれにしてもコードいじるからなあ・・・。gccで幸せならそのまま、という手も。
202デフォルトの名無しさん
2009/05/10(日) 21:24:42 そうか
203デフォルトの名無しさん
2009/05/11(月) 16:23:48 フリーソフトウェア最高や!
ぷろぷらICCなんか最初からいらんかったんや!
ぷろぷらICCなんか最初からいらんかったんや!
204デフォルトの名無しさん
2009/05/12(火) 09:56:25 OpenMPはいざ知らず、普通のプログラムでiccは随分賢いコードを吐くよ。
後はあれだ、MKLのOpenMP対応は生半可じゃなくリニアリティが高い(投入コア数とパフォーマンスがよく比例する)。
後はあれだ、MKLのOpenMP対応は生半可じゃなくリニアリティが高い(投入コア数とパフォーマンスがよく比例する)。
205デフォルトの名無しさん
2009/05/12(火) 10:55:45 ifortで使ってるけど、16CPUくらいまでならいいよね。
経験的には32個過ぎるあたりからだんだん悪くなる(64CPUでだいたい48CPU相当)けどまあしょうがないか。
それ以上を厳しく要求される計算だとたぶんMPIと自前のソルバの組み合わせになってしまうのかも
しれないけど、まあ普段の用途には16か32倍も出れば御の字だろう。
経験的には32個過ぎるあたりからだんだん悪くなる(64CPUでだいたい48CPU相当)けどまあしょうがないか。
それ以上を厳しく要求される計算だとたぶんMPIと自前のソルバの組み合わせになってしまうのかも
しれないけど、まあ普段の用途には16か32倍も出れば御の字だろう。
206デフォルトの名無しさん
2009/05/12(火) 18:55:41 OpenMPで16スレッドも使えるようなCPUなんて持ってるのか。羨ましい。
汎用だと4が限界だし
汎用だと4が限界だし
207デフォルトの名無しさん
2009/05/12(火) 19:02:43 PCサーバなら、4core*2CPUはざらだと思うが。
# さすがに16とか32は見たことがない……
# さすがに16とか32は見たことがない……
208デフォルトの名無しさん
2009/05/12(火) 19:13:11 cell
209205
2009/05/13(水) 02:45:20 あまり使われていない altix の箪笥が使えるのです。
ふだんは 4core x 2 ですね。Xeon 8コアで、ちと古いItanium16個相当のパフォーマンスは出るので。
ふだんは 4core x 2 ですね。Xeon 8コアで、ちと古いItanium16個相当のパフォーマンスは出るので。
210デフォルトの名無しさん
2009/05/14(木) 01:08:55211デフォルトの名無しさん
2009/05/14(木) 02:01:54 ハンドアセンブル
212デフォルトの名無しさん
2009/05/14(木) 09:53:37 >>210
VTuneは使っている? そのくらいシビアな話なら動的解析してみると何か分かるかもよ。
VTuneは使っている? そのくらいシビアな話なら動的解析してみると何か分かるかもよ。
213デフォルトの名無しさん
2009/05/15(金) 01:38:09 VC++2008のStdしか持ってないが
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\vcomp90d.dll
というファイルが入ってる。これ使えるの?
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\vcomp90d.dll
というファイルが入ってる。これ使えるの?
214デフォルトの名無しさん
2009/05/15(金) 02:44:45215デフォルトの名無しさん
2009/05/21(木) 22:25:36 ちょっと興味があるのだが
OpenMPってこれから並列プログラミングのスタンダードになっていくのかね
MPI+OpenMPのクラスタなんてなかなかだな、環境とプログラムの内容によっちゃあ
OpenMPってこれから並列プログラミングのスタンダードになっていくのかね
MPI+OpenMPのクラスタなんてなかなかだな、環境とプログラムの内容によっちゃあ
216デフォルトの名無しさん
2009/05/22(金) 06:56:43 MPI使ったコードを既に持ってるなら、OpenMPはあまりいらないかもな。
OpenMP相当の事は自動並列かなりできるようだしMPI主体が大〜中規模計算の主流で、
マルチ・コアCPUが1〜2個くらいのシステムでお手軽並列が
これからのOpenMPの使いかたになるのではと勝手に予想するw
というかsgiが飛んだり、SUNがソフト屋に買収されたりNECが断念したりで今後のトレンドが読めんね。
OpenMP相当の事は自動並列かなりできるようだしMPI主体が大〜中規模計算の主流で、
マルチ・コアCPUが1〜2個くらいのシステムでお手軽並列が
これからのOpenMPの使いかたになるのではと勝手に予想するw
というかsgiが飛んだり、SUNがソフト屋に買収されたりNECが断念したりで今後のトレンドが読めんね。
217213
2009/06/02(火) 23:51:25 以下の2つのファイルをexeと同じフォルダに入れると使えました。
デバッグビルドでもOpenMPを使えるようです。
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\vcomp90d.dll
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\Microsoft.VC90.DebugOpenMP.manifest
デバッグビルドでもOpenMPを使えるようです。
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\vcomp90d.dll
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\Microsoft.VC90.DebugOpenMP.manifest
218デフォルトの名無しさん
2009/06/23(火) 01:54:45 PriusOnlineでOpenMP/VC8つかってるっぽい
どうしようクアッドコアにしようか
どうしようクアッドコアにしようか
219デフォルトの名無しさん
2009/06/23(火) 08:01:00 VC++2010にParallel Pattern Library(PPL)というマルチスレッドライブラリが
追加されるみたいだけどOpenMPとの住み分けはどうなるんだろう。
追加されるみたいだけどOpenMPとの住み分けはどうなるんだろう。
220デフォルトの名無しさん
2009/06/25(木) 06:30:55 いままでintel fortran 9.1使っていた。お試しで11入れてみた。
オプションはシェフお薦めの
ifort -fast -openmp
だけ。だいたい30%くらい速いようだ。コードにもよるだろうけど、いいね。
というか今までのはなんだったんだw
関係ないけどversion 8は挙動が変だ。なんじゃありゃ。
オプションはシェフお薦めの
ifort -fast -openmp
だけ。だいたい30%くらい速いようだ。コードにもよるだろうけど、いいね。
というか今までのはなんだったんだw
関係ないけどversion 8は挙動が変だ。なんじゃありゃ。
221デフォルトの名無しさん
2009/06/25(木) 06:31:45 あ、OSはlinux(版はよくわからんw)ね
222デフォルトの名無しさん
2009/06/25(木) 21:51:20 OpenMP3.0使った人いる?
223デフォルトの名無しさん
2009/09/11(金) 06:51:07 OpenMPを使ったループの中でrandを使うと、srandでseedを設定しても、毎回結果が変わってしまいます。
同じ結果を得るようにするにはどうしたらよいでしょうか?
同じ結果を得るようにするにはどうしたらよいでしょうか?
224デフォルトの名無しさん
2009/09/11(金) 08:54:45 >>223
スレッドセーフな擬似乱数生成器を使う。
スレッドセーフな擬似乱数生成器を使う。
225デフォルトの名無しさん
2009/09/11(金) 15:00:32 スレッドセーフなだけじゃ駄目でしょ
226デフォルトの名無しさん
2009/09/12(土) 04:34:20 >>225
kwsk
kwsk
227デフォルトの名無しさん
2009/09/12(土) 04:42:35 実装にもよるんだろうけど、スレッド毎にシードを持つイメージになるんだっけ?
228デフォルトの名無しさん
2009/09/12(土) 04:51:43 それ以前の問題で、ループの実行順が一定でないと、同じ乱数列は得られないでしょ。
ループで使う分の乱数を先にテーブルにでも入れておいたら?
ループで使う分の乱数を先にテーブルにでも入れておいたら?
229デフォルトの名無しさん
2009/09/12(土) 08:18:27 >>228
OpenMPの意味ないじゃん
OpenMPの意味ないじゃん
230デフォルトの名無しさん
2009/09/12(土) 08:41:32 スレッドセーフとスレッドセーフじゃないの具体的な例を教えて
231デフォルトの名無しさん
2009/09/12(土) 08:43:26232デフォルトの名無しさん
2009/09/12(土) 08:48:35233デフォルトの名無しさん
2009/09/12(土) 08:49:30 スレッドが絡んで意図したとおりに動かないのがスレッドセーフでない状態
234デフォルトの名無しさん
2009/09/12(土) 11:14:56 例えばsin関数は引数のみによって決まるので、スレッドセーフ。
一方、randは内部の状態を保存する変数に各スレッドからどの順序でアクセスされるかによって
結果が変わってくるので、スレッドアウト。
一方、randは内部の状態を保存する変数に各スレッドからどの順序でアクセスされるかによって
結果が変わってくるので、スレッドアウト。
235デフォルトの名無しさん
2009/09/12(土) 17:00:44 スレッド・・・アウト・・・??
236デフォルトの名無しさん
2009/09/12(土) 18:47:26 きっとスレッドストライク、スレッドボーク、スレッドチェンジなどもあるに違いない。
237デフォルトの名無しさん
2009/09/15(火) 01:13:35 !$omp thread out
238デフォルトの名無しさん
2009/09/19(土) 05:24:10 OpenMPとMPIで同じプログラムを書いたら、MPIの方が速かったんですが、どいういうこと??
使っているのは、omp parallel forだけです。
使っているのは、omp parallel forだけです。
239デフォルトの名無しさん
2009/09/19(土) 07:46:38 分散メモリじゃOpenMPはロクに働かないから共有メモリand/orマルチコアだろうけど、
ごくごく一般的に・・・
CPU/Core数が増えるとMPIが早い。OpenMPは効率が頭打ちする。なのでまあ当然ともいえる。
FirstTouchポリシー採用のシステムでは初期化ループで大まかな役割分担を教えてあげないとOpenMPはのろい。
OpenMPで一個でもShareかPrivateかを間違えるor書き忘れると途端に遅くなること有。
一次元配列の分割計算の場合、OpenMPだとUnrollingを抑制するコンパイラも多いのでそうなると結構遅くなる。
・・・などなど。
まあ、OpenMPはお手軽だから中規模な計算がメインな自分は頻繁に使うけど、
カリカリにチューンしたいとか大規模計算になるとMPIのほうが良いよ。
ごくごく一般的に・・・
CPU/Core数が増えるとMPIが早い。OpenMPは効率が頭打ちする。なのでまあ当然ともいえる。
FirstTouchポリシー採用のシステムでは初期化ループで大まかな役割分担を教えてあげないとOpenMPはのろい。
OpenMPで一個でもShareかPrivateかを間違えるor書き忘れると途端に遅くなること有。
一次元配列の分割計算の場合、OpenMPだとUnrollingを抑制するコンパイラも多いのでそうなると結構遅くなる。
・・・などなど。
まあ、OpenMPはお手軽だから中規模な計算がメインな自分は頻繁に使うけど、
カリカリにチューンしたいとか大規模計算になるとMPIのほうが良いよ。
240デフォルトの名無しさん
2009/09/19(土) 09:35:41 スレッドの生成の方が、MPIのプロセス間通信より軽いと思っていたのだけど
241デフォルトの名無しさん
2009/09/19(土) 21:15:35 iclを使っているんだけど、forの中で初期化したい場合はどうすればいいのかな。
実際はもっともっと複雑なんだけど、イメージ的には下のような感じで
ループの外で共有のtlbを作ってからメインループでtlbを使いたいんだ。
しかし、parallel forの中ではbarrierやsingleが使用出来ない。
かといってtlbのサイズとかループ回数の兼ね合いから、
parallel forをメインループに持っていったりtlbを全スレッド分作るというのは出来れば避けたい。
#pragma omp parallel for
for (int j=0; j<m; ++j)
{
#pragma barrier
#pragma omp single
for (int i=0; i<q; ++i)
{ tlb[i] = foo(i, j); }
#pragma barrier
for (int i=0; i<n; ++i)
{ /* メインの処理 */ }
}
実際はもっともっと複雑なんだけど、イメージ的には下のような感じで
ループの外で共有のtlbを作ってからメインループでtlbを使いたいんだ。
しかし、parallel forの中ではbarrierやsingleが使用出来ない。
かといってtlbのサイズとかループ回数の兼ね合いから、
parallel forをメインループに持っていったりtlbを全スレッド分作るというのは出来れば避けたい。
#pragma omp parallel for
for (int j=0; j<m; ++j)
{
#pragma barrier
#pragma omp single
for (int i=0; i<q; ++i)
{ tlb[i] = foo(i, j); }
#pragma barrier
for (int i=0; i<n; ++i)
{ /* メインの処理 */ }
}
242デフォルトの名無しさん
2009/09/19(土) 21:20:22 ミスった。barrierの前にompを付けて読んで下さい。
あとparallel forの中でbarrierやsingleが使用出来ないというのは
コンパイラがハネるという意味です。
OpenMPの仕様を読んでも使えないように読めます。
あとparallel forの中でbarrierやsingleが使用出来ないというのは
コンパイラがハネるという意味です。
OpenMPの仕様を読んでも使えないように読めます。
243デフォルトの名無しさん
2009/09/20(日) 00:25:20 >>241
変数 tlb をスレッド間で共有しているのが問題なので、
a) tlb の定義を外側ループの中に移すか、
b) tlb の定義を tlb[スレッド数][q] に変えてスレッドごとに違う tlb[スレッド番号][i] を使う。
変数 tlb をスレッド間で共有しているのが問題なので、
a) tlb の定義を外側ループの中に移すか、
b) tlb の定義を tlb[スレッド数][q] に変えてスレッドごとに違う tlb[スレッド番号][i] を使う。
244デフォルトの名無しさん
2009/09/20(日) 11:09:00 >>243
最初に書いた通り、無論その解決策は理解している上で
tlbのサイズと生成コストの理由から出来れば共有したい、
というのが今回の質問なのですが、OpenMPでは簡単には解決出来ないのでしょうか。
なんでbarrierがforの中で使えないんだろう。
最初に書いた通り、無論その解決策は理解している上で
tlbのサイズと生成コストの理由から出来れば共有したい、
というのが今回の質問なのですが、OpenMPでは簡単には解決出来ないのでしょうか。
なんでbarrierがforの中で使えないんだろう。
245デフォルトの名無しさん
2009/09/20(日) 11:23:57 jのループをparallel forで並行動作させると
たとえばj=0とj=1が同時に存在するよね
にも拘らずtlbを複数用意したくないというのは
tlb[i] = foo(i,0), tlb[i] = foo(i,1)
俺にはついていけない世界だ…
たとえばj=0とj=1が同時に存在するよね
にも拘らずtlbを複数用意したくないというのは
tlb[i] = foo(i,0), tlb[i] = foo(i,1)
俺にはついていけない世界だ…
246デフォルトの名無しさん
2009/09/21(月) 08:22:43247デフォルトの名無しさん
2009/09/23(水) 01:18:05 >>238
なんか変数を各スレッドで共有しているんじゃない?
OpenMPも結構考えないとパフォーマンスは伸びないし、
CPUの利用率も高くなってしまう。
同一マシン上でMPIよりも遅くなるのは考えにくいなあ。
ただ、MPIだと明示的にスレッドを分割しているのに対して、
OpenMPはコンパイラ依存だからね。そういったこともあり得るかも。
なんか変数を各スレッドで共有しているんじゃない?
OpenMPも結構考えないとパフォーマンスは伸びないし、
CPUの利用率も高くなってしまう。
同一マシン上でMPIよりも遅くなるのは考えにくいなあ。
ただ、MPIだと明示的にスレッドを分割しているのに対して、
OpenMPはコンパイラ依存だからね。そういったこともあり得るかも。
248デフォルトの名無しさん
2009/09/24(木) 23:57:35 fork-joinのコストがでかい
OpenMPを有効にするとコンパイラ最適化がきかなくなる(・・・というコンパイラが多い)
OpenMPを有効にするとコンパイラ最適化がきかなくなる(・・・というコンパイラが多い)
249デフォルトの名無しさん
2009/09/25(金) 07:43:37250デフォルトの名無しさん
2009/10/06(火) 22:47:29 for(i=0;i<N;i++) {
for(j=0;j<N;j++) {
for(k=2;k<N&&i+k<=N&&j+k<=N;k+=2) {
for(n=1;n<=3;n++) {
ごにょ
if(addHash()) {
if((p=getPoint()) == N) goto End;
ごにょ
}
}
ごにょ
}
}
}
}
}
4重ループの中にgoto分使っているけど、こういう場合はどうすればいいの?
for(j=0;j<N;j++) {
for(k=2;k<N&&i+k<=N&&j+k<=N;k+=2) {
for(n=1;n<=3;n++) {
ごにょ
if(addHash()) {
if((p=getPoint()) == N) goto End;
ごにょ
}
}
ごにょ
}
}
}
}
}
4重ループの中にgoto分使っているけど、こういう場合はどうすればいいの?
251デフォルトの名無しさん
2009/10/07(水) 04:35:58 >>250
gotoを取り除く
gotoを取り除く
252デフォルトの名無しさん
2009/10/10(土) 03:19:26 んだ。gotoあると並列処理されにくいよ。
並列化してると、途中で終了するのも最後までやるのも計算コストはかわらんし。
マスクの部分は
if((p=getPoint()) /= N){ごにょ} か if((p=getPoint()) < N){ごにょ}
にする・・・とかかな。
並列化してると、途中で終了するのも最後までやるのも計算コストはかわらんし。
マスクの部分は
if((p=getPoint()) /= N){ごにょ} か if((p=getPoint()) < N){ごにょ}
にする・・・とかかな。
253デフォルトの名無しさん
2009/10/29(木) 11:34:56岡田外務大臣キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
http://qb5.2ch.net/test/read.cgi/saku2ch/1256630318/1
早く記念カキコしないと埋まっちゃうwww
254デフォルトの名無しさん
2009/11/21(土) 02:59:22 OpenMPでスレッド間の1対1通信ってどうやんの
255デフォルトの名無しさん
2009/11/23(月) 17:05:30256デフォルトの名無しさん
2009/11/23(月) 17:07:10 >>252
なるほど。ありがとう。
なるほど。ありがとう。
257デフォルトの名無しさん
2010/01/10(日) 02:26:13 FortranをOpenMPで並列化したのですが、シリアルで実行した場合と結果が変わってしまって困っています。
たぶん共有変数の設定を間違って、書き込んではいけない変数に書き込みが発生してしまったのだと思うのですが、
どう直したらいいのかわかりません。
分かることがあれば教えて下さい。
[並列化したソースコード]http://gaatsu.ps.land.to/up/src/up_1444.png.html
[シリアルで実行した結果]http://gaatsu.ps.land.to/up/src/up_1445.png.html
[パラレルで実行した結果]http://gaatsu.ps.land.to/up/src/up_1446.png.html
z軸のプロットは、ソース中のloss_timeを描いています。
サブルーチンsubの中身は、関係する部分だけ書くと、以下のようになっています。
do i = 1, nend
t=t+dt
if (条件)
loss_time = t
return
end if
end do
たぶん共有変数の設定を間違って、書き込んではいけない変数に書き込みが発生してしまったのだと思うのですが、
どう直したらいいのかわかりません。
分かることがあれば教えて下さい。
[並列化したソースコード]http://gaatsu.ps.land.to/up/src/up_1444.png.html
[シリアルで実行した結果]http://gaatsu.ps.land.to/up/src/up_1445.png.html
[パラレルで実行した結果]http://gaatsu.ps.land.to/up/src/up_1446.png.html
z軸のプロットは、ソース中のloss_timeを描いています。
サブルーチンsubの中身は、関係する部分だけ書くと、以下のようになっています。
do i = 1, nend
t=t+dt
if (条件)
loss_time = t
return
end if
end do
258デフォルトの名無しさん
2010/01/10(日) 02:29:09 すみません、最後の方で書いた内容、一部間違えました。
サブルーチンsubの中身は、関係する部分だけ書くと、以下のようになっています。
do i = 1, nend
t=t+dt
if (条件)
loss_time = t
return
end if
loss_time = t
end do
サブルーチンsubの中身は、関係する部分だけ書くと、以下のようになっています。
do i = 1, nend
t=t+dt
if (条件)
loss_time = t
return
end if
loss_time = t
end do
259デフォルトの名無しさん
2010/01/11(月) 10:56:24 多分原因はそこじゃないと思うけれど、共有変数の指定が間違っていると思うなら
privateもsharedも消してdefault(private)にしてみたらいいと思う。
あと基本的な質問だけど
「!$OMP parallel do」ではなくて
「!$OMP parallel」と「!$OMP do」
に分かれている必要性ってあるの?
parallelとdoを分ける文法を普段使わないから挙動が分からないんだけれど、
iのループが分担されずに-(maxGrid-1)から(maxGrid-1)のまま8つ生成されて、
jのループが分担されているのに1つのloss_timeを共有してそうな気がするんだけれど。
privateもsharedも消してdefault(private)にしてみたらいいと思う。
あと基本的な質問だけど
「!$OMP parallel do」ではなくて
「!$OMP parallel」と「!$OMP do」
に分かれている必要性ってあるの?
parallelとdoを分ける文法を普段使わないから挙動が分からないんだけれど、
iのループが分担されずに-(maxGrid-1)から(maxGrid-1)のまま8つ生成されて、
jのループが分担されているのに1つのloss_timeを共有してそうな気がするんだけれど。
260デフォルトの名無しさん
2010/01/12(火) 06:07:01 原因はそこじゃないな、おそらくアソコ。
261デフォルトの名無しさん
2010/01/14(木) 00:21:27 お返事ありがとうございます!
default(private)ではコンパイルは通っても、計算は動きませんでした。
(逐次領域→parallel領域で値が引き継がれないことが原因?)
なので、全ての変数をfirstprivateでやってみましたが、やはり間違った結果になりました。
!$OMP parallel doでiのループを並列化しても同じでした。
サブルーチンsubは、iやjによって計算時間が最大10000倍程度違うので、
iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。
>jのループが分担されているのに1つのloss_timeを共有してそうな
!$OMP parallel
の時点でメモリがスレッド数ぶん確保されるのではないんですか?
default(private)ではコンパイルは通っても、計算は動きませんでした。
(逐次領域→parallel領域で値が引き継がれないことが原因?)
なので、全ての変数をfirstprivateでやってみましたが、やはり間違った結果になりました。
!$OMP parallel doでiのループを並列化しても同じでした。
サブルーチンsubは、iやjによって計算時間が最大10000倍程度違うので、
iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。
>jのループが分担されているのに1つのloss_timeを共有してそうな
!$OMP parallel
の時点でメモリがスレッド数ぶん確保されるのではないんですか?
262デフォルトの名無しさん
2010/01/14(木) 04:03:22 そういや、default(shared) をいったんprivateに変えてしまうと
同じ階層のメイン・副プログラム内でそれ以降全部のdefaultが変わるので面倒くさくなるんだよねぇ。
同じ階層のメイン・副プログラム内でそれ以降全部のdefaultが変わるので面倒くさくなるんだよねぇ。
263259
2010/01/14(木) 10:33:17 >>261
> !$OMP parallel
> の時点でメモリがスレッド数ぶん確保されるのではないんですか?
そうだけど「!$OMP parallel」の時点で「do i」が「iの範囲が同じで」8つ生成される。まずこれが無駄でしょ?
次にloss_timeも8つ確保されているけれど、8つのスレッドでiが同じ動きをしているので「$OMP do」のjでの挙動がわかりにくい。
do jでloss_timeが共有されると言ったのは勘違いかもしれないが、よく分からないので時間があったら試してみる。
> !$OMP parallel doでiのループを並列化しても同じでした。
<中略>
> iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。
jを分担したいのだから、「!$OMP parallel do」を「do j」に設置する必要があると思うんだ。
> !$OMP parallel
> の時点でメモリがスレッド数ぶん確保されるのではないんですか?
そうだけど「!$OMP parallel」の時点で「do i」が「iの範囲が同じで」8つ生成される。まずこれが無駄でしょ?
次にloss_timeも8つ確保されているけれど、8つのスレッドでiが同じ動きをしているので「$OMP do」のjでの挙動がわかりにくい。
do jでloss_timeが共有されると言ったのは勘違いかもしれないが、よく分からないので時間があったら試してみる。
> !$OMP parallel doでiのループを並列化しても同じでした。
<中略>
> iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。
jを分担したいのだから、「!$OMP parallel do」を「do j」に設置する必要があると思うんだ。
264デフォルトの名無しさん
2010/01/17(日) 10:42:45 OpenMP自身は共有メモリで使われる事を仮定してるから・・・
!$OMP parallel
にさしかかった時点ではメモリはいじらないとおもうよ。
全スレッドの同期確認作業(結構時間ペナルティがきつい)をするので
減らせるなら積極的に parallel 文を減らすようにするのがいい、と推奨されてるだけ。
!$OMP parallel
にさしかかった時点ではメモリはいじらないとおもうよ。
全スレッドの同期確認作業(結構時間ペナルティがきつい)をするので
減らせるなら積極的に parallel 文を減らすようにするのがいい、と推奨されてるだけ。
265デフォルトの名無しさん
2010/01/22(金) 00:19:10 VisualStudio2008でなんだけど、
#pragma omp parallel for でfor文の中にbreakあるとダメだった気がしたんだけど、
WindowsSDK7.0入れてから久々に使ってみたらbreak入っててもコンパイルエラーにはならなかった。
もともと大丈夫だったっけ?
#pragma omp parallel for でfor文の中にbreakあるとダメだった気がしたんだけど、
WindowsSDK7.0入れてから久々に使ってみたらbreak入っててもコンパイルエラーにはならなかった。
もともと大丈夫だったっけ?
266デフォルトの名無しさん
2010/01/28(木) 12:04:56 ダメとは聞かないけどな。intel の Fortran だと文句はいわれないと記憶。
でも、どのシステム&実装でも受け入れてもらえるように
break の条件を満たす場所を見つけたらそこでbreakするのではなく
フラグを立ててそのあとの for loop は制御の整数をインクリするだけで
担当の範囲は回すようにするといいのかも。
#pragma いろいろその0
for (i=0;i<imax;i++){
int ibreak=0;
if (ibreak == 0){
いろいろその1;
if (なんか条件) {ibreak = 1;}
いろいろその2;
} // end-if-ibreak
} // end-for-i
とか。
でも、どのシステム&実装でも受け入れてもらえるように
break の条件を満たす場所を見つけたらそこでbreakするのではなく
フラグを立ててそのあとの for loop は制御の整数をインクリするだけで
担当の範囲は回すようにするといいのかも。
#pragma いろいろその0
for (i=0;i<imax;i++){
int ibreak=0;
if (ibreak == 0){
いろいろその1;
if (なんか条件) {ibreak = 1;}
いろいろその2;
} // end-if-ibreak
} // end-for-i
とか。
267デフォルトの名無しさん
2010/01/28(木) 12:06:08 あ、これじゃダメだw
int ibreak=0;
は外にだしてね。
int ibreak=0;
は外にだしてね。
268デフォルトの名無しさん
2010/02/11(木) 04:19:22 下記の様にOpenMPでタスク並列化を行う場合に、
スレッド数を動的に変化させたい場合はどのようにやるのでしょうか?
#include <omp.h>
int main(){
#pragma omp parallel sections
{
#pragma omp section
{
処理1
}
#pragma omp section
{
処理2
}
:
:
#pragma omp section
{
処理N
}
}
}
スレッド数を動的に変化させたい場合はどのようにやるのでしょうか?
#include <omp.h>
int main(){
#pragma omp parallel sections
{
#pragma omp section
{
処理1
}
#pragma omp section
{
処理2
}
:
:
#pragma omp section
{
処理N
}
}
}
269デフォルトの名無しさん
2010/03/19(金) 17:06:32 CPUがHTかどうかによって並列数を変えたいのですが、物理的なコアの数を取得する方法はありませんか?
270デフォルトの名無しさん
2010/03/19(金) 17:35:05 >>269
/proc/cpuinfo辺り見てなんとかならない?
/proc/cpuinfo辺り見てなんとかならない?
271デフォルトの名無しさん
2010/03/20(土) 05:26:30 Linuxなら
int cpu_num = sysconf(_SC_NPROCESSORS_CONF)
Windowsなら
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
で、sisinfoのdwNumberOfProcessorsメンバの中にはいっている。
ちなみにintな。
int cpu_num = sysconf(_SC_NPROCESSORS_CONF)
Windowsなら
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
で、sisinfoのdwNumberOfProcessorsメンバの中にはいっている。
ちなみにintな。
272デフォルトの名無しさん
2010/03/24(水) 08:25:08 Winだと NUM_OF_CPU みたいな環境変数があった気がするけどちがったかな?
273デフォルトの名無しさん
2010/03/24(水) 23:12:52 NUMBER_OF_PROCESSORS
274272
2010/03/25(木) 03:13:10 それそれ、ありがと
275デフォルトの名無しさん
2010/03/30(火) 17:45:37 CPUのコア数以上にスレッドの数を増やすと急激にパフォーマンスが落ちるのだけどなぜなのでしょうか?
Phenom II X4ですが、5スレッドにしたとたん、全スレッドのパフォーマンスが半分以下(2倍以上時間がかかる)
ようになります。OSはubuntu9.04です。
Phenom II X4ですが、5スレッドにしたとたん、全スレッドのパフォーマンスが半分以下(2倍以上時間がかかる)
ようになります。OSはubuntu9.04です。
276デフォルトの名無しさん
2010/03/30(火) 18:43:55 スレッド数>コア数ってことはデスマーチ状態なので、
バタバタと戦友たちが倒れていってるんだろうな。
バタバタと戦友たちが倒れていってるんだろうな。
277デフォルトの名無しさん
2010/03/30(火) 20:04:58278デフォルトの名無しさん
2010/03/30(火) 21:58:05 >>275
コンテキスト切り替え(スイッチ)
コンテキスト切り替え(スイッチ)
279デフォルトの名無しさん
2010/03/31(水) 06:27:33 >>275
8スレッドにすると4のときと同じくらいの時間で終わる・・・かも。
8スレッドにすると4のときと同じくらいの時間で終わる・・・かも。
280デフォルトの名無しさん
2010/03/31(水) 07:36:37 >>275
当たり前の話だ。各スレッドがリソースを取り合っているんだよ。
物理コアが4つしかないのに、5スレッドが走っているわけだから、
物理コアたちが「俺が行くぞ」「ふざけんな俺が行くんだ!」とか「おまえ行けよ、いやおまえが行けよ」
ということをやっているわけだ。
本来ならセマフォで4スレッドに制限すればよいんだけど、OpenMPではどういう風にやるっけな?
まだ対応していないと思ったけどもしOpenMPでやるなら結構トリッキーな実装になりそうだな。
当たり前の話だ。各スレッドがリソースを取り合っているんだよ。
物理コアが4つしかないのに、5スレッドが走っているわけだから、
物理コアたちが「俺が行くぞ」「ふざけんな俺が行くんだ!」とか「おまえ行けよ、いやおまえが行けよ」
ということをやっているわけだ。
本来ならセマフォで4スレッドに制限すればよいんだけど、OpenMPではどういう風にやるっけな?
まだ対応していないと思ったけどもしOpenMPでやるなら結構トリッキーな実装になりそうだな。
281デフォルトの名無しさん
2010/03/31(水) 13:14:08 4プロセスのとき、4つのコアがそれぞれ100%がんばる
5プロのとき、1つのコアが2スレッド分を負担して100%がんばってるけど
ほかの3つが50%しかがんばれない。
がんばらない、じゃなくてがんばれない。同期取るからね。
>>279 のとおり8にすると4コアみんな100%の力を出せるようになる。
5プロのとき、1つのコアが2スレッド分を負担して100%がんばってるけど
ほかの3つが50%しかがんばれない。
がんばらない、じゃなくてがんばれない。同期取るからね。
>>279 のとおり8にすると4コアみんな100%の力を出せるようになる。
283デフォルトの名無しさん
2010/03/31(水) 15:09:17 ちゃんとプロセスと計算コアを固定してる?
タダでさえ>>280 の理由で非効率な部分があるんだから・・
taskset dplace のどちらかだろう。なければこれに当たる奴みつけてね。
dplace 後者はSGIのだけの気がするけど自信はない。
タダでさえ>>280 の理由で非効率な部分があるんだから・・
taskset dplace のどちらかだろう。なければこれに当たる奴みつけてね。
dplace 後者はSGIのだけの気がするけど自信はない。
284デフォルトの名無しさん
2010/03/31(水) 15:10:32 プロセス、スレッド・・・OpenMPだとスレッドのほうがいいのかな?
あまり気にしてなかったので今気になった
あまり気にしてなかったので今気になった
285デフォルトの名無しさん
2010/03/31(水) 16:47:05 スレッドの実行時間が短すぎるんじゃないか。
それでコンテキストスイッチの割合が大きくなりすぎているのでは。
それでコンテキストスイッチの割合が大きくなりすぎているのでは。
286デフォルトの名無しさん
2010/03/31(水) 17:09:12 #pragma omp parallel for
for
凄い長い計算
でやって味噌。
for
凄い長い計算
でやって味噌。
287デフォルトの名無しさん
2010/04/01(木) 03:41:12 ちゃんとprivateも設定しろな。
288デフォルトの名無しさん
2010/04/07(水) 17:43:00 Intel Cluster OpenMPのセットアップ方法ってどこにあるの?
とりあえずライセンスファイルのダウンロードして、それをインストールするところまではできたのだけど・・・
ネットワークとかホストとかはどこで設定するの?
とりあえずライセンスファイルのダウンロードして、それをインストールするところまではできたのだけど・・・
ネットワークとかホストとかはどこで設定するの?
289デフォルトの名無しさん
2010/05/12(水) 05:18:00 ubuntu 10.04にしたらRunning Processの数がOpenMP Threadの数+1になるのだけど、どうして?
うちだけ?9.04の時はこんなことはありませんでした。
うちだけ?9.04の時はこんなことはありませんでした。
290デフォルトの名無しさん
2010/05/12(水) 06:30:33 全体を総括するあまり忙しくないプロセスがあるから一個多いのが正常。
291デフォルトの名無しさん
2010/05/21(金) 11:41:54292デフォルトの名無しさん
2010/05/23(日) 21:53:46 Fortranで !$omp parallel do private(...)
のprivate変数が多いので文字数制限に引っかかって改行しないといけないのですが、
括弧中で改行すると & や!$omp& で繋げてもうまく動きません。
どうやったらいいんでしょうか。PGIコンパイラです。
のprivate変数が多いので文字数制限に引っかかって改行しないといけないのですが、
括弧中で改行すると & や!$omp& で繋げてもうまく動きません。
どうやったらいいんでしょうか。PGIコンパイラです。
293デフォルトの名無しさん
2010/05/23(日) 22:44:30 PGIは知らないがIntelのは
!$omp parallel &
! & do
とかで出来た気がする。
2行目の行頭が!か!$か!$omp かは忘れた。
!$omp parallel &
! & do
とかで出来た気がする。
2行目の行頭が!か!$か!$omp かは忘れた。
294デフォルトの名無しさん
2010/05/31(月) 23:23:36 c++でOpenMPを使う時に
#pragma omp parallel for 文の後の
forループ内でnew演算子使っても計算は保障されるの?
保障されない場合は回避方法はあるの?
#pragma omp parallel for 文の後の
forループ内でnew演算子使っても計算は保障されるの?
保障されない場合は回避方法はあるの?
295デフォルトの名無しさん
2010/06/01(火) 00:31:24 保障されなきゃ話にならんだろ
296デフォルトの名無しさん
2010/06/01(火) 01:58:47 >>294
ちょっと計算っていうのがわかりにくいが、
要はnewで確保した領域で計算した結果が保証されるのか?
っていう意味なのかな?だとすればyesだろうけど、
atomicを考えるとめんどくさいような気がするなあ。
ちょっと計算っていうのがわかりにくいが、
要はnewで確保した領域で計算した結果が保証されるのか?
っていう意味なのかな?だとすればyesだろうけど、
atomicを考えるとめんどくさいような気がするなあ。
297294
2010/06/01(火) 22:42:21 回答どうも
コンパイルは通ったんだけど並列化されない
なぜ?
チェックし直して
うまく動いたら改めて書き込みします
コンパイルは通ったんだけど並列化されない
なぜ?
チェックし直して
うまく動いたら改めて書き込みします
298デフォルトの名無しさん
2010/06/01(火) 23:35:00 コード晒さずに結果だけ書かれてもな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「おこめ券は米以外の食品も買える。効果的な活用を」 地元で農水相 [山形県] [少考さん★]
- 【速報】「女芸人No.1決定戦 THE W」9代目女王にニッチェ! 7年ぶり3度目で悲願の優勝 [牛丼★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 【沖縄】開業4ヵ月でこれは…“国民の税金”投入の『ジャングリア沖縄』で見た衝撃的な光景と、モチベーションが低い一部スタッフの現状 [ぐれ★]
- 今年の流行語大賞 『働いて働いて働いてまいります』が受賞で不快感… 過労自殺の遺族らが会見「家族にむち打つような行為だ」 [冬月記者★]
- 【広島】ペルー女性の国保加入を誤って認め、福山市が医療費484万円を肩代わりするミス…入院して手術を受ける [ぐれ★]
- とらせん IP付き★2
- 【U-NEXT】プレミアリーグ総合 ★44
- こいせん 全レス転載禁止
- ハム専
- ネットでサッカー観戦◆2025-32
- 【ATP】テニス総合実況スレ2025 Part 214【WTA】
- クズ「勉強頑張らなかった奴は一生DQNと一緒に肉体労働しろ」☚勉強頑張れるのも環境と巡り合わせなんだが? [783475554]
- なんやかんやケンモミンって良い人多いよね [943688309]
- 西から昇ったおひさまが、東へ沈む〜
- 18歳JKとセックスしたらアウト⁉
- 【時事】立憲民主党、30代の支持率が「ゼロ」😨 [369521721]
- 朝だよー🥁🥺ドンドンドンドン
