OpenMPプログラミング

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

リンクなどは>>2以下で
7167
垢版 |
2006/08/29(火) 10:28:44
ありがとうございます。インポートライブラリを入れるとうまく動きました。
ためしに
for( i=1; i<=10000000; i++ ) {
double t1 = sin( i*3.14/10000000.0 );
double t2 = cos( i*3.14/10000000.0 );
s = s+t1*t1+t2*t2;
}
を計算すると、デバッグ版ではOpenMPの方が5倍くらい時間がかかるが、
リリース版では1割くらい早くなった。
ちなみに、ハイパースレッドのデュアル
2006/08/29(火) 13:38:55
#pragma omp parallel for reduction(+:s)
for ( ...

そのプログラムだとこうですか?うちの環境だとHTの1CPUだからかずぶずぶの結果です。
73デフォルトの名無しさん
垢版 |
2006/10/03(火) 02:54:43
OpenMP 入門ありますよ。
http://www.xlsoft.com/jp/products/intel/docs/OpenMP/html/OpenMP.html
74デフォルトの名無しさん
垢版 |
2006/10/26(木) 16:01:43
その次のステップの入門書がほしい
75デフォルトの名無しさん
垢版 |
2006/10/29(日) 00:07:31
72>> その意味で ずぶずぶ とはどこの方言?
2006/10/29(日) 08:21:18
>>75
東京
2006/11/06(月) 03:38:12
g++では利用できないのでしょうか?
2006/11/06(月) 21:45:14
>>77
snapshotsとかからGCC 4.2以降を取ってきて試してみろ
2006/11/18(土) 02:07:03
Openマンコぽこちんか
2006/11/20(月) 03:17:24
OpenマンPのG☆SPOTに決まってるだろバカか
81デフォルトの名無しさん
垢版 |
2006/12/03(日) 17:52:02
>>70
omp.hがPSDK(SP1)/(R2)に入っていませんでした。
実際には何をインストールなさいましたか。

>>68
マージモジュールを使ったインストール例を参照することは可能でしょうか。
vs6しか使ったことがなく、どうもうまくいきません。


なお、私はVS2005のstd(アップグレード)を使っています。
82デフォルトの名無しさん
垢版 |
2006/12/24(日) 23:44:00
Sun SorilisとVC++(std)の組み合わせで、OpenMPできますか??
2007/02/25(日) 14:20:45
>>82
できない
84デフォルトの名無しさん
垢版 |
2007/02/28(水) 07:03:32
OpenMPでスレッド数を取得するには
#pragma omp parallel
{
cout<<omp_get_num_threads()<<endl;
}
でよいのでしょうか?もっと何かスマートな方法はないでしょうか?
85デフォルトの名無しさん
垢版 |
2007/03/06(火) 08:50:24
#pragma omp sectionsでfor構文でのdynamicスケジュールの様な動作をさせたいのですが、
どのように書けばよいのでしょうか?
86デフォルトの名無しさん
垢版 |
2007/03/09(金) 12:49:12
しらね
2007/03/09(金) 13:28:27
>>72-73
OpenMPによる並列プログラミングと数値計算法
http://www.amazon.co.jp/gp/product/4621077171
とかどーでしょ。

>>84
パラレルリージョンの中でなくてもよいはず。
#ifdef _OPENMP
cout<<omp_get_num_threads()<<endl;
#endif
などとすればよいかと。
2007/03/10(土) 02:10:13
omp_get_num_threads() はその時点でスレッドチームを構成しているスレッドの数を返すから
逐次実行部分で呼ぶと 1 を返す。
89デフォルトの名無しさん
垢版 |
2007/03/10(土) 16:00:16
#pragma omp parallel
{
#pragma omp single
cout<<omp_get_num_threads()<<endl;
}
90デフォルトの名無しさん
垢版 |
2007/03/25(日) 22:33:15
program main
!$ use omp_lib
implicit none
character(len=4),parameter :: str(0:2) = ["hage","hoge","huge"]
print *, "Hello, World!"
!$omp parallel num_threads(3)
!$ print *, trim(str(omp_get_thread_num()))
!$omp end parallel
end program main
91デフォルトの名無しさん
垢版 |
2007/04/02(月) 18:31:00
レベルの低い人向けの商売ってあるじゃないですか

たとえば、カレーライス。子供の食い物ね。マクドナルド。通はモスバーガーでしょ?
野球だと、巨人。クルマだと、トヨタ。音楽だと、ミスチル。政治だと、自民党。
ビートルズだと、ポールの曲。音楽分かってる人はジョンですよね。
マンガだと、手塚治虫や藤子不二雄。今更読む必要もないw
小説だと、古本屋に山積されてる赤川次郎。小説マニアは読みませんねw
長嶋茂雄・新庄剛志・三浦カズ・ゴン。名前だけでむかつきますね。

DELLってつまりそういうレベルの低い人向けの商品ですよね。
歴史を作るのは我々マニアですから、記憶からはいつか消え去るんですよDELLはw
92デフォルトの名無しさん
垢版 |
2007/04/07(土) 02:30:59
C++のクラスでstaticな変数を使いたいのですが、OpenMPの中で更新した場合、安全に更新されるのでしょうか?
2007/04/07(土) 07:36:57
されると思う?localな変数でも、ちゃんと明示しないと無理だし、
データ並列になっていないのでは意味無いと思わない?
94デフォルトの名無しさん
垢版 |
2007/04/10(火) 11:50:17
       ,ィ                      __
      ,. / |´ ̄`ヽー- 、 ト、        , -‐、/./.- 、 書き込みのはやきこと風の如く
    / | |    ヽ   l l        ( 火◇風 ノ
  /o ̄`ハ._.ゝ===┴=く.ノ- 、      ノ ◇ ◇ (  他人と会話せざること林の如く
  /o O / l´ ⌒    ⌒  lo ',ヽ     ( 山◇ 林 }
  \___/. ト、(●)  (●) ハ  ∧     `⌒/7へ‐´ ネットで煽ること火の如く
 / ,イ   レ::::⌒(__人__)⌒l~T--‐彡    /./
/ ̄ ̄l.  彡、  |r┬-| ノ'l  l::::::::::彡ー7⌒つ、  部屋から動かざること山の如し
彡:::::::::::l  ト、__ `ー' /|  l::::::::::::ミ  {,_.イニノ
彡ソ/ノハ   ト、 \  / ,イ  川ハ ヾー‐'^┴
2007/04/12(木) 09:18:04
>>92
ちゃんと排他制御や共有のための宣言をすれば問題ないかと。
パラレルリージョンの中で single で1プロセスだけがアクセスするとか
reduction で更新するとかね。
96デフォルトの名無しさん
垢版 |
2007/04/12(木) 10:50:30
祗園精舎の鐘の声
諸行無常の響きあり

娑羅双樹の花の色
盛者必衰の理をあらはす

おごれる人も久しからず
唯春の夜の夢のごとし

たけき者も遂にはほろびぬ
偏に風の前の塵に同じ
97デフォルトの名無しさん
垢版 |
2007/06/02(土) 15:05:34
一般論として、MPIよりもOpenMPの方が性能が低下する(遅くなる)ということはありえますか?
MPIのプログラムをOpenMPを使って書き換えたのですが、3割近く遅くなってしまいました。
98デフォルトの名無しさん
垢版 |
2007/06/02(土) 15:29:34
一般論では遅くなります
2007/06/02(土) 15:37:48
きちんとチューニングされていれば、MPIの方が速い。
あとはpthreadを使って自分で書くという手もある。
2007/06/02(土) 15:42:04
OpenMPはお手軽。だからそれに伴って犠牲になっている部分もある。それが性能。
2007/06/02(土) 17:50:17
MPIで並列効果出せるほどの大きな粒度ならOpenMPにする必要はない。
OpenMPの利点は小さな粒度の並列処理が簡単に書けることとシングルソースで
非OpenMP環境でもビルドしてテストできること。
それから既存のソースにディレクティブ挿入するだけで並列化できるところかな。
2007/06/03(日) 06:10:20
>>101
同じ粒度でも、OpenMPの方が遅くなってしまいます。
OpenMPはスレッドレベルでの切り替えなので、プロセスレベルのMPIよりも、効率が良いと思っていたので
何が問題なのか、測りかねています。
103デフォルトの名無しさん
垢版 |
2007/06/03(日) 08:40:24
競合してるんじゃない?
2007/06/03(日) 10:07:50
キャッシュのヒット率の差だと思う
もし、pragma omp forでやっているのなら、for文を二つに分けて
pragma omp parallelで二つに並列してみたら?
105デフォルトの名無しさん
垢版 |
2007/06/03(日) 10:15:44
windows はaffinty maskを使えないの?
2007/06/03(日) 11:14:45
>>102
複数のスレッドが同じ行列要素とかメモリアドレスを参照しているなら効率は
たいてい悪くなるし、プロセスの立ち上げより計算時間の方が長いのが普通だから
OpenMPの宣伝文句に騙されない方がいいと思う。
モニタリングツールがあるなら>>104の原因が疑われるからキャッシュのヒット率
みてみたらいいと思うけど、OpenMPの困る所は性能がコンパイラとライブラリに
依存しすぎることだから、どのコンパイラ使ってるかで全然違うので何とも言えないな。
2007/06/03(日) 12:26:25
環境は、Fedora5にデュアルコアOpteronx2の計4cpuをインテルコンパイラを使って、コンパイルしています。
系を大きくしても(すなわち、スレッド生成頻度をかなり下げても)300%程度で飽和してしまいます。
以前、Redhat+Xeon+インテルコンパイラの時は,2CPUで200%(4CPUではないのであまりよい比較ではありませんが)
計算速度も倍になっていたので、コンパイラの問題なのか、opteronの問題なのか、そのあたりもう少し調べてみたいと思います。
2007/06/03(日) 12:32:32
1CPU から 2CPU にスケールするのと、4CPU にスケールするのとじゃ
全然話が違うからね。
109デフォルトの名無しさん
垢版 |
2007/06/03(日) 12:57:34
4cpuならうまく組めば1割も落ちないよ
スレッドチェッカーで確認してみな
2007/06/03(日) 14:58:41
>>107
OpteronってことはNUMA構成で使ってるってことはないかな?
OpenMPはSMP用だからNUMAだと効率ががた落ちになることがあるよ。
あと趣味でやってるのでなければCPU使用率よりも計算までの終了時間で考えた方がいいと思う。
メモリ競合起こすとCPU100%でも計算速度半分なんてざらだから。
2007/06/03(日) 15:24:23
カーネルがスレッドのスケジューリングとメモリページの割当を上手く管理していれば
Dual Core x 2 Socket くらい何とかならないの?
2007/06/03(日) 15:30:27
CPUとSIMDで行列計算をうまく分散してくれるコンパイラはないものか
2007/06/03(日) 15:42:04
lapackのSIMD化でダメなの?
そんなのはいくらでもあるが
114デフォルトの名無しさん
垢版 |
2007/06/04(月) 06:27:01
OpenMP節を入れ子にすると、並列化されなくなってしまいます。
入れ子のOpenMP節を並列化する方法はないものでしょうか?
2007/06/04(月) 09:06:41
>>114
OpenMP + nested loopで検索すればたくさんでてくるよ
2007/06/24(日) 15:29:55
インテルのスレッディング・ビルディング・ブロックとOpenMPの違いって何?
2007/06/24(日) 18:08:38
OpwnMP:
共有メモリ型並列計算機におけるマルチスレッド並列プログラミングのためのAPI

インテル スレッディング・ビルディング・ブロック:
C++用ランタイム・ライブラリー
2007/08/20(月) 02:26:56
Windows ServerR 2003 R2 Platform SDK
にopenmpのファイルが入ってるのかと思ったら入って無かった。
Microsoft Windows Software Development Kit for Windows Vista
にopenmpのファイルが入ってた。
ファイルの場所が
Microsoft SDKs\Windows\v6.0\VC\
以下のincludeとlibだから少し戸惑ってしまった。

で、さっそく簡単なプログラムを作って実行してみたらSpybotが反応したんだが。
vcompd.dllにスパイウェアが入ってるのか?
2007/09/06(木) 01:13:00
Microsoft Windows Software Development Kit for Windows Vista
vcredist_x86.exe

この2つでVC2005Expressでも使えた。
2007/09/19(水) 22:49:32
他人の書いた数値解析のプログラムをOpenMP対応にしている度素人です。
まずテストに単にパラレルリージョンを指定しただけのプログラムを走らせたら
パフォーマンスが半分くらいにまで落ち込んで困っています(スレッド数はCPU数以下です)。
しかもパラレルリージョンの範囲が広ければ広いほどパフォーマンスが悪化するのですが
これは当然なのでしょうか?
ちなみにパラレルリージョン内を並列化しても1CPUのときより10%くらい悪いです。
環境はOSはRHEL、インテルのfortranコンパイラです。
121デフォルトの名無しさん
垢版 |
2007/09/19(水) 23:54:02
的外れだが同じ作業をしていた素人として。

スレッド生成・消滅のオーバーヘッドは思いのほか大きい
$omp parallel 〜 $omp end parallel
が極めて複数回呼ばれる場合にパフォーマンスは非常に落ちる
ネストループ内部、100万回呼ばれるルーチン内など

シングルの作業内容をマルチ対応にするのは面倒ですね。
gprof等でタイムクリティカルな部分を探し、手を入れてみましょう
2007/09/20(木) 08:22:47
パラレルリージョンは例えば並列計算と逐次計算を交互にやるときに
逐次計算のたびにパラレルリージョンから出入りするオーバーヘッドを避けるために
使ったりするのが普通だと思う。

単にパラレルリージョンを指定しただけでは並列化による時間短縮はまったく起こらない。
並列化のオーバーヘッドがかかるだけ。
ループを並列化するとか、パラレルリージョンの中でデータ並列なりタスク並列の計算をするとかしないと。

一番大事なことはアルゴリズム中の並列性を見出すことかと。
並列性のない逐次アルゴリズムだとどうあがいてもパフォーマンスは出ない。
123120
垢版 |
2007/09/21(金) 00:15:35
今日いろいろ簡単なテストプログラムを組んでいたのですが
かなり大きな配列を含む範囲を
単にパラレルリージョンに指定しただけのプログラムは
1CPUのときの1/3程度まで低下すると言う現象がありました。
(並列化を指定すると4CPUで3.8倍程度にちゃんとなりました)
同じ動作をするスレッドが複数あってメモリが競合してるんですかね?
あしたスレッドチェッカーの体験版でも落として調べてみます。
>>121
今日試してみたところうちの環境では
100000回ループするプログラムの内と外に
$omp parallel 〜 $omp end parallel
をおいたプログラムをそれぞれ比較したのですがほとんど差はありませんでした。
リージョン内は簡単な内容だったのですが、
リージョン内のプログラムの内容によってもスレッド生成・消滅のオーバーヘッドは変わってくるんですかね?

>>122
並列化の指定をする前にまず並列化予定の範囲をパラレルリージョン指定して
ちゃんと動くのかを確認したかったのです。

長文失礼
2007/10/10(水) 15:20:28
sections分割でsection分けを行った時に、
自分でどのスレッドに割り当てる的な事は
できないのでしょうか?
125120
垢版 |
2007/10/25(木) 21:51:43
いまさらながら経過報告
元となったプログラムが古いものだったので、配列をallocateするのではなく
メインの宣言でかなり大きくとっていたのですが、
それを必要量にしたところかなり早くなりました。
ただ強い最適化(fastオプションとか)つけると
OpenMPはそんなにスピードが上がらずシングルスレッドに追いつかれてしまうんですけどね。
2007/11/30(金) 04:25:29
サーセーン。素人の恥ずかしい質問です。

OpenMPは従来の(OSなどに付属した)スレッドのライブラリの
置き換えとしては使用すべきではないのでしょうか?

(どこかで逐次プログラムの並列化がOpenMPの利用の前提であるとか見たのですが、)
並列で動くことが前提であるプログラム(例:HTTPデーモンなど)を
OpenMPを使って書こうと思っているのですが、止めたほうがいいのでしょうか・・・。
127126
垢版 |
2007/11/30(金) 04:26:29
うわぁ、このスレ伸びてないんだなあ。悪いけどage
2007/12/01(土) 01:58:56
OpenMP はひとまとまりの大きなデータ(行列とか画像とか)に対する計算を
複数のスレッドで並列化するのに向いている希ガス。つまりデータ並列向き。
データ並列性のある for 文で書かれたアルゴリズム(行列ベクトル積とか
画像のしきい値処理とか)は parallel for ディレクティブでいとも簡単に並列化できる。
そこが OpenMP のおいしいところ。

タスク並列の並列プログラム、つまり各スレッドが独立に違う処理をする
(例えばそれぞれ別のクライアントからの要求を処理する)並列プログラムも
OpenMP で書けるけど、あまりうまみがないと思われ。

逐次プログラムを並列化するのが前提というのは違う気がする。
ただ、例えば parallel for ディレクティブしか使ってない並列プログラムは
コンパイラの OpenMP 機能をオフにすれば逐次プログラムとしてコンパイルできる。
そこが他の並列化手法(POSIXスレッドとかMPIとか)と違うところ。

でも、OpenMP機能をオフにするとコンパイル不能になる並列プログラムも書けるし、
parallel sections を使ったプログラムは逐次プログラムとしてコンパイルはできても
意味が変わってしまう(各セクションが順番に逐次実行される)。
つまり、この手のプログラムは並列で動くことが前提で書くわけだ。

結局のところ、OpenMP を使うのが妥当かどうかは126さんがやりたいことに依る。
並列性の高いデータ並列の計算をやりたいなら使う価値がある。
2007/12/01(土) 02:04:37
追加。OpenMPでHTTPデーモンを書いた、という報告を見たことがあったのを思い出した。
http://www.nic.uoregon.edu/iwomp2005/Papers/f35.pdf
俺は詳しく読んでないので内容についてはノーコメント。参考までに。
2007/12/01(土) 13:39:21
並列化した部分じゃbreakやreturn使えないし、難しかっただろうなぁ。
普通のWindowsプログラムでCreateThreadをOpenMPで置き換えろって言われたら・・・
メッセージポンプ使ってなんとかなるんだろうか
2007/12/01(土) 23:44:51
>並列化した部分じゃbreakやreturn使えない

kwsk
132126
垢版 |
2007/12/03(月) 05:18:50
スレッドを横断したbreakやreturnが出来ないということでは?
字句上は単なるスコープにしか見えないので、出来そう・・・しかし出来ないもどかしさ(何)。

>>128
ご返答ありがとうございます。
128氏から頂いた意見も考慮に入れつつ、色々と検討してみた結果、
今回やりたいことにはOpenMPは適していない、という判断に至りました。

しかし実験的にHTTPサーバらしきものをOpenMPを使って書いてみたところ、
簡単なものならかなり簡潔に書けることも分かり、、全てでなくとも部分的にOpenMPを使うのもありかと思えました。
133デフォルトの名無しさん
垢版 |
2007/12/05(水) 05:51:33
>>119の方法で
VC2005ExpressEditionで使えるようになったはいいんだけど
forループの所に
#pragma omp parallel for
ってやっても
error C3005: ';' : OpenMP 'parallel' ディレクティブでは予期しないトークンです
とかいうエラーが発生して使えないんだけど何故なの??

#pragma omp parallel sections
とか他のは通るけど,forループのだけどうしても使えん・・・

#pragma omp parallel
{
#pragma omp for
・・・
}
にすると
error C3001: 'if' : OpenMP ディレクティブ名が必要です
って言われる

2007/12/17(月) 18:47:08
>133
#pragma .. の行末に ';' がついてるとかいうオチだったら素っ裸で町内1周してこい
2008/01/04(金) 15:12:19
すでにあるプログラムをOpenMP化しようと思うのですが、以下のような場合にfuncがスレッドセーフで再入可能であれば問題ないですか?
#pragma omp for
for(int i=0;i<100000;i++)
{
func(i);
}
2008/01/04(金) 15:53:58
問題ないです
func()の定義が別ファイルでもおk
2008/01/04(金) 16:38:48
>>136
ありがとうです。
OpenMPはSMPで使う分にはかなり便利ですね。
138sage
垢版 |
2008/02/06(水) 21:13:32
IntelFortran10.0で数値解析やってるんですけど
サブルーチン内で並列化領域をつくるのと
サブルーチンごとメインに展開して並列化領域つくるのとで
並列化時の速度が異なったり(逐次だとほぼ一緒)
逐次計算部分にある並列化と関係ないサブルーチンを
コメントアウトするかしないかで並列化時の速度向上が変わります。
並列スレッドのスタックサイズとかの問題なんでしょうかね。 
2008/02/06(水) 22:02:55
速度や速度向上が具体的にどう違うの?
2008/02/07(木) 00:50:56
まず、各CPUに処理が効率よく割り振られているか、CPUの負荷率を見てみたらいいんじゃないか?
2008/02/13(水) 15:49:52
VC++2008でコンパイルするとVCOMPD.libが無いというエラーが出ます。
VCOMPD.libはどこで手に入りますか?
2008/02/13(水) 16:40:58
>>141
VS2005だとPro版以上でサポート。VS2008も同じだと思う。
2008/02/13(水) 20:12:04
>141
vcompd.libはProfessional版以外手に入れる方法はない。

ただしリリースビルド版のライブラリであるvcomp.libは
Windows Server 2008 SDKをインストールするとゲットできる。

デバッグビルドでもリリースビルドのライブラリ(vcomp.lib)を
リンクする設定にするとExpressでもOpenMPが自由に使用可能。
2008/02/15(金) 14:05:13
たとえば、ソケットのread/writeのwait待ちをやっているslect(poll)のようなもので
while(1)
#pragma omp parallel sections
{
#pragma omp section
read後その処理
#pragma omp section
write後その処理
}
で、ここで、暗黙のwaitがかかると思われるが、select的な使い方って、出来る?

sectionの跡にnowaitをいれといたらよいだけ?
2008/02/15(金) 14:26:50
nowaitを入れた場合、どのスレッドが生き残るのでしょうか?
それとも、並列実行するところはすべて子スレッドで、実行中のスレッド数が最大より1少なくなった時点で
メインスレッドが継続されるのでしょうか?
2008/02/15(金) 16:42:54
read/writeのtimeoutを入れておけば、なんとかなりますか。
しかし、openmp(のsections)では、スレッドは、死にますか?
一応、処理が終われば、lockが外れるだけでしょう(gccの実装ではそのようです)
147sage
垢版 |
2008/03/01(土) 00:47:47
スレッドプロファイラー使ってる人居るかな。
あのREGIONS VIEWの各リージョンの範囲はなにで決まってるの?
同期から同期の間かと思ってたんだけどソースの位置みるとちがうっぽい。
最適化オプションのせいでソースとの対応がとれなくなってるのかしらん。
148138
垢版 |
2008/03/04(火) 19:19:48
chkstkという関数に要する時間が
OpenMPにすると凄まじく増えているのが原因のようでした。
関数に引き渡す配列が多すぎなのか。
2008/04/06(日) 10:57:30
>>148
私もintel fortran10+mkl+openmpで数値計算しています
openmp初心者の私は、intelのopenmpのドキュメントを参考にしました。

parallel do ,sections ,reduction,privateあたりしか使っていませんが、オリジナルの
プログラムのマルチスレッド化は割と簡単に出来、計算時間も「ほぼ」スレッド数倍
にできました。
(当然ですがparallel region部分です。プログラム全体ではありません)

そもそもchkstkは並列処理できるかどうかを検討してはどうですか。
各スレッドで相互参照するのであれば、reduction宣言等が適切であれば問題ないはず。
2008/04/09(水) 22:52:21
>>148
関数のエントリ近辺で chkstk が呼び出され、必要に応じてスタックが拡張される
(実メモリが割り当てられる)わけですが、シングルスレッドの場合は一度拡張された
スタックはもちろん再利用されるので負荷が軽いわけです。

スタックはリニアなアドレスに(ページング機構を用いて)メモリを割り当てる必要があるため、
割り当てられたページを再利用できない場合には時としてヒープよりも確保・解放が重い
メモリとなります。マルチスレッドでスタックが頻繁に成長するような場合には、メモリを
スタック上に取るのをやめて、std::vector などを用いてヒープから確保した方がよいと
思います。

たどたどしい説明になってしまった。
2008/05/12(月) 19:46:23
・アプリケーションAが、calc1.dll と calc2.dll を呼んでいる
・calc1.dll と calc2.dll は共に IntelCompiler で OpenMP を使って並列化
・calc1.dll のルーチンは問題なく呼べる
・calc2.dll のルーチンを呼ぶと、

  OMP abort: Initializing libguide.lib, but fount libguide.lib already initialized

 を表示して落ちる/(^o^)\

ネットを漁ってみて、 環境変数 KMP_DUPLICATE_LIB_OK を TRUE にしてみたり
libguide.lib の代わりに libguide40.lib を使ってみるも効果なし

複数の DLL が Intel の OpenMP 使ってるとアウト?
そうなると DLL じゃ使えねーってハナシになるんですが・・・・
2008/05/19(月) 17:00:29
>>143
Windows Server 2008 SDKにvcompd.libも入ってるみたい。
2008/07/19(土) 15:25:36
GCCで4.3.1でOpenを利用するためのconfigureオプションを教えてください。
makeしてインストールしたgccを利用すると#include <omp.h>で
ファイルが無いと言われて困ってます。
gcc-4.3.1\libgomp\omp.h.in
は存在するのですが、どうすればいいのでしょう?configureは
./configure --enable-threads=win32 --with-system-zlib で行いました。
2008/07/19(土) 15:30:42
Open => OpenMPのミスです。
2008/07/19(土) 16:30:35
OpenMPが使えるGCCを自前でビルドしたことはないけど
MinGW用のGCC 4.3.0でgcc -vとしてバージョンを表示させると
configure時のオプションがずらっと表示される。

> gcc -v
Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.3.0/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++
--disable-sjlj-exceptions --enable-shared --enable-libgcj --enable-libgomp --with-dwarf2
--disable-win32-registry --enable-libstdcxx-debug --enable-concept-checks
--enable-version-specific-runtime-libs --build=mingw32 --with-bugurl=http://www.mingw.org/bugs.shtml
--prefix=/mingw --with-gmp=/mingw/src/gcc/gmp-mpfr-root --with-mpfr=/mingw/src/gcc/gmp-mpfr-root
--with-libiconv-prefix=/
mingw/src/gcc/libiconv-root
Thread model: win32
gcc version 4.3.0 20080305 (alpha-testing) mingw-20080502 (GCC)

参考までに。
156デフォルトの名無しさん
垢版 |
2008/08/29(金) 10:56:03
OpenMPを使って一次元配列から最大値、最小値を求める方法を教えてください。
2008/08/29(金) 13:00:28
reductionにminやmaxは無いんだよな。
俺はスレッド数を取得して解決した気がする。
大雑把に書くとこんな感じ。

int n_thread = omp_get_num_threads();
int imin = INT_MAX;

#pragma omp parallel for shared(imin, array)
for ( int j = 0; j < n_thread; ++j ) {
int imin_ = INT_MAX;
int offset = size/n_thread*j;
for ( int i = offset; i < offset+size/n_thread; ++i ) {
imin_ = min(imin_, array[i]);
}
#pragma omp critical
{
imin = min(imin, imin_);
}
}
2008/08/30(土) 07:56:40
俺が mingw用 gcc4.3.2をビルドしたときのコマンド configureとmakeの行は実際は1行
------------- configure_gcc.sh -----------------
#!/bin/sh

export LC_ALL=C

../source/gcc-4.3.2/configure --prefix=/mingw --host=mingw32 --build=mingw32
--target=mingw32 --program-prefix="" --with-as=/mingw/bin/as.exe
--with-ld=/mingw/bin/ld.exe --with-libiconv-prefix=/mingw --with-gcc
--enable-libgomp --with-arch=i686 --with-tune=generic --with-gnu-ld
--with-gnu-as --enable-threads=win32 --disable-nls
--enable-languages=c,c++,objc,obj-c++,fortran --disable-win32-registry
--disable-shared --with-dwarf2 --disable-sjlj-exceptions
--enable-cxx-flags='-fno-function-sections -fno-data-sections'
--enable-version-specific-runtime-libs --enable-hash-synchronization
--enable-libstdcxx-debug --disable-bootstrap --with-bugurl=http://www.mingw.org/bugs.shtml
---------------------------------------------

------------- make_gcc.sh ---------------------
#!/bin/sh

export LC_ALL=C

make BOOTCFLAGS="-O2 -D__USE_MINGW_ACCESS" CFLAGS="-O2 -D__USE_MINGW_ACCESS"
CXXFLAGS="-O2 -mthreads" LDFLAGS="-s -Wl,--stack=0x2000000" 2>err.log
----------------------------------------------
159デフォルトの名無しさん
垢版 |
2008/08/30(土) 14:04:15
>>157
> reductionにminやmaxは無いんだよな
あれ、あったと思うけど・・・。
reduction(min:unko)
とか。Fortran でしか使ったこと無いけど。
でもどのアドレスでminだったか、とかを取得したいときは
結局 shared にしちゃうんだけどね。
2008/08/30(土) 14:19:32
C/C++だとmin/maxは演算子どころかビルトイン関数ですらないから無理だと思う。
161159
垢版 |
2008/08/30(土) 17:17:59
>>160
そうなんだ。Cはバイナリをどうしても読みたいときにいやいや
使う程度だから知らなかったよ。
でもFortranでもmin,max関数はあまり使われないんだけどね。
156のがFortranでよかったら、

unkomin = 1.0e+10
unkomax =-1.0e+10
!$omp paralell do private(i,a) shared(unko)
!$omp& reduction(min:unkomin) reductionmax:unkomax) shared(unko)
do i = 1, 100
a = unko(i)
if (a .LT. unkomin) unkomin = a
if (a .GT. unkomax) unkomax = a
enddo
!$omp end parallel do
write(*,*) unkomin,unkomax

みたいな感じでいけると思うよ。いまコンパイラ使えないからチェックできないけど。
非OpenMPでコンパイルしてもちゃんと動く・・・はず。
162159
垢版 |
2008/08/30(土) 17:19:44
reductionmax は reduction(max ね。
163デフォルトの名無しさん
垢版 |
2008/09/04(木) 22:56:21
2次元配列変数は、reductionで使えないんでしたっけ?
2008/09/07(日) 13:20:49
NG。
ifortは出来た気がする。
2008/09/07(日) 13:26:10
#pragma omp for
#pragma omp parallel for

てなにが違うの?
2008/09/07(日) 17:53:44
#pragma omp for は #pragma omp parallel ブロックの中に書く必要があるが、
parallelブロックにforブロックが1つのことも多いので
#pragma omp parallel for でまとめて書けるようにしてある。
2008/09/09(火) 22:58:56
なるほど。
168デフォルトの名無しさん
垢版 |
2008/09/16(火) 07:09:33
>>143 >>68
スレチな質問で申し訳ないのだけどdllをリンクする設定を
教えて頂けないでしょうか
>>119を参考に
WindowsVista+Visual Studio2005 standardで
Microsoft Windows Software Development Kit for Windows Vistaと
vcredist_x86.exeでReleaseのビルドは通るようになった

>>68を参考に
インストーラーを作ってみたのですが
C\ProgramFiles\Microsoft Visual Studio 8\VC\redistに入ってしまい
winsxsには入ってくれません…
2009/01/21(水) 13:22:31
並列化前後で答えが変わってしまいます。どこがおかしいのでしょうか?

//画像上でランダムで数点選んできた線との距離が最少になる座標を算出
#ifdef _OPENMP
#pragma omp parallel for private(data,x,y,a,b,i,error)
#endif
for(j=0;j<KURIKAWSIKAISUU;j++){
better_error[j] = 1000;//距離初期化
for(y=100;y<=HEIGHT-100;y++){
for(x=100;x<=WIDTH-100;x++){
error = 0;
get_randum_number(data); //ランダムでデータNo.を選択

for(i=0;i<ITIDONIERAZUKAZU;i++){
error += abs(y - a[data[i]]*x - b[data[i]]) / sqrt(1+pow(a[data[i]],2));
}
error /= select;
if(better_error[j] > error){
better_error[j] = error;
ans[j].x = x;
ans[j].y = y;
}
}
}
}
170デフォルトの名無しさん
垢版 |
2009/01/21(水) 14:08:01
よくわかんねけど
get_randum_number
で配列dataにはいる乱数が変わるからじゃね?
たぶん呼ばれる順番が並列と1CPUのときで違うだろうから。

ループ内で乱数つくらないで、でかい乱数用の2次元配列
data0[KURIKAWSIKAISUU][ITIDONIERAZUKAZU]
をループが始まる前に「並列処理しないで」作ってから
(配列data0をshared属性付けて)ループ処理するといいかも。
計算は遅くなりそうだけどね。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況