OpenMPプログラミング

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
NGNG
オフィシャルサイト
http://www.openmp.org/

リンクなどは>>2以下で
226デフォルトの名無しさん
垢版 |
2009/09/12(土) 04:34:20
>>225
kwsk
2009/09/12(土) 04:42:35
実装にもよるんだろうけど、スレッド毎にシードを持つイメージになるんだっけ?
2009/09/12(土) 04:51:43
それ以前の問題で、ループの実行順が一定でないと、同じ乱数列は得られないでしょ。
ループで使う分の乱数を先にテーブルにでも入れておいたら?
2009/09/12(土) 08:18:27
>>228
OpenMPの意味ないじゃん
2009/09/12(土) 08:41:32
スレッドセーフとスレッドセーフじゃないの具体的な例を教えて
2009/09/12(土) 08:43:26
>>223
2009/09/12(土) 08:48:35
>>231
>>223の原因はそれだけじゃないとおもうYO
2009/09/12(土) 08:49:30
スレッドが絡んで意図したとおりに動かないのがスレッドセーフでない状態
234デフォルトの名無しさん
垢版 |
2009/09/12(土) 11:14:56
例えばsin関数は引数のみによって決まるので、スレッドセーフ。
一方、randは内部の状態を保存する変数に各スレッドからどの順序でアクセスされるかによって
結果が変わってくるので、スレッドアウト。
2009/09/12(土) 17:00:44
スレッド・・・アウト・・・??
2009/09/12(土) 18:47:26
きっとスレッドストライク、スレッドボーク、スレッドチェンジなどもあるに違いない。
2009/09/15(火) 01:13:35
!$omp thread out
238デフォルトの名無しさん
垢版 |
2009/09/19(土) 05:24:10
OpenMPとMPIで同じプログラムを書いたら、MPIの方が速かったんですが、どいういうこと??
使っているのは、omp parallel forだけです。
2009/09/19(土) 07:46:38
分散メモリじゃOpenMPはロクに働かないから共有メモリand/orマルチコアだろうけど、
ごくごく一般的に・・・
CPU/Core数が増えるとMPIが早い。OpenMPは効率が頭打ちする。なのでまあ当然ともいえる。
FirstTouchポリシー採用のシステムでは初期化ループで大まかな役割分担を教えてあげないとOpenMPはのろい。
OpenMPで一個でもShareかPrivateかを間違えるor書き忘れると途端に遅くなること有。
一次元配列の分割計算の場合、OpenMPだとUnrollingを抑制するコンパイラも多いのでそうなると結構遅くなる。
・・・などなど。
まあ、OpenMPはお手軽だから中規模な計算がメインな自分は頻繁に使うけど、
カリカリにチューンしたいとか大規模計算になるとMPIのほうが良いよ。
2009/09/19(土) 09:35:41
スレッドの生成の方が、MPIのプロセス間通信より軽いと思っていたのだけど
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)
{ /* メインの処理 */ }
}
2009/09/19(土) 21:20:22
ミスった。barrierの前にompを付けて読んで下さい。

あとparallel forの中でbarrierやsingleが使用出来ないというのは
コンパイラがハネるという意味です。
OpenMPの仕様を読んでも使えないように読めます。
2009/09/20(日) 00:25:20
>>241
変数 tlb をスレッド間で共有しているのが問題なので、
a) tlb の定義を外側ループの中に移すか、
b) tlb の定義を tlb[スレッド数][q] に変えてスレッドごとに違う tlb[スレッド番号][i] を使う。
2009/09/20(日) 11:09:00
>>243
最初に書いた通り、無論その解決策は理解している上で
tlbのサイズと生成コストの理由から出来れば共有したい、
というのが今回の質問なのですが、OpenMPでは簡単には解決出来ないのでしょうか。

