OpenMPプログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGhttp://www.openmp.org/
リンクなどは>>2以下で
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNGある
0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG対極にあるのが分散メモリ型のMPI。
いずれも計算用途。
pthreadやMPIより、OpenMPによる並列化ははるかに容易。
ただし共有メモリで並列計算するには、マシンのプロセッサ数が並列数以上でなくてはならない。
つまり、マシンのコストが高い。
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNG( ゚Д゚)ポカーン
0011デフォルトの名無しさん
NGNGSDSMとか使ってがんばればできるぞ。
お薦めはしないがなー。
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
05/02/13 04:39:430014デフォルトの名無しさん
05/02/13 11:25:49ドラクエやれ
0015デフォルトの名無しさん
05/03/05 03:01:460016デフォルトの名無しさん
05/03/16 15:18:59MPI
0017デフォルトの名無しさん
2005/03/29(火) 00:25:370018デフォルトの名無しさん
2005/03/31(木) 10:59:10効率、可搬性などどちらが優れているのでしょうか?
0019デフォルトの名無しさん
2005/05/03(火) 17:08:50VisualStudio2005betaを使ってるヤツは少ないか。
所詮業務じゃ使えないしな。。
しかしDualコア+HyperThreadで、この年末には
家庭用PCですら4CPUになっちまうのかな。スゲエ。
0020デフォルトの名無しさん
2005/05/06(金) 05:11:220021デフォルトの名無しさん
2005/05/06(金) 07:39:080022デフォルトの名無しさん
2005/05/07(土) 11:38:362005β使え。
0023デフォルトの名無しさん
2005/05/14(土) 04:41:120024デフォルトの名無しさん
2005/05/23(月) 08:04:490025デフォルトの名無しさん
2005/05/24(火) 12:54:360026デフォルトの名無しさん
2005/05/24(火) 20:05:51CELLは分散メモリだからMPIか?
0027デフォルトの名無しさん
2005/06/16(木) 00:42:330028デフォルトの名無しさん
2005/06/26(日) 17:44:340029デフォルトの名無しさん
2005/08/11(木) 15:08:40尼で見つけた "Parallel Programming in OpenMP" って本の評価はどんなもんですか?
ttp://www.amazon.co.jp/exec/obidos/ASIN/1558606718/250-7296386-2789028
0030デフォルトの名無しさん
2005/08/11(木) 16:14:03Intelのサイトで技術PDF探してみては?
0031デフォルトの名無しさん
2005/08/12(金) 01:20:16ですよねぇ。こういう方面の技術って、手詰まりなんですかね?
0032デフォルトの名無しさん
2005/08/22(月) 04:23:240033デフォルトの名無しさん
2005/09/09(金) 21:43:420034デフォルトの名無しさん
2005/11/05(土) 16:06:55#pragma omp parallel for private(j)
for(i=0;i<100;i++)
for(j=0;j<100;j++)
何か演算
とした場合これはiを分割して実行していて
jはローカル変数として分割されたiの中で0〜99まで回してるってことですか?
それともjが分割されているってことですか?
0035デフォルトの名無しさん
2005/11/09(水) 21:46:220036デフォルトの名無しさん
2005/11/27(日) 06:12:290037デフォルトの名無しさん
2005/11/27(日) 10:56:58日本語(ry
icc -openmp hoge.c
0038デフォルトの名無しさん
2005/11/27(日) 19:13:26OpenMP付のSunのコンパイラも手に入るよ
高性能コンパイラが無料だなんてなあ
0039デフォルトの名無しさん
2005/12/03(土) 12:29:210040デフォルトの名無しさん
2006/01/30(月) 08:24:14どういう意味?
0041デフォルトの名無しさん
2006/01/30(月) 15:18:18将来的にはこういうのが普通に使われるようになるかもね。
0042デフォルトの名無しさん
2006/02/12(日) 01:28:59そしたらいよいよ知名度上がるんじゃないの?
0043デフォルトの名無しさん
2006/02/14(火) 06:14:02Windowsもかな
0044デフォルトの名無しさん
2006/02/14(火) 12:48:54今度Mac版も出るらしいから、Win、Mac、Linuxどの環境でもGCC、IntelコンパイラでOpenMP
できるようになる鴨。
0045デフォルトの名無しさん
2006/02/14(火) 21:19:59おまい、髭のおっさんだろ。
0046デフォルトの名無しさん
2006/02/17(金) 12:06:20どのようにしたらコンパイラがOpenMPをサポートしているか調べられるでしょうか?
0047デフォルトの名無しさん
2006/02/17(金) 16:15:54VC++8は対応してるよ
0048デフォルトの名無しさん
2006/02/17(金) 17:36:01#ifdef _OPENMP
#endif
0049デフォルトの名無しさん
2006/03/12(日) 17:43:300050デフォルトの名無しさん
2006/03/12(日) 17:47:280051http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 21:11:59もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
0052デフォルトの名無しさん
2006/03/19(日) 09:25:20kwsk
0053デフォルトの名無しさん
2006/03/19(日) 14:16:22今はマージされたのがtagsにある。
鯖の健康を損なわない範囲で好きなだけチェックアウトしなさい。
0054デフォルトの名無しさん
2006/04/11(火) 11:57:56時代が変わったようだな
0055デフォルトの名無しさん
2006/04/18(火) 12:54:01細かい単位であっちこちで同期を取るようなプログラムが手軽に作れてしまえるOpenMPは痛し痒し。
激しくパフォーマンスが出なくてシングルで動かしたときより遅くなることも。
0056デフォルトの名無しさん
2006/04/21(金) 15:19:260057デフォルトの名無しさん
2006/04/21(金) 15:25:08VC++ 2005
0058デフォルトの名無しさん
2006/05/02(火) 14:09:55細粒度はパフォーマンスでないけど、お手軽並列化〜♪って感じなんでないかい。
0059デフォルトの名無しさん
2006/06/02(金) 08:39:590060デフォルトの名無しさん
2006/06/04(日) 00:55:010061デフォルトの名無しさん
2006/06/10(土) 00:01:580062デフォルトの名無しさん
2006/06/10(土) 22:40:12なおるんじゃね?
どうやってバインドするかしらねーけど。
0063デフォルトの名無しさん
2006/06/10(土) 23:52:44行列の計算のような同じタイプの計算を並列化した場合遅くなるのは当たり前。
片方は整数もう片方で実数計算をさせると効果が出るかもしれない。
0064デフォルトの名無しさん
2006/06/11(日) 01:38:100065デフォルトの名無しさん
2006/06/11(日) 18:15:49あと実数がメインの場合、実数程の負荷は無いにせよアドレスの計算やループカウンタで整数も結構忙しい。
実数をメインにするとそこらへん上手く住み分け出来てると思った。
演算器を効率良く使えてウマー。
0066デフォルトの名無しさん
2006/06/12(月) 18:36:580067デフォルトの名無しさん
2006/08/26(土) 14:58:22プログラムが開始する前にエラーが起こります。
/openmp をつけてコンパイルしたり、マニフェストファイルに
<file name="vcompd.dll" hash="XXXX" hashalg="XXX"/>と入れ
たりしましたが、まったくピクリとも動いてくれません。
皆さんは普通にVS2005でOpenMP使ってますか?
0068デフォルトの名無しさん
2006/08/27(日) 10:05:19\Program Files\Common Files\Merge Modules
Microsoft_VC80_OpenMP_x86.msm
Microsoft_VC80_DebugOpenMP_x86.msm
リリース版だけならvcregist_x86.exeでも導入できる。
0069デフォルトの名無しさん
2006/08/27(日) 16:59:19うん、普通に使える。
>プログラムが開始する前にエラーが起こります。
ってのがどういう意味かよく分からんし(コンパイル時か実行時か)、
とりあえずエラーメッセージとかソースとか晒してみたら。
0070デフォルトの名無しさん
2006/08/28(月) 14:20:01足りないものはomp.h とvcomp(d).dllとインポートライブラリで、
これはPlatformSDK (for Win2003とかいう新しめの奴)を入れると付いてくる。
これをIDEの各検索パスに追加すればコンパイルは出来る。
ただし、WinSXSディレクトリにdllをインストールしないので実行時にDLLが無いためエラーになる。
この導入の仕方は>>68のとおり。
同じ方法でPGOもできないかと思ったがこれは無理でした。
ただ単純な/GL /LTCG オプションでのコンパイルは出来るからこれで我慢。
007167
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割くらい早くなった。
ちなみに、ハイパースレッドのデュアル
0072デフォルトの名無しさん
2006/08/29(火) 13:38:55for ( ...
そのプログラムだとこうですか?うちの環境だとHTの1CPUだからかずぶずぶの結果です。
0073デフォルトの名無しさん
2006/10/03(火) 02:54:43http://www.xlsoft.com/jp/products/intel/docs/OpenMP/html/OpenMP.html
0074デフォルトの名無しさん
2006/10/26(木) 16:01:430075デフォルトの名無しさん
2006/10/29(日) 00:07:310076デフォルトの名無しさん
2006/10/29(日) 08:21:18東京
0077デフォルトの名無しさん
2006/11/06(月) 03:38:120078デフォルトの名無しさん
2006/11/06(月) 21:45:14snapshotsとかからGCC 4.2以降を取ってきて試してみろ
0079デフォルトの名無しさん
2006/11/18(土) 02:07:030080デフォルトの名無しさん
2006/11/20(月) 03:17:240081デフォルトの名無しさん
2006/12/03(日) 17:52:02omp.hがPSDK(SP1)/(R2)に入っていませんでした。
実際には何をインストールなさいましたか。
>>68
マージモジュールを使ったインストール例を参照することは可能でしょうか。
vs6しか使ったことがなく、どうもうまくいきません。
なお、私はVS2005のstd(アップグレード)を使っています。
0082デフォルトの名無しさん
2006/12/24(日) 23:44:000083デフォルトの名無しさん
2007/02/25(日) 14:20:45できない
0084デフォルトの名無しさん
2007/02/28(水) 07:03:32#pragma omp parallel
{
cout<<omp_get_num_threads()<<endl;
}
でよいのでしょうか?もっと何かスマートな方法はないでしょうか?
0085デフォルトの名無しさん
2007/03/06(火) 08:50:24どのように書けばよいのでしょうか?
0086デフォルトの名無しさん
2007/03/09(金) 12:49:120087デフォルトの名無しさん
2007/03/09(金) 13:28:27OpenMPによる並列プログラミングと数値計算法
http://www.amazon.co.jp/gp/product/4621077171
とかどーでしょ。
>>84
パラレルリージョンの中でなくてもよいはず。
#ifdef _OPENMP
cout<<omp_get_num_threads()<<endl;
#endif
などとすればよいかと。
0088デフォルトの名無しさん
2007/03/10(土) 02:10:13逐次実行部分で呼ぶと 1 を返す。
0089デフォルトの名無しさん
2007/03/10(土) 16:00:16{
#pragma omp single
cout<<omp_get_num_threads()<<endl;
}
0090デフォルトの名無しさん
2007/03/25(日) 22:33:15!$ 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
0091デフォルトの名無しさん
2007/04/02(月) 18:31:00たとえば、カレーライス。子供の食い物ね。マクドナルド。通はモスバーガーでしょ?
野球だと、巨人。クルマだと、トヨタ。音楽だと、ミスチル。政治だと、自民党。
ビートルズだと、ポールの曲。音楽分かってる人はジョンですよね。
マンガだと、手塚治虫や藤子不二雄。今更読む必要もないw
小説だと、古本屋に山積されてる赤川次郎。小説マニアは読みませんねw
長嶋茂雄・新庄剛志・三浦カズ・ゴン。名前だけでむかつきますね。
DELLってつまりそういうレベルの低い人向けの商品ですよね。
歴史を作るのは我々マニアですから、記憶からはいつか消え去るんですよDELLはw
0092デフォルトの名無しさん
2007/04/07(土) 02:30:590093デフォルトの名無しさん
2007/04/07(土) 07:36:57データ並列になっていないのでは意味無いと思わない?
0094デフォルトの名無しさん
2007/04/10(火) 11:50:17,. / |´ ̄`ヽー- 、 ト、 , -‐、/./.- 、 書き込みのはやきこと風の如く
/ | | ヽ l l ( 火◇風 ノ
/o ̄`ハ._.ゝ===┴=く.ノ- 、 ノ ◇ ◇ ( 他人と会話せざること林の如く
/o O / l´ ⌒ ⌒ lo ',ヽ ( 山◇ 林 }
\___/. ト、(●) (●) ハ ∧ `⌒/7へ‐´ ネットで煽ること火の如く
/ ,イ レ::::⌒(__人__)⌒l~T--‐彡 /./
/ ̄ ̄l. 彡、 |r┬-| ノ'l l::::::::::彡ー7⌒つ、 部屋から動かざること山の如し
彡:::::::::::l ト、__ `ー' /| l::::::::::::ミ {,_.イニノ
彡ソ/ノハ ト、 \ / ,イ 川ハ ヾー‐'^┴
0095デフォルトの名無しさん
2007/04/12(木) 09:18:04ちゃんと排他制御や共有のための宣言をすれば問題ないかと。
パラレルリージョンの中で single で1プロセスだけがアクセスするとか
reduction で更新するとかね。
0096デフォルトの名無しさん
2007/04/12(木) 10:50:30諸行無常の響きあり
娑羅双樹の花の色
盛者必衰の理をあらはす
おごれる人も久しからず
唯春の夜の夢のごとし
たけき者も遂にはほろびぬ
偏に風の前の塵に同じ
0097デフォルトの名無しさん
2007/06/02(土) 15:05:34MPIのプログラムをOpenMPを使って書き換えたのですが、3割近く遅くなってしまいました。
0098デフォルトの名無しさん
2007/06/02(土) 15:29:340099デフォルトの名無しさん
2007/06/02(土) 15:37:48あとはpthreadを使って自分で書くという手もある。
0100デフォルトの名無しさん
2007/06/02(土) 15:42:040101デフォルトの名無しさん
2007/06/02(土) 17:50:17OpenMPの利点は小さな粒度の並列処理が簡単に書けることとシングルソースで
非OpenMP環境でもビルドしてテストできること。
それから既存のソースにディレクティブ挿入するだけで並列化できるところかな。
0102デフォルトの名無しさん
2007/06/03(日) 06:10:20同じ粒度でも、OpenMPの方が遅くなってしまいます。
OpenMPはスレッドレベルでの切り替えなので、プロセスレベルのMPIよりも、効率が良いと思っていたので
何が問題なのか、測りかねています。
0103デフォルトの名無しさん
2007/06/03(日) 08:40:240104デフォルトの名無しさん
2007/06/03(日) 10:07:50もし、pragma omp forでやっているのなら、for文を二つに分けて
pragma omp parallelで二つに並列してみたら?
0105デフォルトの名無しさん
2007/06/03(日) 10:15:440106デフォルトの名無しさん
2007/06/03(日) 11:14:45複数のスレッドが同じ行列要素とかメモリアドレスを参照しているなら効率は
たいてい悪くなるし、プロセスの立ち上げより計算時間の方が長いのが普通だから
OpenMPの宣伝文句に騙されない方がいいと思う。
モニタリングツールがあるなら>>104の原因が疑われるからキャッシュのヒット率
みてみたらいいと思うけど、OpenMPの困る所は性能がコンパイラとライブラリに
依存しすぎることだから、どのコンパイラ使ってるかで全然違うので何とも言えないな。
0107デフォルトの名無しさん
2007/06/03(日) 12:26:25系を大きくしても(すなわち、スレッド生成頻度をかなり下げても)300%程度で飽和してしまいます。
以前、Redhat+Xeon+インテルコンパイラの時は,2CPUで200%(4CPUではないのであまりよい比較ではありませんが)
計算速度も倍になっていたので、コンパイラの問題なのか、opteronの問題なのか、そのあたりもう少し調べてみたいと思います。
0108デフォルトの名無しさん
2007/06/03(日) 12:32:32全然話が違うからね。
0109デフォルトの名無しさん
2007/06/03(日) 12:57:34スレッドチェッカーで確認してみな
0110デフォルトの名無しさん
2007/06/03(日) 14:58:41OpteronってことはNUMA構成で使ってるってことはないかな?
OpenMPはSMP用だからNUMAだと効率ががた落ちになることがあるよ。
あと趣味でやってるのでなければCPU使用率よりも計算までの終了時間で考えた方がいいと思う。
メモリ競合起こすとCPU100%でも計算速度半分なんてざらだから。
0111デフォルトの名無しさん
2007/06/03(日) 15:24:23Dual Core x 2 Socket くらい何とかならないの?
0112デフォルトの名無しさん
2007/06/03(日) 15:30:270113デフォルトの名無しさん
2007/06/03(日) 15:42:04そんなのはいくらでもあるが
0114デフォルトの名無しさん
2007/06/04(月) 06:27:01入れ子のOpenMP節を並列化する方法はないものでしょうか?
0115デフォルトの名無しさん
2007/06/04(月) 09:06:41OpenMP + nested loopで検索すればたくさんでてくるよ
0116デフォルトの名無しさん
2007/06/24(日) 15:29:550117デフォルトの名無しさん
2007/06/24(日) 18:08:38共有メモリ型並列計算機におけるマルチスレッド並列プログラミングのためのAPI
インテル スレッディング・ビルディング・ブロック:
C++用ランタイム・ライブラリー
0118デフォルトの名無しさん
2007/08/20(月) 02:26:56にopenmpのファイルが入ってるのかと思ったら入って無かった。
Microsoft Windows Software Development Kit for Windows Vista
にopenmpのファイルが入ってた。
ファイルの場所が
Microsoft SDKs\Windows\v6.0\VC\
以下のincludeとlibだから少し戸惑ってしまった。
で、さっそく簡単なプログラムを作って実行してみたらSpybotが反応したんだが。
vcompd.dllにスパイウェアが入ってるのか?
0119デフォルトの名無しさん
2007/09/06(木) 01:13:00vcredist_x86.exe
この2つでVC2005Expressでも使えた。
0120デフォルトの名無しさん
2007/09/19(水) 22:49:32まずテストに単にパラレルリージョンを指定しただけのプログラムを走らせたら
パフォーマンスが半分くらいにまで落ち込んで困っています(スレッド数はCPU数以下です)。
しかもパラレルリージョンの範囲が広ければ広いほどパフォーマンスが悪化するのですが
これは当然なのでしょうか?
ちなみにパラレルリージョン内を並列化しても1CPUのときより10%くらい悪いです。
環境はOSはRHEL、インテルのfortranコンパイラです。
0121デフォルトの名無しさん
2007/09/19(水) 23:54:02スレッド生成・消滅のオーバーヘッドは思いのほか大きい
$omp parallel 〜 $omp end parallel
が極めて複数回呼ばれる場合にパフォーマンスは非常に落ちる
ネストループ内部、100万回呼ばれるルーチン内など
シングルの作業内容をマルチ対応にするのは面倒ですね。
gprof等でタイムクリティカルな部分を探し、手を入れてみましょう
0122デフォルトの名無しさん
2007/09/20(木) 08:22:47逐次計算のたびにパラレルリージョンから出入りするオーバーヘッドを避けるために
使ったりするのが普通だと思う。
単にパラレルリージョンを指定しただけでは並列化による時間短縮はまったく起こらない。
並列化のオーバーヘッドがかかるだけ。
ループを並列化するとか、パラレルリージョンの中でデータ並列なりタスク並列の計算をするとかしないと。
一番大事なことはアルゴリズム中の並列性を見出すことかと。
並列性のない逐次アルゴリズムだとどうあがいてもパフォーマンスは出ない。
0123120
2007/09/21(金) 00:15:35かなり大きな配列を含む範囲を
単にパラレルリージョンに指定しただけのプログラムは
1CPUのときの1/3程度まで低下すると言う現象がありました。
(並列化を指定すると4CPUで3.8倍程度にちゃんとなりました)
同じ動作をするスレッドが複数あってメモリが競合してるんですかね?
あしたスレッドチェッカーの体験版でも落として調べてみます。
>>121
今日試してみたところうちの環境では
100000回ループするプログラムの内と外に
$omp parallel 〜 $omp end parallel
をおいたプログラムをそれぞれ比較したのですがほとんど差はありませんでした。
リージョン内は簡単な内容だったのですが、
リージョン内のプログラムの内容によってもスレッド生成・消滅のオーバーヘッドは変わってくるんですかね?
>>122
並列化の指定をする前にまず並列化予定の範囲をパラレルリージョン指定して
ちゃんと動くのかを確認したかったのです。
長文失礼
0124デフォルトの名無しさん
2007/10/10(水) 15:20:28自分でどのスレッドに割り当てる的な事は
できないのでしょうか?
0125120
2007/10/25(木) 21:51:43元となったプログラムが古いものだったので、配列をallocateするのではなく
メインの宣言でかなり大きくとっていたのですが、
それを必要量にしたところかなり早くなりました。
ただ強い最適化(fastオプションとか)つけると
OpenMPはそんなにスピードが上がらずシングルスレッドに追いつかれてしまうんですけどね。
0126デフォルトの名無しさん
2007/11/30(金) 04:25:29OpenMPは従来の(OSなどに付属した)スレッドのライブラリの
置き換えとしては使用すべきではないのでしょうか?
(どこかで逐次プログラムの並列化がOpenMPの利用の前提であるとか見たのですが、)
並列で動くことが前提であるプログラム(例:HTTPデーモンなど)を
OpenMPを使って書こうと思っているのですが、止めたほうがいいのでしょうか・・・。
0127126
2007/11/30(金) 04:26:290128デフォルトの名無しさん
2007/12/01(土) 01:58:56複数のスレッドで並列化するのに向いている希ガス。つまりデータ並列向き。
データ並列性のある for 文で書かれたアルゴリズム(行列ベクトル積とか
画像のしきい値処理とか)は parallel for ディレクティブでいとも簡単に並列化できる。
そこが OpenMP のおいしいところ。
タスク並列の並列プログラム、つまり各スレッドが独立に違う処理をする
(例えばそれぞれ別のクライアントからの要求を処理する)並列プログラムも
OpenMP で書けるけど、あまりうまみがないと思われ。
逐次プログラムを並列化するのが前提というのは違う気がする。
ただ、例えば parallel for ディレクティブしか使ってない並列プログラムは
コンパイラの OpenMP 機能をオフにすれば逐次プログラムとしてコンパイルできる。
そこが他の並列化手法(POSIXスレッドとかMPIとか)と違うところ。
でも、OpenMP機能をオフにするとコンパイル不能になる並列プログラムも書けるし、
parallel sections を使ったプログラムは逐次プログラムとしてコンパイルはできても
意味が変わってしまう(各セクションが順番に逐次実行される)。
つまり、この手のプログラムは並列で動くことが前提で書くわけだ。
結局のところ、OpenMP を使うのが妥当かどうかは126さんがやりたいことに依る。
並列性の高いデータ並列の計算をやりたいなら使う価値がある。
0129デフォルトの名無しさん
2007/12/01(土) 02:04:37http://www.nic.uoregon.edu/iwomp2005/Papers/f35.pdf
俺は詳しく読んでないので内容についてはノーコメント。参考までに。
0130デフォルトの名無しさん
2007/12/01(土) 13:39:21普通のWindowsプログラムでCreateThreadをOpenMPで置き換えろって言われたら・・・
メッセージポンプ使ってなんとかなるんだろうか
0131デフォルトの名無しさん
2007/12/01(土) 23:44:51kwsk
0132126
2007/12/03(月) 05:18:50字句上は単なるスコープにしか見えないので、出来そう・・・しかし出来ないもどかしさ(何)。
>>128
ご返答ありがとうございます。
128氏から頂いた意見も考慮に入れつつ、色々と検討してみた結果、
今回やりたいことにはOpenMPは適していない、という判断に至りました。
しかし実験的にHTTPサーバらしきものをOpenMPを使って書いてみたところ、
簡単なものならかなり簡潔に書けることも分かり、、全てでなくとも部分的にOpenMPを使うのもありかと思えました。
0133デフォルトの名無しさん
2007/12/05(水) 05:51:33VC2005ExpressEditionで使えるようになったはいいんだけど
forループの所に
#pragma omp parallel for
ってやっても
error C3005: ';' : OpenMP 'parallel' ディレクティブでは予期しないトークンです
とかいうエラーが発生して使えないんだけど何故なの??
#pragma omp parallel sections
とか他のは通るけど,forループのだけどうしても使えん・・・
#pragma omp parallel
{
#pragma omp for
・・・
}
にすると
error C3001: 'if' : OpenMP ディレクティブ名が必要です
って言われる
0134デフォルトの名無しさん
2007/12/17(月) 18:47:08#pragma .. の行末に ';' がついてるとかいうオチだったら素っ裸で町内1周してこい
0135デフォルトの名無しさん
2008/01/04(金) 15:12:19#pragma omp for
for(int i=0;i<100000;i++)
{
func(i);
}
0136デフォルトの名無しさん
2008/01/04(金) 15:53:58func()の定義が別ファイルでもおk
0137デフォルトの名無しさん
2008/01/04(金) 16:38:48ありがとうです。
OpenMPはSMPで使う分にはかなり便利ですね。
0138sage
2008/02/06(水) 21:13:32サブルーチン内で並列化領域をつくるのと
サブルーチンごとメインに展開して並列化領域つくるのとで
並列化時の速度が異なったり(逐次だとほぼ一緒)
逐次計算部分にある並列化と関係ないサブルーチンを
コメントアウトするかしないかで並列化時の速度向上が変わります。
並列スレッドのスタックサイズとかの問題なんでしょうかね。
0139デフォルトの名無しさん
2008/02/06(水) 22:02:550140デフォルトの名無しさん
2008/02/07(木) 00:50:560141デフォルトの名無しさん
2008/02/13(水) 15:49:52VCOMPD.libはどこで手に入りますか?
0142デフォルトの名無しさん
2008/02/13(水) 16:40:58VS2005だとPro版以上でサポート。VS2008も同じだと思う。
0143デフォルトの名無しさん
2008/02/13(水) 20:12:04vcompd.libはProfessional版以外手に入れる方法はない。
ただしリリースビルド版のライブラリであるvcomp.libは
Windows Server 2008 SDKをインストールするとゲットできる。
デバッグビルドでもリリースビルドのライブラリ(vcomp.lib)を
リンクする設定にするとExpressでもOpenMPが自由に使用可能。
0144デフォルトの名無しさん
2008/02/15(金) 14:05:13while(1)
#pragma omp parallel sections
{
#pragma omp section
read後その処理
#pragma omp section
write後その処理
}
で、ここで、暗黙のwaitがかかると思われるが、select的な使い方って、出来る?
sectionの跡にnowaitをいれといたらよいだけ?
0145デフォルトの名無しさん
2008/02/15(金) 14:26:50それとも、並列実行するところはすべて子スレッドで、実行中のスレッド数が最大より1少なくなった時点で
メインスレッドが継続されるのでしょうか?
0146デフォルトの名無しさん
2008/02/15(金) 16:42:54しかし、openmp(のsections)では、スレッドは、死にますか?
一応、処理が終われば、lockが外れるだけでしょう(gccの実装ではそのようです)
0147sage
2008/03/01(土) 00:47:47あのREGIONS VIEWの各リージョンの範囲はなにで決まってるの?
同期から同期の間かと思ってたんだけどソースの位置みるとちがうっぽい。
最適化オプションのせいでソースとの対応がとれなくなってるのかしらん。
0148138
2008/03/04(火) 19:19:48OpenMPにすると凄まじく増えているのが原因のようでした。
関数に引き渡す配列が多すぎなのか。
0149デフォルトの名無しさん
2008/04/06(日) 10:57:30私もintel fortran10+mkl+openmpで数値計算しています
openmp初心者の私は、intelのopenmpのドキュメントを参考にしました。
parallel do ,sections ,reduction,privateあたりしか使っていませんが、オリジナルの
プログラムのマルチスレッド化は割と簡単に出来、計算時間も「ほぼ」スレッド数倍
にできました。
(当然ですがparallel region部分です。プログラム全体ではありません)
そもそもchkstkは並列処理できるかどうかを検討してはどうですか。
各スレッドで相互参照するのであれば、reduction宣言等が適切であれば問題ないはず。
0150デフォルトの名無しさん
2008/04/09(水) 22:52:21関数のエントリ近辺で chkstk が呼び出され、必要に応じてスタックが拡張される
(実メモリが割り当てられる)わけですが、シングルスレッドの場合は一度拡張された
スタックはもちろん再利用されるので負荷が軽いわけです。
スタックはリニアなアドレスに(ページング機構を用いて)メモリを割り当てる必要があるため、
割り当てられたページを再利用できない場合には時としてヒープよりも確保・解放が重い
メモリとなります。マルチスレッドでスタックが頻繁に成長するような場合には、メモリを
スタック上に取るのをやめて、std::vector などを用いてヒープから確保した方がよいと
思います。
たどたどしい説明になってしまった。
0151デフォルトの名無しさん
2008/05/12(月) 19:46:23・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 じゃ使えねーってハナシになるんですが・・・・
0152デフォルトの名無しさん
2008/05/19(月) 17:00:29Windows Server 2008 SDKにvcompd.libも入ってるみたい。
0153デフォルトの名無しさん
2008/07/19(土) 15:25:36makeしてインストールしたgccを利用すると#include <omp.h>で
ファイルが無いと言われて困ってます。
gcc-4.3.1\libgomp\omp.h.in
は存在するのですが、どうすればいいのでしょう?configureは
./configure --enable-threads=win32 --with-system-zlib で行いました。
0154デフォルトの名無しさん
2008/07/19(土) 15:30:420155デフォルトの名無しさん
2008/07/19(土) 16:30:35MinGW用の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)
参考までに。
0156デフォルトの名無しさん
2008/08/29(金) 10:56:030157デフォルトの名無しさん
2008/08/29(金) 13:00:28俺はスレッド数を取得して解決した気がする。
大雑把に書くとこんな感じ。
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_);
}
}
0158デフォルトの名無しさん
2008/08/30(土) 07:56:40------------- 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
----------------------------------------------
0159デフォルトの名無しさん
2008/08/30(土) 14:04:15> reductionにminやmaxは無いんだよな
あれ、あったと思うけど・・・。
reduction(min:unko)
とか。Fortran でしか使ったこと無いけど。
でもどのアドレスでminだったか、とかを取得したいときは
結局 shared にしちゃうんだけどね。
0160デフォルトの名無しさん
2008/08/30(土) 14:19:320161159
2008/08/30(土) 17:17:59そうなんだ。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でコンパイルしてもちゃんと動く・・・はず。
0162159
2008/08/30(土) 17:19:440163デフォルトの名無しさん
2008/09/04(木) 22:56:210164デフォルトの名無しさん
2008/09/07(日) 13:20:49ifortは出来た気がする。
0165デフォルトの名無しさん
2008/09/07(日) 13:26:10#pragma omp parallel for
てなにが違うの?
0166デフォルトの名無しさん
2008/09/07(日) 17:53:44parallelブロックにforブロックが1つのことも多いので
#pragma omp parallel for でまとめて書けるようにしてある。
0167デフォルトの名無しさん
2008/09/09(火) 22:58:560168デフォルトの名無しさん
2008/09/16(火) 07:09:33スレチな質問で申し訳ないのだけど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には入ってくれません…
0169デフォルトの名無しさん
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;
}
}
}
}
0170デフォルトの名無しさん
2009/01/21(水) 14:08:01get_randum_number
で配列dataにはいる乱数が変わるからじゃね?
たぶん呼ばれる順番が並列と1CPUのときで違うだろうから。
ループ内で乱数つくらないで、でかい乱数用の2次元配列
data0[KURIKAWSIKAISUU][ITIDONIERAZUKAZU]
をループが始まる前に「並列処理しないで」作ってから
(配列data0をshared属性付けて)ループ処理するといいかも。
計算は遅くなりそうだけどね。
0171デフォルトの名無しさん
2009/01/21(水) 14:12:47for (i=.....){data[i]=data0[j][i];}
と乱数値の複製に置き換える、と。
0172169
2009/01/26(月) 11:03:50>171
ありがとうございます。
いただいた意見を参考に修正し、できたらご報告します。
0173デフォルトの名無しさん
2009/01/26(月) 11:33:590174デフォルトの名無しさん
2009/01/26(月) 12:52:370175デフォルトの名無しさん
2009/02/24(火) 20:57:22かどうか判然としません。/proc/cpuinfo で cpufamily 6, model
23 (Harpertown と呼ぶらしい)と表示されるXEONでは確かに速くなるので
すが、cpufamily 15 model 4 (Nocona と呼ぶらしい) では非常に遅くな
ります。これは正しい振る舞いでしょうか。時間は
clock()/CLOCKS_PER_SEC; で測っていますが、これで正しい判断ができる
のでしょうか? 並列化すれば速くなる速度のネックになっている部分を
探す方法はあるのでしょうか? 並列化できるかどうか判然としない部分
を並列化可能なコードに書き直してくれるようなソフトはないでしょうか?
0176デフォルトの名無しさん
2009/02/24(火) 23:13:220177デフォルトの名無しさん
2009/02/25(水) 00:35:19processor : 0
..
processor : 3
vendor_id : GenuineIntel
cpu family : 15
model : 4
model name : Intel(R) Xeon(TM) CPU 3.80GHz
stepping : 3
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
lm constant_tsc pebs bts nopl pni monitor ds_cpl est tm2 cid cx16 xtpr
となっています
0178デフォルトの名無しさん
2009/02/25(水) 23:58:19明示的に指定しないと環境によってスレッド数が1になったりコア数になったりします。
きちんと並列実行できているのに 4-way Nocona で並列性能が出ないとすると
応用依存の問題かと。例えばメモリ帯域幅がネックになっているのかも知れません
(Harpertown ではメモリ帯域幅が足りていて Nocona では足りていないとか)。
どういう計算をしているのかを書くともっと直接的なアドバイスが得られるかもです。
計時の仕方はそれでいいと思います。精度が気になるなら RDTSC について調べると良さげ。
速度のネックになっている部分は、皆目見当がつかないならプロファイラが利用できます。
GCC なら -pg オプション付きでコンパイル、プログラム実行後に gprof コマンドを使って
統計情報を得ます。
時間のかかっている部分が分かったとしてそれを並列化して高速化できるかは別問題。
OpenMP はループを分割して並列化するのがお手軽で効果的ですが、
それができるのはループ間にデータの依存関係がない場合です。
a[i] += a[i-1] のように前後の反復の計算結果を利用したり、
配列の同じ要素に書き込むといった処理がデータ依存性の典型例です。
データ依存関係がある場合はコードを書き換えないと普通は並列化できません。
このあたりは並列プログラミングの普遍的な課題で、対策はケースバイケースです。
自動並列化は研究レベルではよく聞きますが実用的なツールは寡聞にして知りません。
よい自動並列化ツールがあれば私も試してみたいです。
0179デフォルトの名無しさん
2009/02/26(木) 01:53:54実際のコードでどれだけ役に立つかは使ったことが無いのでわからない
0180デフォルトの名無しさん
2009/03/07(土) 23:30:29全然速くなりません。むしろ遅くなっています。実行方法やコードが間違っているのでしょうか?
gcc version 4.3.2 (Debian 4.3.2-1.1)
$ gfortran -fopenmp test.o -o test_omp.out
$ time ./test_omp.out
real 9m14.642s
user 3m51.902s
sys 4m22.468s
$ gfortran test.o -o test.out
$ time ./test.out
real 1m15.142s
user 1m14.809s
sys 0m0.340s
CPUは...(/proc/cpuinfoの抜粋)
model name : Intel(R) Pentium(R) D CPU 2.80GHz
cpu MHz : 2793.101
cache size : 1024 KB
cpu cores : 2
0181180
2009/03/07(土) 23:32:33module ompParam
use omp_lib
implicit none
!integer :: OMP_GET_NUM_THREADS
!integer :: OMP_GET_THREAD_NUM
integer :: myid ! thread ID
end module ompParam
program variation !(coeff, NUM)
!$ use ompParam
implicit none
integer :: i, j, k
integer :: maxI=1000, maxJ=100, maxK=1000
integer :: NUM
double precision, allocatable :: coeff(:,:)
double precision :: alpha ! random number
NUM=1000
allocate( coeff(NUM, maxK) )
coeff(:,:) = 0.0d0
0182180
2009/03/07(土) 23:33:54!$omp parallel num_threads(2) private(myid, i, j, k, alpha)
!$ !myid = OMP_GET_THREAD_NUM()
!$ !write(*,*) '(Number of threads in front of do)=', myid
open(unit=100, file='data.bin', form='unformatted', status='unknown')
!$OMP DO
do k = 1, maxK
do j = 1, NUM
do i = 1, maxI
call RANDOM_NUMBER( alpha )
coeff(j,k) = coeff(j,k) + alpha
!$ !myid = OMP_GET_THREAD_NUM()
!$ !write(*,'(3(A4,I3),A37,I2)') 'k=', k, 'j=',j, 'i=', i, 'Number of threads at the end of do:', myid
end do
coeff(j,k) = coeff(j,k) / maxI
write(100) coeff(j,k)
end do
end do
!$omp master
!$ !myid = OMP_GET_THREAD_NUM()
!$ !write(*,*) '(Number of threads after the do)=', myid
!$omp end master
!$omp end parallel
end program variation
0183デフォルトの名無しさん
2009/03/08(日) 14:53:53環境変数で使うCPUの数を指定してみて。
setenv OMP_THREAD_NUM 2
とか。プログラム内で明示しているからいらない気もするけど、まあ
正確にはマニュアルで確認してね。
あとは、I/O(read,write文)はparallel文の外で
するのが吉。この例だと、open(100,....) と write(100)....は
!$omp end parallel
の後でする。ふつうI/OはプライマリのCPUが単独で担当させる方が安全。
同じファイルに複数のプロセスが書き込みしようとすると
順序の保証が無くなるのであとで使いにくいし、書き込みの順番待ちが
発生するのでのろくなる。
乱数代入のループだけなら1/2になっている可能性大。そうなら
作ったコードは一応OpenMPとして動作している・・・と思う。
0184180
2009/03/09(月) 17:16:44ありがとうございます。実行シェルは作らず、そのまま
$time ./test_omp.out
という風にやっていました。これから実行シェルを作って見ようと思います。
あと、i/oを外に書いたら、確かに一割ほど速くなりました。
でも、それでも圧倒的にOpenMPは遅いです...
0185180
2009/03/09(月) 17:18:47~/test$ /bin/csh ./testOMP_exec.sh
Normal version executing...
2.2u 0.0s 0:02.20 100.4% 0+0k 0+1584io 0pf+0w
OpenMP version executing...
2.1u 0.0s 0:01.14 190.3% 0+0k 0+1584io 0pf+0w
資源使用率190%!!乱数発生器がパラレルに対応していなかったようです。
アドバイス、ありがとうございました。
0186183
2009/03/10(火) 04:04:33乱数生成って種を使いまわすから、並列のときは最初に疑うべきだったね。
あまり役に立たなかったっぽいけど、
とりあえず、おめでとう。
0187デフォルトの名無しさん
2009/04/19(日) 07:32:44#pragma omp for
でループを分割してもompを使わないときと差が出ないのですが
もしかしてループの外の資源にアクセスするとき、各スレッドは
排他制御してるってことなんでしょうか。
SSEとかで要素に演算を加えてるだけなんですけど・・・
外から渡された配列とか、mallocしたメモリとか、分割して処理
したいんですが、どこをどういじると改善されるのでしょう?
0188デフォルトの名無しさん
2009/04/19(日) 09:11:48確認だけど #pragma omp for を parallel リージョンで囲んでる?
もし囲んでないなら #pragma omp parallel for としないと並列化されないよ。
0189デフォルトの名無しさん
2009/04/19(日) 10:08:48はい、それはやってます。
中でスレッド数を確認するときちんとコア数分表示されます。
0190デフォルトの名無しさん
2009/04/28(火) 10:36:42外からのメモリは問題ないと思うけど。
ループ間の依存関係がないか、I/Oなど想定外の依存関係がないか、要チェックで。
0191デフォルトの名無しさん
2009/05/08(金) 04:21:24GCCの方がICCよりも圧倒的に速いのですが、こんなことはよくあるのですか?
ちなみにOptionは
GCC(4.3.2): -O3 -fopenmp -funroll-loops
ICC(11.0.0): -O3 -openmp -openmp -openmp-lib compat
コードはこんな感じのがいくつもあります。
GCCでうひょ早っ!と思ったので、ICCならもっとと思ったのですが、
そうならないのがびっくりです。何かいけないことはありそうでしょうか?
一応どちらも並列化はされており、CPU使用率はほぼ100%になっています。
void func(void){
7 int i,j,k;
8 unsigned char index_x;
9 #pragma omp parallel for private(i,j,k,index_x)
10 for(i=0;i<XS-1;i++){
11 for(j=1;j<YS-1;j++){
12 for(k=1;k<ZS-1;k++){
13
14 index_x = IDX[i][j][k];
15
16 AX[i][j][k] = CX[index_x]*AX[i][j][k]
17 + CLY[index_x]*(BZ[i][j][k]-BZ[i][j-1][k])
18 - CLZ[index_x]*(BY[i][j][k]-BY[i][j][k-1]);
19 }
20 }
21 }
22 }
0192デフォルトの名無しさん
2009/05/08(金) 04:25:11ちなみにCorei7 965での話です。
0193デフォルトの名無しさん
2009/05/08(金) 09:10:20>何かいけないことはありそうでしょうか?
・オプション指定辺り。
・時間の計測方法。
見たところ、gccにはunrollのヒントを与えているのにiccには与えていないように見える。
icc11が標準でunrollしたかどうか、記憶していないが影響があるかも知らん。
それと、gccでもiccでも言えることだがソース全部を見ないことには細かいことは判らん。
例えば、icc -fastでOpenMPを使わない場合の所要時間を測ってみてはどうだろう。
いずれにしても、iccスレ向きのネタになりそうだが。
0194デフォルトの名無しさん
2009/05/08(金) 12:03:19ifortだと-O2以上でunrollingはするけどiccだとどうなんだろう。
0195,,・´∀`・,,)っ-○○○
2009/05/08(金) 23:49:120196デフォルトの名無しさん
2009/05/09(土) 04:30:16ってかえって遅くなること無い?
コードにもよるだろうけど自分のはかえって遅くなるから切ってる
0197デフォルトの名無しさん
2009/05/09(土) 07:47:19iccは結構高いので、かなりガッカリしてます。orz...
0198,,・´∀`・,,)っ-○○○
2009/05/09(土) 11:34:06SIMD化されてないように思えるのだが
kをOMPによる並列化対象から外して-QxSSE4.2とかってのはどう?
たしかSIMD化とスレッド化は両立できなかったような
0199デフォルトの名無しさん
2009/05/10(日) 05:00:400200デフォルトの名無しさん
2009/05/10(日) 05:09:57191の例だとcx,cly,clzの要素を参照するときに干渉が起こってそう。
たぶん一次元でそんなに大きくない配列だろうから、添字iとjのループの間で
この3変数をコピーしてみてはどうだろうか?
localcx[n]=cx[n]...みたいな。んでlocalcx, localcly...はprivate属性を付ける。
並列で無い場合には余計な動作だからかえって遅くなりそうだが。
gccはそこをうまくさばいているのかもしれないな。
>>198
お団子ありがとうw
おそらく添字kのループはunrollingの対象になるから、
そのままprivateな並列対象のままで良い気もするけどどうだろう?
0201デフォルトの名無しさん
2009/05/10(日) 05:13:51CLY[index_x]=CLY[(IDX[i][j][k])]なんだから、
CLY[i][j][k] で表現できると思うんだけど。
暴力的ないい方だけど今ってメモリが青天井に近いから
係数の3次元配列つくってもいいんじゃないかな?
いずれにしてもコードいじるからなあ・・・。gccで幸せならそのまま、という手も。
0202デフォルトの名無しさん
2009/05/10(日) 21:24:420203デフォルトの名無しさん
2009/05/11(月) 16:23:48ぷろぷらICCなんか最初からいらんかったんや!
0204デフォルトの名無しさん
2009/05/12(火) 09:56:25後はあれだ、MKLのOpenMP対応は生半可じゃなくリニアリティが高い(投入コア数とパフォーマンスがよく比例する)。
0205デフォルトの名無しさん
2009/05/12(火) 10:55:45経験的には32個過ぎるあたりからだんだん悪くなる(64CPUでだいたい48CPU相当)けどまあしょうがないか。
それ以上を厳しく要求される計算だとたぶんMPIと自前のソルバの組み合わせになってしまうのかも
しれないけど、まあ普段の用途には16か32倍も出れば御の字だろう。
0206デフォルトの名無しさん
2009/05/12(火) 18:55:41汎用だと4が限界だし
0207デフォルトの名無しさん
2009/05/12(火) 19:02:43# さすがに16とか32は見たことがない……
0208デフォルトの名無しさん
2009/05/12(火) 19:13:110209205
2009/05/13(水) 02:45:20ふだんは 4core x 2 ですね。Xeon 8コアで、ちと古いItanium16個相当のパフォーマンスは出るので。
0210デフォルトの名無しさん
2009/05/14(木) 01:08:55>>191です。
CLY[index_x]=CLY[(IDX[i][j][k])]はCLYのサイズが小さいため、
2ndキャッシュにキャッシュさせる目的で使っています。
> いずれにしてもコードいじるからなあ・・・。gccで幸せならそのまま、という手も。
これでコードをいじって30%くらい速くなるならやる価値はありそうですが、
おそらくそこまで行くような感じではないように思われます。
あと、GCCでもバージョンによって速さが違いますし、OSが32bitや64bitでも違いました。
「このコンパイラを使えばどの環境でも速くなる!」と言うのはないですかね。
0211デフォルトの名無しさん
2009/05/14(木) 02:01:540212デフォルトの名無しさん
2009/05/14(木) 09:53:37VTuneは使っている? そのくらいシビアな話なら動的解析してみると何か分かるかもよ。
0213デフォルトの名無しさん
2009/05/15(金) 01:38:09C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP\vcomp90d.dll
というファイルが入ってる。これ使えるの?
0214デフォルトの名無しさん
2009/05/15(金) 02:44:45非構造格子の格子形状の情報が格納されてるのかな?
それだとidx配列で引くのが不利より有理な点が多そうだね。
だったら200みたいにループの始めでクローン作ったほうがいいかも。
コードもそんなにいじらないだろうし。
>>213
ディレクトリは忘れたけど、その名前のダイナミックリンクライブラリは
使った記憶がある。どういう使いかただったかは忘れた・・・。
0215デフォルトの名無しさん
2009/05/21(木) 22:25:36OpenMPってこれから並列プログラミングのスタンダードになっていくのかね
MPI+OpenMPのクラスタなんてなかなかだな、環境とプログラムの内容によっちゃあ
0216デフォルトの名無しさん
2009/05/22(金) 06:56:43OpenMP相当の事は自動並列かなりできるようだしMPI主体が大〜中規模計算の主流で、
マルチ・コアCPUが1〜2個くらいのシステムでお手軽並列が
これからのOpenMPの使いかたになるのではと勝手に予想するw
というかsgiが飛んだり、SUNがソフト屋に買収されたりNECが断念したりで今後のトレンドが読めんね。
0217213
2009/06/02(火) 23:51:25デバッグビルドでも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
0218デフォルトの名無しさん
2009/06/23(火) 01:54:45どうしようクアッドコアにしようか
0219デフォルトの名無しさん
2009/06/23(火) 08:01:00追加されるみたいだけどOpenMPとの住み分けはどうなるんだろう。
0220デフォルトの名無しさん
2009/06/25(木) 06:30:55オプションはシェフお薦めの
ifort -fast -openmp
だけ。だいたい30%くらい速いようだ。コードにもよるだろうけど、いいね。
というか今までのはなんだったんだw
関係ないけどversion 8は挙動が変だ。なんじゃありゃ。
0221デフォルトの名無しさん
2009/06/25(木) 06:31:450222デフォルトの名無しさん
2009/06/25(木) 21:51:200223デフォルトの名無しさん
2009/09/11(金) 06:51:07同じ結果を得るようにするにはどうしたらよいでしょうか?
0224デフォルトの名無しさん
2009/09/11(金) 08:54:45スレッドセーフな擬似乱数生成器を使う。
0225デフォルトの名無しさん
2009/09/11(金) 15:00:320226デフォルトの名無しさん
2009/09/12(土) 04:34:20kwsk
0227デフォルトの名無しさん
2009/09/12(土) 04:42:350228デフォルトの名無しさん
2009/09/12(土) 04:51:43ループで使う分の乱数を先にテーブルにでも入れておいたら?
0229デフォルトの名無しさん
2009/09/12(土) 08:18:27OpenMPの意味ないじゃん
0230デフォルトの名無しさん
2009/09/12(土) 08:41:320231デフォルトの名無しさん
2009/09/12(土) 08:43:260232デフォルトの名無しさん
2009/09/12(土) 08:48:35>>223の原因はそれだけじゃないとおもうYO
0233デフォルトの名無しさん
2009/09/12(土) 08:49:300234デフォルトの名無しさん
2009/09/12(土) 11:14:56一方、randは内部の状態を保存する変数に各スレッドからどの順序でアクセスされるかによって
結果が変わってくるので、スレッドアウト。
0235デフォルトの名無しさん
2009/09/12(土) 17:00:440236デフォルトの名無しさん
2009/09/12(土) 18:47:260237デフォルトの名無しさん
2009/09/15(火) 01:13:350238デフォルトの名無しさん
2009/09/19(土) 05:24:10使っているのは、omp parallel forだけです。
0239デフォルトの名無しさん
2009/09/19(土) 07:46:38ごくごく一般的に・・・
CPU/Core数が増えるとMPIが早い。OpenMPは効率が頭打ちする。なのでまあ当然ともいえる。
FirstTouchポリシー採用のシステムでは初期化ループで大まかな役割分担を教えてあげないとOpenMPはのろい。
OpenMPで一個でもShareかPrivateかを間違えるor書き忘れると途端に遅くなること有。
一次元配列の分割計算の場合、OpenMPだとUnrollingを抑制するコンパイラも多いのでそうなると結構遅くなる。
・・・などなど。
まあ、OpenMPはお手軽だから中規模な計算がメインな自分は頻繁に使うけど、
カリカリにチューンしたいとか大規模計算になるとMPIのほうが良いよ。
0240デフォルトの名無しさん
2009/09/19(土) 09:35:410241デフォルトの名無しさん
2009/09/19(土) 21:15:35実際はもっともっと複雑なんだけど、イメージ的には下のような感じで
ループの外で共有の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)
{ /* メインの処理 */ }
}
0242デフォルトの名無しさん
2009/09/19(土) 21:20:22あとparallel forの中でbarrierやsingleが使用出来ないというのは
コンパイラがハネるという意味です。
OpenMPの仕様を読んでも使えないように読めます。
0243デフォルトの名無しさん
2009/09/20(日) 00:25:20変数 tlb をスレッド間で共有しているのが問題なので、
a) tlb の定義を外側ループの中に移すか、
b) tlb の定義を tlb[スレッド数][q] に変えてスレッドごとに違う tlb[スレッド番号][i] を使う。
0244デフォルトの名無しさん
2009/09/20(日) 11:09:00最初に書いた通り、無論その解決策は理解している上で
tlbのサイズと生成コストの理由から出来れば共有したい、
というのが今回の質問なのですが、OpenMPでは簡単には解決出来ないのでしょうか。
なんでbarrierがforの中で使えないんだろう。
0245デフォルトの名無しさん
2009/09/20(日) 11:23:57たとえばj=0とj=1が同時に存在するよね
にも拘らずtlbを複数用意したくないというのは
tlb[i] = foo(i,0), tlb[i] = foo(i,1)
俺にはついていけない世界だ…
0246デフォルトの名無しさん
2009/09/21(月) 08:22:43ああそうか!
なんて凡ミス、ありがとうございました。
0247デフォルトの名無しさん
2009/09/23(水) 01:18:05なんか変数を各スレッドで共有しているんじゃない?
OpenMPも結構考えないとパフォーマンスは伸びないし、
CPUの利用率も高くなってしまう。
同一マシン上でMPIよりも遅くなるのは考えにくいなあ。
ただ、MPIだと明示的にスレッドを分割しているのに対して、
OpenMPはコンパイラ依存だからね。そういったこともあり得るかも。
0248デフォルトの名無しさん
2009/09/24(木) 23:57:35OpenMPを有効にするとコンパイラ最適化がきかなくなる(・・・というコンパイラが多い)
0249デフォルトの名無しさん
2009/09/25(金) 07:43:37http://olab.is.s.u-tokyo.ac.jp/~reiji/openmp.html
0250デフォルトの名無しさん
2009/10/06(火) 22:47:29for(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分使っているけど、こういう場合はどうすればいいの?
0251デフォルトの名無しさん
2009/10/07(水) 04:35:58gotoを取り除く
0252デフォルトの名無しさん
2009/10/10(土) 03:19:26並列化してると、途中で終了するのも最後までやるのも計算コストはかわらんし。
マスクの部分は
if((p=getPoint()) /= N){ごにょ} か if((p=getPoint()) < N){ごにょ}
にする・・・とかかな。
0253デフォルトの名無しさん
2009/10/29(木) 11:34:56岡田外務大臣キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
http://qb5.2ch.net/test/read.cgi/saku2ch/1256630318/1
早く記念カキコしないと埋まっちゃうwww
0254デフォルトの名無しさん
2009/11/21(土) 02:59:220255デフォルトの名無しさん
2009/11/23(月) 17:05:30返事遅れてごめん。ありがとう。
0256デフォルトの名無しさん
2009/11/23(月) 17:07:10なるほど。ありがとう。
0257デフォルトの名無しさん
2010/01/10(日) 02:26:13たぶん共有変数の設定を間違って、書き込んではいけない変数に書き込みが発生してしまったのだと思うのですが、
どう直したらいいのかわかりません。
分かることがあれば教えて下さい。
[並列化したソースコード]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
0258デフォルトの名無しさん
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
0259デフォルトの名無しさん
2010/01/11(月) 10:56:24privateもsharedも消してdefault(private)にしてみたらいいと思う。
あと基本的な質問だけど
「!$OMP parallel do」ではなくて
「!$OMP parallel」と「!$OMP do」
に分かれている必要性ってあるの?
parallelとdoを分ける文法を普段使わないから挙動が分からないんだけれど、
iのループが分担されずに-(maxGrid-1)から(maxGrid-1)のまま8つ生成されて、
jのループが分担されているのに1つのloss_timeを共有してそうな気がするんだけれど。
0260デフォルトの名無しさん
2010/01/12(火) 06:07:010261デフォルトの名無しさん
2010/01/14(木) 00:21:27default(private)ではコンパイルは通っても、計算は動きませんでした。
(逐次領域→parallel領域で値が引き継がれないことが原因?)
なので、全ての変数をfirstprivateでやってみましたが、やはり間違った結果になりました。
!$OMP parallel doでiのループを並列化しても同じでした。
サブルーチンsubは、iやjによって計算時間が最大10000倍程度違うので、
iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。
>jのループが分担されているのに1つのloss_timeを共有してそうな
!$OMP parallel
の時点でメモリがスレッド数ぶん確保されるのではないんですか?
0262デフォルトの名無しさん
2010/01/14(木) 04:03:22同じ階層のメイン・副プログラム内でそれ以降全部のdefaultが変わるので面倒くさくなるんだよねぇ。
0263259
2010/01/14(木) 10:33:17> !$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」に設置する必要があると思うんだ。
0264デフォルトの名無しさん
2010/01/17(日) 10:42:45!$OMP parallel
にさしかかった時点ではメモリはいじらないとおもうよ。
全スレッドの同期確認作業(結構時間ペナルティがきつい)をするので
減らせるなら積極的に parallel 文を減らすようにするのがいい、と推奨されてるだけ。
0265デフォルトの名無しさん
2010/01/22(金) 00:19:10#pragma omp parallel for でfor文の中にbreakあるとダメだった気がしたんだけど、
WindowsSDK7.0入れてから久々に使ってみたらbreak入っててもコンパイルエラーにはならなかった。
もともと大丈夫だったっけ?
0266デフォルトの名無しさん
2010/01/28(木) 12:04:56でも、どのシステム&実装でも受け入れてもらえるように
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
とか。
0267デフォルトの名無しさん
2010/01/28(木) 12:06:08int ibreak=0;
は外にだしてね。
0268デフォルトの名無しさん
2010/02/11(木) 04:19:22スレッド数を動的に変化させたい場合はどのようにやるのでしょうか?
#include <omp.h>
int main(){
#pragma omp parallel sections
{
#pragma omp section
{
処理1
}
#pragma omp section
{
処理2
}
:
:
#pragma omp section
{
処理N
}
}
}
0269デフォルトの名無しさん
2010/03/19(金) 17:06:320270デフォルトの名無しさん
2010/03/19(金) 17:35:05/proc/cpuinfo辺り見てなんとかならない?
0271デフォルトの名無しさん
2010/03/20(土) 05:26:30int cpu_num = sysconf(_SC_NPROCESSORS_CONF)
Windowsなら
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
で、sisinfoのdwNumberOfProcessorsメンバの中にはいっている。
ちなみにintな。
0272デフォルトの名無しさん
2010/03/24(水) 08:25:080273デフォルトの名無しさん
2010/03/24(水) 23:12:520274272
2010/03/25(木) 03:13:100275デフォルトの名無しさん
2010/03/30(火) 17:45:37Phenom II X4ですが、5スレッドにしたとたん、全スレッドのパフォーマンスが半分以下(2倍以上時間がかかる)
ようになります。OSはubuntu9.04です。
0276デフォルトの名無しさん
2010/03/30(火) 18:43:55バタバタと戦友たちが倒れていってるんだろうな。
0277デフォルトの名無しさん
2010/03/30(火) 20:04:58どんな仕事でも 5 分割でパラレルになるように区分けできる
天才ってまれにいるけど、 >>275 はそういうタイプ。
0278デフォルトの名無しさん
2010/03/30(火) 21:58:05コンテキスト切り替え(スイッチ)
0279デフォルトの名無しさん
2010/03/31(水) 06:27:338スレッドにすると4のときと同じくらいの時間で終わる・・・かも。
0280デフォルトの名無しさん
2010/03/31(水) 07:36:37当たり前の話だ。各スレッドがリソースを取り合っているんだよ。
物理コアが4つしかないのに、5スレッドが走っているわけだから、
物理コアたちが「俺が行くぞ」「ふざけんな俺が行くんだ!」とか「おまえ行けよ、いやおまえが行けよ」
ということをやっているわけだ。
本来ならセマフォで4スレッドに制限すればよいんだけど、OpenMPではどういう風にやるっけな?
まだ対応していないと思ったけどもしOpenMPでやるなら結構トリッキーな実装になりそうだな。
0281デフォルトの名無しさん
2010/03/31(水) 13:14:085プロのとき、1つのコアが2スレッド分を負担して100%がんばってるけど
ほかの3つが50%しかがんばれない。
がんばらない、じゃなくてがんばれない。同期取るからね。
>>279 のとおり8にすると4コアみんな100%の力を出せるようになる。
0283デフォルトの名無しさん
2010/03/31(水) 15:09:17タダでさえ>>280 の理由で非効率な部分があるんだから・・
taskset dplace のどちらかだろう。なければこれに当たる奴みつけてね。
dplace 後者はSGIのだけの気がするけど自信はない。
0284デフォルトの名無しさん
2010/03/31(水) 15:10:32あまり気にしてなかったので今気になった
0285デフォルトの名無しさん
2010/03/31(水) 16:47:05それでコンテキストスイッチの割合が大きくなりすぎているのでは。
0286デフォルトの名無しさん
2010/03/31(水) 17:09:12for
凄い長い計算
でやって味噌。
0287デフォルトの名無しさん
2010/04/01(木) 03:41:120288デフォルトの名無しさん
2010/04/07(水) 17:43:00とりあえずライセンスファイルのダウンロードして、それをインストールするところまではできたのだけど・・・
ネットワークとかホストとかはどこで設定するの?
0289デフォルトの名無しさん
2010/05/12(水) 05:18:00うちだけ?9.04の時はこんなことはありませんでした。
0290デフォルトの名無しさん
2010/05/12(水) 06:30:330291デフォルトの名無しさん
2010/05/21(金) 11:41:54topコマンドで調べてみれば?
Ubuntuだとbackend
Fedoraだとnautilus
がプロセス1個占有してるようだよ
0292デフォルトの名無しさん
2010/05/23(日) 21:53:46のprivate変数が多いので文字数制限に引っかかって改行しないといけないのですが、
括弧中で改行すると & や!$omp& で繋げてもうまく動きません。
どうやったらいいんでしょうか。PGIコンパイラです。
0293デフォルトの名無しさん
2010/05/23(日) 22:44:30!$omp parallel &
! & do
とかで出来た気がする。
2行目の行頭が!か!$か!$omp かは忘れた。
0294デフォルトの名無しさん
2010/05/31(月) 23:23:36#pragma omp parallel for 文の後の
forループ内でnew演算子使っても計算は保障されるの?
保障されない場合は回避方法はあるの?
0295デフォルトの名無しさん
2010/06/01(火) 00:31:240296デフォルトの名無しさん
2010/06/01(火) 01:58:47ちょっと計算っていうのがわかりにくいが、
要はnewで確保した領域で計算した結果が保証されるのか?
っていう意味なのかな?だとすればyesだろうけど、
atomicを考えるとめんどくさいような気がするなあ。
0297294
2010/06/01(火) 22:42:21コンパイルは通ったんだけど並列化されない
なぜ?
チェックし直して
うまく動いたら改めて書き込みします
0298デフォルトの名無しさん
2010/06/01(火) 23:35:000299デフォルトの名無しさん
2010/06/01(火) 23:45:190300デフォルトの名無しさん
2010/06/02(水) 00:00:300301デフォルトの名無しさん
2010/07/15(木) 01:58:36というかどうなるんだろう?
0302デフォルトの名無しさん
2010/09/12(日) 05:59:150303デフォルトの名無しさん
2011/01/04(火) 02:21:11GCC4.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;
}
0304デフォルトの名無しさん
2011/01/04(火) 09:57:50フラグを使うのはスレッド間の同期に必要なので、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;
}
0305デフォルトの名無しさん
2011/01/05(水) 00:43:11そのやり方はスマートだしちゃんと規格に準拠してるね
正月最後の休みを使って公式にある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
0306デフォルトの名無しさん
2011/02/25(金) 21:14:37.06例えそれが実行されなくとも、性能がガタ落ちになるようだ。理由は不明だが。
0308デフォルトの名無しさん
2011/04/23(土) 16:01:03.61connectよんでからselectで待つのが定石だと思ってたけど
connectが成功を返すまでsleepはさんでコールし続けるってコードを見かけた
これってありなの?
0309デフォルトの名無しさん
2011/04/23(土) 19:20:41.40無し
あり得ない
レスポンスが遅くなるだけ
というか誤爆?
0310デフォルトの名無しさん
2011/04/25(月) 18:50:56.39すまぬ、誤爆したうえ放置してた
0311デフォルトの名無しさん
2011/05/19(木) 08:24:03.850312デフォルトの名無しさん
2011/05/23(月) 11:29:46.68スレッドを幾つ起動するかを、起動してから指定するの?
0313デフォルトの名無しさん
2011/07/01(金) 06:24:21.77速度変わってしまうのですが、原因分かりませんか?
ttp://ideone.com/Yn67n
0314デフォルトの名無しさん
2011/07/01(金) 12:39:39.32環境が判らんからなんとも言えんが、シングルスレッドのループの裏でOpenMPか何かの処理が動いているとか?
ループ前後にsleep入れて様子見てみたらどうだろう。
0315デフォルトの名無しさん
2011/07/01(金) 14:43:07.70なので、裏で走るスレッドの実行時間も加算される
実時間で計測する関数を使うようにしてみればいい
0316313
2011/07/01(金) 15:14:31.88ttp://ideone.com/6g1yy
上記のコードの様に、時間取得用変数にvolatileをつけると並列ループの有無に関わらず
シングルスレッドループの速度が一定となりました。
また、時間計測処理を省いて体感で測ってみましたが、
こちらでも速度が一定な感があります。
(体感の為誤差は確認出来てませんが)
この事から、時間取得とOpenMP有効時の最適化は相性が悪いのではないかと思います。
根本的な解決にはなってませんが、回避策は分かりました、有難うございました。
0317デフォルトの名無しさん
2011/07/01(金) 15:15:14.35>>315そうしてみます、有難うございます。
0318デフォルトの名無しさん
2011/07/17(日) 14:48:54.130319デフォルトの名無しさん
2011/08/11(木) 16:34:58.28「C/C++プログラマーのためのOpenMP並列プログラミング」を買ってしまったんだが、
大まかな部分ってCもfortranも同じなのかな?
0320デフォルトの名無しさん
2011/08/11(木) 19:04:57.300321デフォルトの名無しさん
2011/08/11(木) 23:46:57.30おっけ今から全力でぶん投げてくる
0322デフォルトの名無しさん
2011/08/22(月) 01:58:44.67いや、どうせなら
図書館にでも寄贈してやってくれ
0323デフォルトの名無しさん
2011/08/22(月) 20:50:41.53VCだとMP使うと再頒布可能パッケージが必要だ。
0324デフォルトの名無しさん
2011/08/22(月) 23:49:50.97> 先ほど構成を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使う」ってするだけでできるようにしたらいいと思うんだけど。
(配布時は別途対応するにしても)
0325デフォルトの名無しさん
2011/08/23(火) 01:32:00.61余計なモノをインストールさせるアプリは使わない。
0326デフォルトの名無しさん
2011/08/23(火) 01:56:49.130327デフォルトの名無しさん
2011/08/24(水) 20:10:32.31その記事の筆者名でググって見たほうがよい
0328324
2011/08/24(水) 21:41:49.47ググってみました。
色々言われているみたいですね(汗)
もしOpenMP環境構築についての言及が誤りなら、
もっと正攻的なやり方があるということですね。
もうちと調べてみます。
0329デフォルトの名無しさん
2011/11/01(火) 13:47:35.24外側の関数からラムダ関数に変数を渡すっていうオーバーヘッドが
ありそうだけど、#pragma omp parallel forだとそのへんどうなってるの?
0330デフォルトの名無しさん
2011/11/15(火) 14:04:00.87例えば、
int sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < 100; i++) {
int tmp = i;
tmp++;
sum += tmp;
}
この例では、OpenMP並列化されたループ内で変数iとtmpを宣言していますが、
試してみたところ問題はなさそうです。
iもtmpもスレッドプライベート変数になると思うのですが…。
何か問題があればご教示をお願いいたします。
0331デフォルトの名無しさん
2011/11/15(火) 16:07:23.72Private 扱いの理解で無問題
0332デフォルトの名無しさん
2011/11/15(火) 17:00:59.88ありがとうございます。これで安心して宣言できます。
今まではわざわざループの外で宣言していたので…。
0333デフォルトの名無しさん
2011/11/24(木) 16:58:17.76スレッドが終了してもゴミスレやメモリが残ってしまうようなのですが
これを解放する関数とかありませんか?
0334デフォルトの名無しさん
2011/11/25(金) 08:06:46.80_beginthreadex
0335デフォルトの名無しさん
2011/11/25(金) 12:24:01.62ompはランタイム関数ではないらしい?
■ このスレッドは過去ログ倉庫に格納されています