なんでbarrierがforの中で使えないんだろう。
2009/09/20(日) 11:23:57
jのループをparallel forで並行動作させると
たとえばj=0とj=1が同時に存在するよね
にも拘らずtlbを複数用意したくないというのは
tlb[i] = foo(i,0), tlb[i] = foo(i,1)
俺にはついていけない世界だ…
2009/09/21(月) 08:22:43
>>245
ああそうか!
なんて凡ミス、ありがとうございました。
2009/09/23(水) 01:18:05
>>238
なんか変数を各スレッドで共有しているんじゃない?
OpenMPも結構考えないとパフォーマンスは伸びないし、
CPUの利用率も高くなってしまう。
同一マシン上でMPIよりも遅くなるのは考えにくいなあ。
ただ、MPIだと明示的にスレッドを分割しているのに対して、
OpenMPはコンパイラ依存だからね。そういったこともあり得るかも。
2009/09/24(木) 23:57:35
fork-joinのコストがでかい
OpenMPを有効にするとコンパイラ最適化がきかなくなる(・・・というコンパイラが多い)
249デフォルトの名無しさん
垢版 |
2009/09/25(金) 07:43:37
遅くなる原因はこれかな???
http://olab.is.s.u-tokyo.ac.jp/~reiji/openmp.html
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分使っているけど、こういう場合はどうすればいいの?
251デフォルトの名無しさん
垢版 |
2009/10/07(水) 04:35:58
>>250
gotoを取り除く
2009/10/10(土) 03:19:26
んだ。gotoあると並列処理されにくいよ。
並列化してると、途中で終了するのも最後までやるのも計算コストはかわらんし。
マスクの部分は
if((p=getPoint()) /= N){ごにょ} か if((p=getPoint()) < N){ごにょ}
にする・・・とかかな。
253デフォルトの名無しさん
垢版 |
2009/10/29(木) 11:34:56



岡田外務大臣キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
h‍ttp‍:‍/‍/‍q‍b5.2‍ch.net/t‍est/rea‍d.cgi‍/sak‍u2ch/1256‍630318/1



早く記念カキコしないと埋まっちゃうwww
2009/11/21(土) 02:59:22
OpenMPでスレッド間の1対1通信ってどうやんの
2009/11/23(月) 17:05:30
>>250 >>251
返事遅れてごめん。ありがとう。
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
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
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を共有してそうな気がするんだけれど。
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
の時点でメモリがスレッド数ぶん確保されるのではないんですか?
2010/01/14(木) 04:03:22
そういや、default(shared) をいったんprivateに変えてしまうと
同じ階層のメイン・副プログラム内でそれ以降全部の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」に設置する必要があると思うんだ。
2010/01/17(日) 10:42:45
OpenMP自身は共有メモリで使われる事を仮定してるから・・・
!$OMP parallel
にさしかかった時点ではメモリはいじらないとおもうよ。
全スレッドの同期確認作業(結構時間ペナルティがきつい)をするので
減らせるなら積極的に parallel 文を減らすようにするのがいい、と推奨されてるだけ。
265デフォルトの名無しさん
垢版 |
2010/01/22(金) 00:19:10
VisualStudio2008でなんだけど、
#pragma omp parallel for でfor文の中にbreakあるとダメだった気がしたんだけど、
WindowsSDK7.0入れてから久々に使ってみたらbreak入っててもコンパイルエラーにはならなかった。
もともと大丈夫だったっけ?
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

とか。
2010/01/28(木) 12:06:08
あ、これじゃダメだw
int ibreak=0;
は外にだしてね。
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
}
}
}
269デフォルトの名無しさん
垢版 |
2010/03/19(金) 17:06:32
CPUがHTかどうかによって並列数を変えたいのですが、物理的なコアの数を取得する方法はありませんか?
2010/03/19(金) 17:35:05
>>269
/proc/cpuinfo辺り見てなんとかならない?
2010/03/20(土) 05:26:30
Linuxなら
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 みたいな環境変数があった気がするけどちがったかな?
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です。
2010/03/30(火) 18:43:55
スレッド数>コア数ってことはデスマーチ状態なので、
バタバタと戦友たちが倒れていってるんだろうな。
2010/03/30(火) 20:04:58
同時に二つのことをやるとき、一つのことだけをやるのと効率が変わらないとか、
どんな仕事でも 5 分割でパラレルになるように区分けできる
天才ってまれにいるけど、 >>275 はそういうタイプ。
278デフォルトの名無しさん
垢版 |
2010/03/30(火) 21:58:05
>>275
コンテキスト切り替え(スイッチ)
2010/03/31(水) 06:27:33
>>275
8スレッドにすると4のときと同じくらいの時間で終わる・・・かも。
2010/03/31(水) 07:36:37
>>275
当たり前の話だ。各スレッドがリソースを取り合っているんだよ。
物理コアが4つしかないのに、5スレッドが走っているわけだから、
物理コアたちが「俺が行くぞ」「ふざけんな俺が行くんだ!」とか「おまえ行けよ、いやおまえが行けよ」
ということをやっているわけだ。
本来ならセマフォで4スレッドに制限すればよいんだけど、OpenMPではどういう風にやるっけな?
まだ対応していないと思ったけどもしOpenMPでやるなら結構トリッキーな実装になりそうだな。
2010/03/31(水) 13:14:08
4プロセスのとき、4つのコアがそれぞれ100%がんばる
5プロのとき、1つのコアが2スレッド分を負担して100%がんばってるけど
ほかの3つが50%しかがんばれない。
がんばらない、じゃなくてがんばれない。同期取るからね。
>>279 のとおり8にすると4コアみんな100%の力を出せるようになる。
282デフォルトの名無しさん
垢版 |
2010/03/31(水) 13:54:11
>>279
>>281
8にしてみたけど、そんなことはなかった。
劇遅になった。
2010/03/31(水) 15:09:17
ちゃんとプロセスと計算コアを固定してる?
タダでさえ>>280 の理由で非効率な部分があるんだから・・
taskset dplace のどちらかだろう。なければこれに当たる奴みつけてね。
dplace 後者はSGIのだけの気がするけど自信はない。
2010/03/31(水) 15:10:32
プロセス、スレッド・・・OpenMPだとスレッドのほうがいいのかな?
あまり気にしてなかったので今気になった
2010/03/31(水) 16:47:05
スレッドの実行時間が短すぎるんじゃないか。
それでコンテキストスイッチの割合が大きくなりすぎているのでは。
286デフォルトの名無しさん
垢版 |
2010/03/31(水) 17:09:12
#pragma omp parallel for
for

凄い長い計算

でやって味噌。
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の時はこんなことはありませんでした。
2010/05/12(水) 06:30:33
全体を総括するあまり忙しくないプロセスがあるから一個多いのが正常。
2010/05/21(金) 11:41:54
>>289
topコマンドで調べてみれば?
Ubuntuだとbackend
Fedoraだとnautilus
がプロセス1個占有してるようだよ
2010/05/23(日) 21:53:46
Fortranで !$omp parallel do private(...)
のprivate変数が多いので文字数制限に引っかかって改行しないといけないのですが、
括弧中で改行すると & や!$omp& で繋げてもうまく動きません。
どうやったらいいんでしょうか。PGIコンパイラです。
2010/05/23(日) 22:44:30
PGIは知らないがIntelのは

!$omp parallel &
! & do

とかで出来た気がする。
2行目の行頭が!か!$か!$omp かは忘れた。
2010/05/31(月) 23:23:36
c++でOpenMPを使う時に

#pragma omp parallel for 文の後の
forループ内でnew演算子使っても計算は保障されるの?

保障されない場合は回避方法はあるの?
2010/06/01(火) 00:31:24
保障されなきゃ話にならんだろ
2010/06/01(火) 01:58:47
>>294
ちょっと計算っていうのがわかりにくいが、
要はnewで確保した領域で計算した結果が保証されるのか?
っていう意味なのかな?だとすればyesだろうけど、
atomicを考えるとめんどくさいような気がするなあ。
297294
垢版 |
2010/06/01(火) 22:42:21
回答どうも
コンパイルは通ったんだけど並列化されない
なぜ?

チェックし直して
うまく動いたら改めて書き込みします
2010/06/01(火) 23:35:00
コード晒さずに結果だけ書かれてもな
2010/06/01(火) 23:45:19
#pragma omp parallel for private(共用しない変数) num_threads(スレッド数)
2010/06/02(水) 00:00:30
まさかshare変数をnewしたの?
2010/07/15(木) 01:58:36
よってたかって new か・・・・恐いな。
というかどうなるんだろう?
302デフォルトの名無しさん
垢版 |
2010/09/12(日) 05:59:15
この板では意味ないだろうけど・・・無意味にあげておく
2011/01/04(火) 02:21:11
このスレ過疎り過ぎ
GCC4.5.0 (MinGW) だとforループ中でbreakが使えないんだけど、解決する定石とかある?
とりあえずフラグ立てて解決したんだけどなにかいい方法があれば教えてくれ

// サンプル:指定された"TARGET"が見つかるまでのループ数を表示するプログラム
#include <stdio.h>
#include <omp.h>
#define FIN 100
#define TARGET 70

int main(){
int i, flag=0, cnt=0;
#pragma omp parallel for reduction(+:cnt)
for(i = 0;i < FIN;i++){
printf("%d: %d\n", omp_get_thread_num(), i);
cnt++;

if(flag){
printf("%d: break\n", omp_get_thread_num());
i+=FIN;
}

if(i == TARGET){
printf("%d: found and break\n", omp_get_thread_num());
flag = 1;
#pragma omp flush(flag)
i+=FIN;
}
}
printf("total %d loops\n",cnt);
return 0;
}
2011/01/04(火) 09:57:50
単純なループの場合は parallel for に頼らず自前で各スレッドのループ範囲を決めれば break できる。
フラグを使うのはスレッド間の同期に必要なので、break できたとしても無くせないと思われ。

#include <stdio.h>
#include <omp.h>
#define FIN 100
#define TARGET 70
int main(){
int i, found=0, cnt=0;
#pragma omp parallel reduction(+:cnt)
{
int t, n, is, ie;
t = omp_get_num_threads();
n = (FIN + t - 1) / t;
is = n * omp_get_thread_num();
ie = (is + n < FIN) ? is + n : FIN;
printf("%d: %d-%d\n", omp_get_thread_num(), is, ie);
for(i = is; !found && i < ie; i++){
printf("%d: %d\n", omp_get_thread_num(), i);
cnt++;
if (i == TARGET){
found = 1;
#pragma omp flush(found)
printf("%d: found\n", omp_get_thread_num());
}
}
printf("%d: %d loops\n", omp_get_thread_num(), cnt);
}
printf("total %d loops\n",cnt);
return 0;
}
2011/01/05(水) 00:43:11
>>304 早速のレスサンクス
そのやり方はスマートだしちゃんと規格に準拠してるね

正月最後の休みを使って公式にあるOpenMP Specifications v3.0を読んでみたんだけど
for指示文に関連付けられたforループは規格で(jp:p.44)
// for (init-expr; test-expr; incr-expr) structured-block
// structured block:C/C++では、先頭に入口が一つと末尾に出口が一つある実行文か複合文、あるいはOpenMP構文。
// 出口点は構造化ブロックからのの分岐であってはいけません。
となってるから元々breakは無理なんだな

さらにtest-exprは
// var relational-op b または b relational-op var
//var:符号付き、または符号なしの整数型の変数 or C++の場合、ランダムアクセスイテレータ型の変数 or Cの場合、ポインタ型の変数
//b:varの型と一致した型のループ不定式
となってるから
>>303の for(i = 0;i < FIN;i++){ を for(i = 0;!flag && i < FIN;i++){ にはできない
>>304ならparallelリージョンのなかのループだから&&が使えてスマートに書けるんだな

おかげさまで勉強になったよ

参考
[en]http://www.openmp.org/mp-documents/spec30.pdf
[jp]http://www.openmp.org/mp-documents/OpenMP30spec-ja.pdf
306デフォルトの名無しさん
垢版 |
2011/02/25(金) 21:14:37.06
内部関数を別の関数に渡すコード断片があると(Intel Fortranの拡張)、
例えそれが実行されなくとも、性能がガタ落ちになるようだ。理由は不明だが。
2011/04/06(水) 18:59:25.73
LinuxでもしCPUに空きがあるなら、並列数をあげるようにしたいのですが、どのようにすればいいのでしょうか?
2011/04/23(土) 16:01:03.61
linuxでノンブロッキングなconnectって
connectよんでからselectで待つのが定石だと思ってたけど
connectが成功を返すまでsleepはさんでコールし続けるってコードを見かけた
これってありなの?
2011/04/23(土) 19:20:41.40
>>308
無し
あり得ない
レスポンスが遅くなるだけ
というか誤爆?
2011/04/25(月) 18:50:56.39
>>309
すまぬ、誤爆したうえ放置してた
2011/05/19(木) 08:24:03.85
omp_set_num_threadsってOpenMPのスレッド内で呼んでも有効にならないの?
2011/05/23(月) 11:29:46.68
>>311
スレッドを幾つ起動するかを、起動してから指定するの?
2011/07/01(金) 06:24:21.77
VC++2010でシングルスレッドのループが並列化したループの有無によって
速度変わってしまうのですが、原因分かりませんか?

ttp://ideone.com/Yn67n
2011/07/01(金) 12:39:39.32
>>313
環境が判らんからなんとも言えんが、シングルスレッドのループの裏でOpenMPか何かの処理が動いているとか?
ループ前後にsleep入れて様子見てみたらどうだろう。
2011/07/01(金) 14:43:07.70
clock()はCPU時間を取得するもの
なので、裏で走るスレッドの実行時間も加算される
実時間で計測する関数を使うようにしてみればいい
316313
垢版 |
2011/07/01(金) 15:14:31.88
原因をやんわりとではありますが掴めた気がします。

ttp://ideone.com/6g1yy
上記のコードの様に、時間取得用変数にvolatileをつけると並列ループの有無に関わらず
シングルスレッドループの速度が一定となりました。

また、時間計測処理を省いて体感で測ってみましたが、
こちらでも速度が一定な感があります。
(体感の為誤差は確認出来てませんが)


この事から、時間取得とOpenMP有効時の最適化は相性が悪いのではないかと思います。
根本的な解決にはなってませんが、回避策は分かりました、有難うございました。
2011/07/01(金) 15:15:14.35
リロードしてませんでした・・・
>>315そうしてみます、有難うございます。
2011/07/17(日) 14:48:54.13
taskとsectionの使い分けって?
2011/08/11(木) 16:34:58.28
fortran90でプログラミングしてるのに、
「C/C++プログラマーのためのOpenMP並列プログラミング」を買ってしまったんだが、
大まかな部分ってCもfortranも同じなのかな?
2011/08/11(木) 19:04:57.30
その本を窓から投げ捨てて、「fortran90 OpenMP」でググって出たPDFを読んだ方が100倍マシだよ。
2011/08/11(木) 23:46:57.30
>>320
おっけ今から全力でぶん投げてくる
2011/08/22(月) 01:58:44.67
くれ。
いや、どうせなら
図書館にでも寄贈してやってくれ
2011/08/22(月) 20:50:41.53
OpenMPのスタティックなライブラリってないの?
VCだとMP使うと再頒布可能パッケージが必要だ。
2011/08/22(月) 23:49:50.97
ttp://codezine.jp/article/detail/4693

> 先ほど構成をReleaseに変えてビルドした理由は、Debugでビルドして実行するには特別なファイルが
>必要になるからです。OpenMPをデバッグ構成でビルドするには、
>「Microsoft.VC90.DebugOpenMP.manifest」ファイルと「vcomp90d.dll」ファイル(VC2008の場合)が必要になります。
>このファイルはVisual Studio 2008のStandardバージョン以上ならば
>「C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP」
>にありますので、実行ファイルと同じ場所にコピーして下さい。そうすれば、
>Debug構成でも正常に実行できるようになります。

OpenMP対応を謳ってるくせに、なんでこんな面倒なことしないといけないんだろう・・・
プロパティで「OpenMP使う」ってするだけでできるようにしたらいいと思うんだけど。
(配布時は別途対応するにしても)
2011/08/23(火) 01:32:00.61
俺はフリーだろうとシェアウェアだろうと、
余計なモノをインストールさせるアプリは使わない。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。