オフィシャルサイト
http://www.openmp.org/
リンクなどは>>2以下で
OpenMPプログラミング
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
NGNGNGNG
↑
NGNG
産業的な視点から考えて需要はありますか?
NGNG
NULL
5デフォルトの名無しさん
NGNG >>3
ある
ある
NGNG
OpenMPってなに?
NGNG
共有メモリ型の並列計算のためのAPI。
対極にあるのが分散メモリ型のMPI。
いずれも計算用途。
pthreadやMPIより、OpenMPによる並列化ははるかに容易。
ただし共有メモリで並列計算するには、マシンのプロセッサ数が並列数以上でなくてはならない。
つまり、マシンのコストが高い。
対極にあるのが分散メモリ型のMPI。
いずれも計算用途。
pthreadやMPIより、OpenMPによる並列化ははるかに容易。
ただし共有メモリで並列計算するには、マシンのプロセッサ数が並列数以上でなくてはならない。
つまり、マシンのコストが高い。
8デフォルトの名無しさん
NGNG gccにインストールできますか?
NGNG
共有メモリ型のプログラミングって何十台というPCでできるものですか?
NGNG
>>9
( ゚Д゚)ポカーン
( ゚Д゚)ポカーン
NGNG
12デフォルトの名無しさん
NGNG よい入門書があれば教えてください
13デフォルトの名無しさん
05/02/13 04:39:43 初めてのMP
05/02/13 11:25:49
>>12
ドラクエやれ
ドラクエやれ
15デフォルトの名無しさん
05/03/05 03:01:46 OpenMPとMPIどちらを勉強するのが得策ですか?
16デフォルトの名無しさん
05/03/16 15:18:59 >>15
MPI
MPI
17デフォルトの名無しさん
2005/03/29(火) 00:25:37 OpenAL
18デフォルトの名無しさん
2005/03/31(木) 10:59:10 OpenMPとpthreadの違いがわかりません。
効率、可搬性などどちらが優れているのでしょうか?
効率、可搬性などどちらが優れているのでしょうか?
19デフォルトの名無しさん
2005/05/03(火) 17:08:50 Dualコア時代になるのに閑散としてるなこのスレ。
VisualStudio2005betaを使ってるヤツは少ないか。
所詮業務じゃ使えないしな。。
しかしDualコア+HyperThreadで、この年末には
家庭用PCですら4CPUになっちまうのかな。スゲエ。
VisualStudio2005betaを使ってるヤツは少ないか。
所詮業務じゃ使えないしな。。
しかしDualコア+HyperThreadで、この年末には
家庭用PCですら4CPUになっちまうのかな。スゲエ。
20デフォルトの名無しさん
2005/05/06(金) 05:11:22 OpenMPをVCで使う方法を教えてください
21デフォルトの名無しさん
2005/05/06(金) 07:39:0822デフォルトの名無しさん
2005/05/07(土) 11:38:36 >>20
2005β使え。
2005β使え。
23デフォルトの名無しさん
2005/05/14(土) 04:41:12 LinuxでOpenMPを使いたいのですが、gccのほかに何をダウンロードすればよいのでしょうか?
24デフォルトの名無しさん
2005/05/23(月) 08:04:49 OpenMPを使う利点を教えてください
2005/05/24(火) 12:54:36
2005/05/24(火) 20:05:51
共有メモリ型擬似4CPUは、もう普及へ向かっているわけだがw
CELLは分散メモリだからMPIか?
CELLは分散メモリだからMPIか?
2005/06/16(木) 00:42:33
gccに対応したフリーのOpenMPはどこからダウンロードできるのでしょうか?
2005/06/26(日) 17:44:34
29デフォルトの名無しさん
2005/08/11(木) 15:08:40 PentiumD買ったので、手持ちのソフトをOpenMPで並列化しようと思ってる。
尼で見つけた "Parallel Programming in OpenMP" って本の評価はどんなもんですか?
ttp://www.amazon.co.jp/exec/obidos/ASIN/1558606718/250-7296386-2789028
尼で見つけた "Parallel Programming in OpenMP" って本の評価はどんなもんですか?
ttp://www.amazon.co.jp/exec/obidos/ASIN/1558606718/250-7296386-2789028
2005/08/11(木) 16:14:03
2000年の本だと古いんじゃないかなあ。
Intelのサイトで技術PDF探してみては?
Intelのサイトで技術PDF探してみては?
31デフォルトの名無しさん
2005/08/12(金) 01:20:16 >>30
ですよねぇ。こういう方面の技術って、手詰まりなんですかね?
ですよねぇ。こういう方面の技術って、手詰まりなんですかね?
32デフォルトの名無しさん
2005/08/22(月) 04:23:24 OpenMPってpthreadと比較して何が違うのでしょうか?
2005/09/09(金) 21:43:42
逐次プログラムにちょっと書き足すだけで並列に動くお手軽さ。
34デフォルトの名無しさん
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が分割されているってことですか?
#pragma omp parallel for private(j)
for(i=0;i<100;i++)
for(j=0;j<100;j++)
何か演算
とした場合これはiを分割して実行していて
jはローカル変数として分割されたiの中で0〜99まで回してるってことですか?
それともjが分割されているってことですか?
2005/11/09(水) 21:46:22
愛を分割してる方
36デフォルトの名無しさん
2005/11/27(日) 06:12:29 インテルのコンパイラにはOpenMPはついてくるのですか?
2005/11/27(日) 10:56:58
2005/11/27(日) 19:13:26
Sunのソラリス落とせば
OpenMP付のSunのコンパイラも手に入るよ
高性能コンパイラが無料だなんてなあ
OpenMP付のSunのコンパイラも手に入るよ
高性能コンパイラが無料だなんてなあ
2005/12/03(土) 12:29:21
Athlon系は分散メモリだからOpenMP使えないのかな?
40デフォルトの名無しさん
2006/01/30(月) 08:24:142006/01/30(月) 15:18:18
簡単に並列処理を行わせるようにするためのもの?
将来的にはこういうのが普通に使われるようになるかもね。
将来的にはこういうのが普通に使われるようになるかもね。
2006/02/12(日) 01:28:59
GCCも4.2でOpenMP対応するみたいだね。
そしたらいよいよ知名度上がるんじゃないの?
そしたらいよいよ知名度上がるんじゃないの?
2006/02/14(火) 06:14:02
gccがないとOpenMP使えなかった環境てマックくらいじゃない?
Windowsもかな
Windowsもかな
2006/02/14(火) 12:48:54
Intel コンパイラはサポートに熱心だよな。
今度Mac版も出るらしいから、Win、Mac、Linuxどの環境でもGCC、IntelコンパイラでOpenMP
できるようになる鴨。
今度Mac版も出るらしいから、Win、Mac、Linuxどの環境でもGCC、IntelコンパイラでOpenMP
できるようになる鴨。
2006/02/14(火) 21:19:59
46デフォルトの名無しさん
2006/02/17(金) 12:06:20 OpenMPが使えるかどうかによってヘッダをインクルードするかどうかを条件分岐したいのですが
どのようにしたらコンパイラがOpenMPをサポートしているか調べられるでしょうか?
どのようにしたらコンパイラがOpenMPをサポートしているか調べられるでしょうか?
2006/02/17(金) 16:15:54
>>43
VC++8は対応してるよ
VC++8は対応してるよ
2006/02/17(金) 17:36:01
49デフォルトの名無しさん
2006/03/12(日) 17:43:30 GOMPはどこのページからダウンロードできるのでしょうか?
2006/03/12(日) 17:47:28
C++相談室で教えてやっただろうが。
2006/03/18(土) 21:11:59
TextSS のWindowsXP(Professional)64bit化おながいします
もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
2006/03/19(日) 09:25:20
>>50
kwsk
kwsk
2006/03/19(日) 14:16:22
54デフォルトの名無しさん
2006/04/11(火) 11:57:56 OpenMP初めて知りました。こんなに簡単にマルチスレッドプログラムが作れるなんて
時代が変わったようだな
時代が変わったようだな
2006/04/18(火) 12:54:01
大きい単位で独立性の高いスレッドを切り出すのがパフォーマンスを上げるポイントなので、
細かい単位であっちこちで同期を取るようなプログラムが手軽に作れてしまえるOpenMPは痛し痒し。
激しくパフォーマンスが出なくてシングルで動かしたときより遅くなることも。
細かい単位であっちこちで同期を取るようなプログラムが手軽に作れてしまえるOpenMPは痛し痒し。
激しくパフォーマンスが出なくてシングルで動かしたときより遅くなることも。
56デフォルトの名無しさん
2006/04/21(金) 15:19:26 OpenMPってwindowsでできるの?
2006/04/21(金) 15:25:08
>>56
VC++ 2005
VC++ 2005
2006/05/02(火) 14:09:55
>>55
細粒度はパフォーマンスでないけど、お手軽並列化〜♪って感じなんでないかい。
細粒度はパフォーマンスでないけど、お手軽並列化〜♪って感じなんでないかい。
59デフォルトの名無しさん
2006/06/02(金) 08:39:59 OpenMPってお手軽だけど、効率はあまり良くないよね
2006/06/04(日) 00:55:01
モチロンソウヨ
2006/06/10(土) 00:01:58
ハイパースレッディングでOpenMP使うと激しく遅くなるよね。
2006/06/10(土) 22:40:12
それは論理CPUにスレッドをバインドすれば
なおるんじゃね?
どうやってバインドするかしらねーけど。
なおるんじゃね?
どうやってバインドするかしらねーけど。
2006/06/10(土) 23:52:44
あまってる演算器や回路をつかって2CPUに見せかけるのがHTだから
行列の計算のような同じタイプの計算を並列化した場合遅くなるのは当たり前。
片方は整数もう片方で実数計算をさせると効果が出るかもしれない。
行列の計算のような同じタイプの計算を並列化した場合遅くなるのは当たり前。
片方は整数もう片方で実数計算をさせると効果が出るかもしれない。
2006/06/11(日) 01:38:10
そうなると #pragma omp for が全滅・・・
2006/06/11(日) 18:15:49
同じ回路を使う場合でもレジスタが倍になって依存性が減るから、パイプラインのストールが減るよ。
あと実数がメインの場合、実数程の負荷は無いにせよアドレスの計算やループカウンタで整数も結構忙しい。
実数をメインにするとそこらへん上手く住み分け出来てると思った。
演算器を効率良く使えてウマー。
あと実数がメインの場合、実数程の負荷は無いにせよアドレスの計算やループカウンタで整数も結構忙しい。
実数をメインにするとそこらへん上手く住み分け出来てると思った。
演算器を効率良く使えてウマー。
2006/06/12(月) 18:36:58
依存性が減るって表現はしっくりこないな
67デフォルトの名無しさん
2006/08/26(土) 14:58:22 VS2005のC++でOpenMPを使おうと思って、コードを書きましたが、
プログラムが開始する前にエラーが起こります。
/openmp をつけてコンパイルしたり、マニフェストファイルに
<file name="vcompd.dll" hash="XXXX" hashalg="XXX"/>と入れ
たりしましたが、まったくピクリとも動いてくれません。
皆さんは普通にVS2005でOpenMP使ってますか?
プログラムが開始する前にエラーが起こります。
/openmp をつけてコンパイルしたり、マニフェストファイルに
<file name="vcompd.dll" hash="XXXX" hashalg="XXX"/>と入れ
たりしましたが、まったくピクリとも動いてくれません。
皆さんは普通にVS2005でOpenMP使ってますか?
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でも導入できる。
\Program Files\Common Files\Merge Modules
Microsoft_VC80_OpenMP_x86.msm
Microsoft_VC80_DebugOpenMP_x86.msm
リリース版だけならvcregist_x86.exeでも導入できる。
2006/08/27(日) 16:59:19
>>67
うん、普通に使える。
>プログラムが開始する前にエラーが起こります。
ってのがどういう意味かよく分からんし(コンパイル時か実行時か)、
とりあえずエラーメッセージとかソースとか晒してみたら。
うん、普通に使える。
>プログラムが開始する前にエラーが起こります。
ってのがどういう意味かよく分からんし(コンパイル時か実行時か)、
とりあえずエラーメッセージとかソースとか晒してみたら。
2006/08/28(月) 14:20:01
Pro以上なら普通に使えるが、実はStdやExpressでも使う方法がある。
足りないものはomp.h とvcomp(d).dllとインポートライブラリで、
これはPlatformSDK (for Win2003とかいう新しめの奴)を入れると付いてくる。
これをIDEの各検索パスに追加すればコンパイルは出来る。
ただし、WinSXSディレクトリにdllをインストールしないので実行時にDLLが無いためエラーになる。
この導入の仕方は>>68のとおり。
同じ方法でPGOもできないかと思ったがこれは無理でした。
ただ単純な/GL /LTCG オプションでのコンパイルは出来るからこれで我慢。
足りないものはomp.h とvcomp(d).dllとインポートライブラリで、
これはPlatformSDK (for Win2003とかいう新しめの奴)を入れると付いてくる。
これをIDEの各検索パスに追加すればコンパイルは出来る。
ただし、WinSXSディレクトリにdllをインストールしないので実行時にDLLが無いためエラーになる。
この導入の仕方は>>68のとおり。
同じ方法でPGOもできないかと思ったがこれは無理でした。
ただ単純な/GL /LTCG オプションでのコンパイルは出来るからこれで我慢。
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割くらい早くなった。
ちなみに、ハイパースレッドのデュアル
ためしに
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だからかずぶずぶの結果です。
for ( ...
そのプログラムだとこうですか?うちの環境だとHTの1CPUだからかずぶずぶの結果です。
73デフォルトの名無しさん
2006/10/03(火) 02:54:4374デフォルトの名無しさん
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
2006/11/18(土) 02:07:03
Openマンコぽこちんか
2006/11/20(月) 03:17:24
OpenマンPのG☆SPOTに決まってるだろバカか
81デフォルトの名無しさん
2006/12/03(日) 17:52:0282デフォルトの名無しさん
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;
}
でよいのでしょうか?もっと何かスマートな方法はないでしょうか?
#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
などとすればよいかと。
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 を返す。
逐次実行部分で呼ぶと 1 を返す。
89デフォルトの名無しさん
2007/03/10(土) 16:00:16 #pragma omp parallel
{
#pragma omp single
cout<<omp_get_num_threads()<<endl;
}
{
#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
!$ 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
たとえば、カレーライス。子供の食い物ね。マクドナルド。通はモスバーガーでしょ?
野球だと、巨人。クルマだと、トヨタ。音楽だと、ミスチル。政治だと、自民党。
ビートルズだと、ポールの曲。音楽分かってる人はジョンですよね。
マンガだと、手塚治虫や藤子不二雄。今更読む必要もない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::::::::::::ミ {,_.イニノ
彡ソ/ノハ ト、 \ / ,イ 川ハ ヾー‐'^┴
,. / |´ ̄`ヽー- 、 ト、 , -‐、/./.- 、 書き込みのはやきこと風の如く
/ | | ヽ l l ( 火◇風 ノ
/o ̄`ハ._.ゝ===┴=く.ノ- 、 ノ ◇ ◇ ( 他人と会話せざること林の如く
/o O / l´ ⌒ ⌒ lo ',ヽ ( 山◇ 林 }
\___/. ト、(●) (●) ハ ∧ `⌒/7へ‐´ ネットで煽ること火の如く
/ ,イ レ::::⌒(__人__)⌒l~T--‐彡 /./
/ ̄ ̄l. 彡、 |r┬-| ノ'l l::::::::::彡ー7⌒つ、 部屋から動かざること山の如し
彡:::::::::::l ト、__ `ー' /| l::::::::::::ミ {,_.イニノ
彡ソ/ノハ ト、 \ / ,イ 川ハ ヾー‐'^┴
2007/04/12(木) 09:18:04
96デフォルトの名無しさん
2007/04/12(木) 10:50:30 祗園精舎の鐘の声
諸行無常の響きあり
娑羅双樹の花の色
盛者必衰の理をあらはす
おごれる人も久しからず
唯春の夜の夢のごとし
たけき者も遂にはほろびぬ
偏に風の前の塵に同じ
諸行無常の響きあり
娑羅双樹の花の色
盛者必衰の理をあらはす
おごれる人も久しからず
唯春の夜の夢のごとし
たけき者も遂にはほろびぬ
偏に風の前の塵に同じ
97デフォルトの名無しさん
2007/06/02(土) 15:05:34 一般論として、MPIよりもOpenMPの方が性能が低下する(遅くなる)ということはありえますか?
MPIのプログラムをOpenMPを使って書き換えたのですが、3割近く遅くなってしまいました。
MPIのプログラムをOpenMPを使って書き換えたのですが、3割近く遅くなってしまいました。
98デフォルトの名無しさん
2007/06/02(土) 15:29:34 一般論では遅くなります
2007/06/02(土) 15:37:48
きちんとチューニングされていれば、MPIの方が速い。
あとはpthreadを使って自分で書くという手もある。
あとはpthreadを使って自分で書くという手もある。
100デフォルトの名無しさん
2007/06/02(土) 15:42:04 OpenMPはお手軽。だからそれに伴って犠牲になっている部分もある。それが性能。
101デフォルトの名無しさん
2007/06/02(土) 17:50:17 MPIで並列効果出せるほどの大きな粒度ならOpenMPにする必要はない。
OpenMPの利点は小さな粒度の並列処理が簡単に書けることとシングルソースで
非OpenMP環境でもビルドしてテストできること。
それから既存のソースにディレクティブ挿入するだけで並列化できるところかな。
OpenMPの利点は小さな粒度の並列処理が簡単に書けることとシングルソースで
非OpenMP環境でもビルドしてテストできること。
それから既存のソースにディレクティブ挿入するだけで並列化できるところかな。
102デフォルトの名無しさん
2007/06/03(日) 06:10:20 >>101
同じ粒度でも、OpenMPの方が遅くなってしまいます。
OpenMPはスレッドレベルでの切り替えなので、プロセスレベルのMPIよりも、効率が良いと思っていたので
何が問題なのか、測りかねています。
同じ粒度でも、OpenMPの方が遅くなってしまいます。
OpenMPはスレッドレベルでの切り替えなので、プロセスレベルのMPIよりも、効率が良いと思っていたので
何が問題なのか、測りかねています。
103デフォルトの名無しさん
2007/06/03(日) 08:40:24 競合してるんじゃない?
104デフォルトの名無しさん
2007/06/03(日) 10:07:50 キャッシュのヒット率の差だと思う
もし、pragma omp forでやっているのなら、for文を二つに分けて
pragma omp parallelで二つに並列してみたら?
もし、pragma omp forでやっているのなら、for文を二つに分けて
pragma omp parallelで二つに並列してみたら?
105デフォルトの名無しさん
2007/06/03(日) 10:15:44 windows はaffinty maskを使えないの?
106デフォルトの名無しさん
2007/06/03(日) 11:14:45107デフォルトの名無しさん
2007/06/03(日) 12:26:25 環境は、Fedora5にデュアルコアOpteronx2の計4cpuをインテルコンパイラを使って、コンパイルしています。
系を大きくしても(すなわち、スレッド生成頻度をかなり下げても)300%程度で飽和してしまいます。
以前、Redhat+Xeon+インテルコンパイラの時は,2CPUで200%(4CPUではないのであまりよい比較ではありませんが)
計算速度も倍になっていたので、コンパイラの問題なのか、opteronの問題なのか、そのあたりもう少し調べてみたいと思います。
系を大きくしても(すなわち、スレッド生成頻度をかなり下げても)300%程度で飽和してしまいます。
以前、Redhat+Xeon+インテルコンパイラの時は,2CPUで200%(4CPUではないのであまりよい比較ではありませんが)
計算速度も倍になっていたので、コンパイラの問題なのか、opteronの問題なのか、そのあたりもう少し調べてみたいと思います。
108デフォルトの名無しさん
2007/06/03(日) 12:32:32 1CPU から 2CPU にスケールするのと、4CPU にスケールするのとじゃ
全然話が違うからね。
全然話が違うからね。
109デフォルトの名無しさん
2007/06/03(日) 12:57:34 4cpuならうまく組めば1割も落ちないよ
スレッドチェッカーで確認してみな
スレッドチェッカーで確認してみな
110デフォルトの名無しさん
2007/06/03(日) 14:58:41 >>107
OpteronってことはNUMA構成で使ってるってことはないかな?
OpenMPはSMP用だからNUMAだと効率ががた落ちになることがあるよ。
あと趣味でやってるのでなければCPU使用率よりも計算までの終了時間で考えた方がいいと思う。
メモリ競合起こすとCPU100%でも計算速度半分なんてざらだから。
OpteronってことはNUMA構成で使ってるってことはないかな?
OpenMPはSMP用だからNUMAだと効率ががた落ちになることがあるよ。
あと趣味でやってるのでなければCPU使用率よりも計算までの終了時間で考えた方がいいと思う。
メモリ競合起こすとCPU100%でも計算速度半分なんてざらだから。
111デフォルトの名無しさん
2007/06/03(日) 15:24:23 カーネルがスレッドのスケジューリングとメモリページの割当を上手く管理していれば
Dual Core x 2 Socket くらい何とかならないの?
Dual Core x 2 Socket くらい何とかならないの?
112デフォルトの名無しさん
2007/06/03(日) 15:30:27 CPUとSIMDで行列計算をうまく分散してくれるコンパイラはないものか
113デフォルトの名無しさん
2007/06/03(日) 15:42:04 lapackのSIMD化でダメなの?
そんなのはいくらでもあるが
そんなのはいくらでもあるが
114デフォルトの名無しさん
2007/06/04(月) 06:27:01 OpenMP節を入れ子にすると、並列化されなくなってしまいます。
入れ子のOpenMP節を並列化する方法はないものでしょうか?
入れ子のOpenMP節を並列化する方法はないものでしょうか?
115デフォルトの名無しさん
2007/06/04(月) 09:06:41 >>114
OpenMP + nested loopで検索すればたくさんでてくるよ
OpenMP + nested loopで検索すればたくさんでてくるよ
116デフォルトの名無しさん
2007/06/24(日) 15:29:55 インテルのスレッディング・ビルディング・ブロックとOpenMPの違いって何?
117デフォルトの名無しさん
2007/06/24(日) 18:08:38 OpwnMP:
共有メモリ型並列計算機におけるマルチスレッド並列プログラミングのためのAPI
インテル スレッディング・ビルディング・ブロック:
C++用ランタイム・ライブラリー
共有メモリ型並列計算機におけるマルチスレッド並列プログラミングのためのAPI
インテル スレッディング・ビルディング・ブロック:
C++用ランタイム・ライブラリー
118デフォルトの名無しさん
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にスパイウェアが入ってるのか?
にopenmpのファイルが入ってるのかと思ったら入って無かった。
Microsoft Windows Software Development Kit for Windows Vista
にopenmpのファイルが入ってた。
ファイルの場所が
Microsoft SDKs\Windows\v6.0\VC\
以下のincludeとlibだから少し戸惑ってしまった。
で、さっそく簡単なプログラムを作って実行してみたらSpybotが反応したんだが。
vcompd.dllにスパイウェアが入ってるのか?
119デフォルトの名無しさん
2007/09/06(木) 01:13:00 Microsoft Windows Software Development Kit for Windows Vista
vcredist_x86.exe
この2つでVC2005Expressでも使えた。
vcredist_x86.exe
この2つでVC2005Expressでも使えた。
120デフォルトの名無しさん
2007/09/19(水) 22:49:32 他人の書いた数値解析のプログラムをOpenMP対応にしている度素人です。
まずテストに単にパラレルリージョンを指定しただけのプログラムを走らせたら
パフォーマンスが半分くらいにまで落ち込んで困っています(スレッド数はCPU数以下です)。
しかもパラレルリージョンの範囲が広ければ広いほどパフォーマンスが悪化するのですが
これは当然なのでしょうか?
ちなみにパラレルリージョン内を並列化しても1CPUのときより10%くらい悪いです。
環境はOSはRHEL、インテルのfortranコンパイラです。
まずテストに単にパラレルリージョンを指定しただけのプログラムを走らせたら
パフォーマンスが半分くらいにまで落ち込んで困っています(スレッド数はCPU数以下です)。
しかもパラレルリージョンの範囲が広ければ広いほどパフォーマンスが悪化するのですが
これは当然なのでしょうか?
ちなみにパラレルリージョン内を並列化しても1CPUのときより10%くらい悪いです。
環境はOSはRHEL、インテルのfortranコンパイラです。
121デフォルトの名無しさん
2007/09/19(水) 23:54:02 的外れだが同じ作業をしていた素人として。
スレッド生成・消滅のオーバーヘッドは思いのほか大きい
$omp parallel 〜 $omp end parallel
が極めて複数回呼ばれる場合にパフォーマンスは非常に落ちる
ネストループ内部、100万回呼ばれるルーチン内など
シングルの作業内容をマルチ対応にするのは面倒ですね。
gprof等でタイムクリティカルな部分を探し、手を入れてみましょう
スレッド生成・消滅のオーバーヘッドは思いのほか大きい
$omp parallel 〜 $omp end parallel
が極めて複数回呼ばれる場合にパフォーマンスは非常に落ちる
ネストループ内部、100万回呼ばれるルーチン内など
シングルの作業内容をマルチ対応にするのは面倒ですね。
gprof等でタイムクリティカルな部分を探し、手を入れてみましょう
122デフォルトの名無しさん
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
並列化の指定をする前にまず並列化予定の範囲をパラレルリージョン指定して
ちゃんと動くのかを確認したかったのです。
長文失礼
かなり大きな配列を含む範囲を
単にパラレルリージョンに指定しただけのプログラムは
1CPUのときの1/3程度まで低下すると言う現象がありました。
(並列化を指定すると4CPUで3.8倍程度にちゃんとなりました)
同じ動作をするスレッドが複数あってメモリが競合してるんですかね?
あしたスレッドチェッカーの体験版でも落として調べてみます。
>>121
今日試してみたところうちの環境では
100000回ループするプログラムの内と外に
$omp parallel 〜 $omp end parallel
をおいたプログラムをそれぞれ比較したのですがほとんど差はありませんでした。
リージョン内は簡単な内容だったのですが、
リージョン内のプログラムの内容によってもスレッド生成・消滅のオーバーヘッドは変わってくるんですかね?
>>122
並列化の指定をする前にまず並列化予定の範囲をパラレルリージョン指定して
ちゃんと動くのかを確認したかったのです。
長文失礼
124デフォルトの名無しさん
2007/10/10(水) 15:20:28 sections分割でsection分けを行った時に、
自分でどのスレッドに割り当てる的な事は
できないのでしょうか?
自分でどのスレッドに割り当てる的な事は
できないのでしょうか?
125120
2007/10/25(木) 21:51:43 いまさらながら経過報告
元となったプログラムが古いものだったので、配列をallocateするのではなく
メインの宣言でかなり大きくとっていたのですが、
それを必要量にしたところかなり早くなりました。
ただ強い最適化(fastオプションとか)つけると
OpenMPはそんなにスピードが上がらずシングルスレッドに追いつかれてしまうんですけどね。
元となったプログラムが古いものだったので、配列をallocateするのではなく
メインの宣言でかなり大きくとっていたのですが、
それを必要量にしたところかなり早くなりました。
ただ強い最適化(fastオプションとか)つけると
OpenMPはそんなにスピードが上がらずシングルスレッドに追いつかれてしまうんですけどね。
126デフォルトの名無しさん
2007/11/30(金) 04:25:29 サーセーン。素人の恥ずかしい質問です。
OpenMPは従来の(OSなどに付属した)スレッドのライブラリの
置き換えとしては使用すべきではないのでしょうか?
(どこかで逐次プログラムの並列化がOpenMPの利用の前提であるとか見たのですが、)
並列で動くことが前提であるプログラム(例:HTTPデーモンなど)を
OpenMPを使って書こうと思っているのですが、止めたほうがいいのでしょうか・・・。
OpenMPは従来の(OSなどに付属した)スレッドのライブラリの
置き換えとしては使用すべきではないのでしょうか?
(どこかで逐次プログラムの並列化がOpenMPの利用の前提であるとか見たのですが、)
並列で動くことが前提であるプログラム(例:HTTPデーモンなど)を
OpenMPを使って書こうと思っているのですが、止めたほうがいいのでしょうか・・・。
127126
2007/11/30(金) 04:26:29 うわぁ、このスレ伸びてないんだなあ。悪いけどage
128デフォルトの名無しさん
2007/12/01(土) 01:58:56 OpenMP はひとまとまりの大きなデータ(行列とか画像とか)に対する計算を
複数のスレッドで並列化するのに向いている希ガス。つまりデータ並列向き。
データ並列性のある for 文で書かれたアルゴリズム(行列ベクトル積とか
画像のしきい値処理とか)は parallel for ディレクティブでいとも簡単に並列化できる。
そこが OpenMP のおいしいところ。
タスク並列の並列プログラム、つまり各スレッドが独立に違う処理をする
(例えばそれぞれ別のクライアントからの要求を処理する)並列プログラムも
OpenMP で書けるけど、あまりうまみがないと思われ。
逐次プログラムを並列化するのが前提というのは違う気がする。
ただ、例えば parallel for ディレクティブしか使ってない並列プログラムは
コンパイラの OpenMP 機能をオフにすれば逐次プログラムとしてコンパイルできる。
そこが他の並列化手法(POSIXスレッドとかMPIとか)と違うところ。
でも、OpenMP機能をオフにするとコンパイル不能になる並列プログラムも書けるし、
parallel sections を使ったプログラムは逐次プログラムとしてコンパイルはできても
意味が変わってしまう(各セクションが順番に逐次実行される)。
つまり、この手のプログラムは並列で動くことが前提で書くわけだ。
結局のところ、OpenMP を使うのが妥当かどうかは126さんがやりたいことに依る。
並列性の高いデータ並列の計算をやりたいなら使う価値がある。
複数のスレッドで並列化するのに向いている希ガス。つまりデータ並列向き。
データ並列性のある for 文で書かれたアルゴリズム(行列ベクトル積とか
画像のしきい値処理とか)は parallel for ディレクティブでいとも簡単に並列化できる。
そこが OpenMP のおいしいところ。
タスク並列の並列プログラム、つまり各スレッドが独立に違う処理をする
(例えばそれぞれ別のクライアントからの要求を処理する)並列プログラムも
OpenMP で書けるけど、あまりうまみがないと思われ。
逐次プログラムを並列化するのが前提というのは違う気がする。
ただ、例えば parallel for ディレクティブしか使ってない並列プログラムは
コンパイラの OpenMP 機能をオフにすれば逐次プログラムとしてコンパイルできる。
そこが他の並列化手法(POSIXスレッドとかMPIとか)と違うところ。
でも、OpenMP機能をオフにするとコンパイル不能になる並列プログラムも書けるし、
parallel sections を使ったプログラムは逐次プログラムとしてコンパイルはできても
意味が変わってしまう(各セクションが順番に逐次実行される)。
つまり、この手のプログラムは並列で動くことが前提で書くわけだ。
結局のところ、OpenMP を使うのが妥当かどうかは126さんがやりたいことに依る。
並列性の高いデータ並列の計算をやりたいなら使う価値がある。
129デフォルトの名無しさん
2007/12/01(土) 02:04:37 追加。OpenMPでHTTPデーモンを書いた、という報告を見たことがあったのを思い出した。
http://www.nic.uoregon.edu/iwomp2005/Papers/f35.pdf
俺は詳しく読んでないので内容についてはノーコメント。参考までに。
http://www.nic.uoregon.edu/iwomp2005/Papers/f35.pdf
俺は詳しく読んでないので内容についてはノーコメント。参考までに。
130デフォルトの名無しさん
2007/12/01(土) 13:39:21 並列化した部分じゃbreakやreturn使えないし、難しかっただろうなぁ。
普通のWindowsプログラムでCreateThreadをOpenMPで置き換えろって言われたら・・・
メッセージポンプ使ってなんとかなるんだろうか
普通のWindowsプログラムでCreateThreadをOpenMPで置き換えろって言われたら・・・
メッセージポンプ使ってなんとかなるんだろうか
131デフォルトの名無しさん
2007/12/01(土) 23:44:51 >並列化した部分じゃbreakやreturn使えない
kwsk
kwsk
132126
2007/12/03(月) 05:18:50 スレッドを横断したbreakやreturnが出来ないということでは?
字句上は単なるスコープにしか見えないので、出来そう・・・しかし出来ないもどかしさ(何)。
>>128
ご返答ありがとうございます。
128氏から頂いた意見も考慮に入れつつ、色々と検討してみた結果、
今回やりたいことにはOpenMPは適していない、という判断に至りました。
しかし実験的にHTTPサーバらしきものをOpenMPを使って書いてみたところ、
簡単なものならかなり簡潔に書けることも分かり、、全てでなくとも部分的にOpenMPを使うのもありかと思えました。
字句上は単なるスコープにしか見えないので、出来そう・・・しかし出来ないもどかしさ(何)。
>>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 ディレクティブ名が必要です
って言われる
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 ディレクティブ名が必要です
って言われる
134デフォルトの名無しさん
2007/12/17(月) 18:47:08 >133
#pragma .. の行末に ';' がついてるとかいうオチだったら素っ裸で町内1周してこい
#pragma .. の行末に ';' がついてるとかいうオチだったら素っ裸で町内1周してこい
135デフォルトの名無しさん
2008/01/04(金) 15:12:19 すでにあるプログラムをOpenMP化しようと思うのですが、以下のような場合にfuncがスレッドセーフで再入可能であれば問題ないですか?
#pragma omp for
for(int i=0;i<100000;i++)
{
func(i);
}
#pragma omp for
for(int i=0;i<100000;i++)
{
func(i);
}
136デフォルトの名無しさん
2008/01/04(金) 15:53:58 問題ないです
func()の定義が別ファイルでもおk
func()の定義が別ファイルでもおk
137デフォルトの名無しさん
2008/01/04(金) 16:38:48138sage
2008/02/06(水) 21:13:32 IntelFortran10.0で数値解析やってるんですけど
サブルーチン内で並列化領域をつくるのと
サブルーチンごとメインに展開して並列化領域つくるのとで
並列化時の速度が異なったり(逐次だとほぼ一緒)
逐次計算部分にある並列化と関係ないサブルーチンを
コメントアウトするかしないかで並列化時の速度向上が変わります。
並列スレッドのスタックサイズとかの問題なんでしょうかね。
サブルーチン内で並列化領域をつくるのと
サブルーチンごとメインに展開して並列化領域つくるのとで
並列化時の速度が異なったり(逐次だとほぼ一緒)
逐次計算部分にある並列化と関係ないサブルーチンを
コメントアウトするかしないかで並列化時の速度向上が変わります。
並列スレッドのスタックサイズとかの問題なんでしょうかね。
139デフォルトの名無しさん
2008/02/06(水) 22:02:55 速度や速度向上が具体的にどう違うの?
140デフォルトの名無しさん
2008/02/07(木) 00:50:56 まず、各CPUに処理が効率よく割り振られているか、CPUの負荷率を見てみたらいいんじゃないか?
141デフォルトの名無しさん
2008/02/13(水) 15:49:52 VC++2008でコンパイルするとVCOMPD.libが無いというエラーが出ます。
VCOMPD.libはどこで手に入りますか?
VCOMPD.libはどこで手に入りますか?
142デフォルトの名無しさん
2008/02/13(水) 16:40:58 >>141
VS2005だとPro版以上でサポート。VS2008も同じだと思う。
VS2005だとPro版以上でサポート。VS2008も同じだと思う。
143デフォルトの名無しさん
2008/02/13(水) 20:12:04 >141
vcompd.libはProfessional版以外手に入れる方法はない。
ただしリリースビルド版のライブラリであるvcomp.libは
Windows Server 2008 SDKをインストールするとゲットできる。
デバッグビルドでもリリースビルドのライブラリ(vcomp.lib)を
リンクする設定にするとExpressでもOpenMPが自由に使用可能。
vcompd.libはProfessional版以外手に入れる方法はない。
ただしリリースビルド版のライブラリであるvcomp.libは
Windows Server 2008 SDKをインストールするとゲットできる。
デバッグビルドでもリリースビルドのライブラリ(vcomp.lib)を
リンクする設定にするとExpressでもOpenMPが自由に使用可能。
144デフォルトの名無しさん
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をいれといたらよいだけ?
while(1)
#pragma omp parallel sections
{
#pragma omp section
read後その処理
#pragma omp section
write後その処理
}
で、ここで、暗黙のwaitがかかると思われるが、select的な使い方って、出来る?
sectionの跡にnowaitをいれといたらよいだけ?
145デフォルトの名無しさん
2008/02/15(金) 14:26:50 nowaitを入れた場合、どのスレッドが生き残るのでしょうか?
それとも、並列実行するところはすべて子スレッドで、実行中のスレッド数が最大より1少なくなった時点で
メインスレッドが継続されるのでしょうか?
それとも、並列実行するところはすべて子スレッドで、実行中のスレッド数が最大より1少なくなった時点で
メインスレッドが継続されるのでしょうか?
146デフォルトの名無しさん
2008/02/15(金) 16:42:54 read/writeのtimeoutを入れておけば、なんとかなりますか。
しかし、openmp(のsections)では、スレッドは、死にますか?
一応、処理が終われば、lockが外れるだけでしょう(gccの実装ではそのようです)
しかし、openmp(のsections)では、スレッドは、死にますか?
一応、処理が終われば、lockが外れるだけでしょう(gccの実装ではそのようです)
147sage
2008/03/01(土) 00:47:47 スレッドプロファイラー使ってる人居るかな。
あのREGIONS VIEWの各リージョンの範囲はなにで決まってるの?
同期から同期の間かと思ってたんだけどソースの位置みるとちがうっぽい。
最適化オプションのせいでソースとの対応がとれなくなってるのかしらん。
あのREGIONS VIEWの各リージョンの範囲はなにで決まってるの?
同期から同期の間かと思ってたんだけどソースの位置みるとちがうっぽい。
最適化オプションのせいでソースとの対応がとれなくなってるのかしらん。
148138
2008/03/04(火) 19:19:48 chkstkという関数に要する時間が
OpenMPにすると凄まじく増えているのが原因のようでした。
関数に引き渡す配列が多すぎなのか。
OpenMPにすると凄まじく増えているのが原因のようでした。
関数に引き渡す配列が多すぎなのか。
149デフォルトの名無しさん
2008/04/06(日) 10:57:30 >>148
私もintel fortran10+mkl+openmpで数値計算しています
openmp初心者の私は、intelのopenmpのドキュメントを参考にしました。
parallel do ,sections ,reduction,privateあたりしか使っていませんが、オリジナルの
プログラムのマルチスレッド化は割と簡単に出来、計算時間も「ほぼ」スレッド数倍
にできました。
(当然ですがparallel region部分です。プログラム全体ではありません)
そもそもchkstkは並列処理できるかどうかを検討してはどうですか。
各スレッドで相互参照するのであれば、reduction宣言等が適切であれば問題ないはず。
私もintel fortran10+mkl+openmpで数値計算しています
openmp初心者の私は、intelのopenmpのドキュメントを参考にしました。
parallel do ,sections ,reduction,privateあたりしか使っていませんが、オリジナルの
プログラムのマルチスレッド化は割と簡単に出来、計算時間も「ほぼ」スレッド数倍
にできました。
(当然ですがparallel region部分です。プログラム全体ではありません)
そもそもchkstkは並列処理できるかどうかを検討してはどうですか。
各スレッドで相互参照するのであれば、reduction宣言等が適切であれば問題ないはず。
150デフォルトの名無しさん
2008/04/09(水) 22:52:21 >>148
関数のエントリ近辺で chkstk が呼び出され、必要に応じてスタックが拡張される
(実メモリが割り当てられる)わけですが、シングルスレッドの場合は一度拡張された
スタックはもちろん再利用されるので負荷が軽いわけです。
スタックはリニアなアドレスに(ページング機構を用いて)メモリを割り当てる必要があるため、
割り当てられたページを再利用できない場合には時としてヒープよりも確保・解放が重い
メモリとなります。マルチスレッドでスタックが頻繁に成長するような場合には、メモリを
スタック上に取るのをやめて、std::vector などを用いてヒープから確保した方がよいと
思います。
たどたどしい説明になってしまった。
関数のエントリ近辺で chkstk が呼び出され、必要に応じてスタックが拡張される
(実メモリが割り当てられる)わけですが、シングルスレッドの場合は一度拡張された
スタックはもちろん再利用されるので負荷が軽いわけです。
スタックはリニアなアドレスに(ページング機構を用いて)メモリを割り当てる必要があるため、
割り当てられたページを再利用できない場合には時としてヒープよりも確保・解放が重い
メモリとなります。マルチスレッドでスタックが頻繁に成長するような場合には、メモリを
スタック上に取るのをやめて、std::vector などを用いてヒープから確保した方がよいと
思います。
たどたどしい説明になってしまった。
151デフォルトの名無しさん
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 じゃ使えねーってハナシになるんですが・・・・
・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 じゃ使えねーってハナシになるんですが・・・・
152デフォルトの名無しさん
2008/05/19(月) 17:00:29 >>143
Windows Server 2008 SDKにvcompd.libも入ってるみたい。
Windows Server 2008 SDKにvcompd.libも入ってるみたい。
153デフォルトの名無しさん
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 で行いました。
makeしてインストールしたgccを利用すると#include <omp.h>で
ファイルが無いと言われて困ってます。
gcc-4.3.1\libgomp\omp.h.in
は存在するのですが、どうすればいいのでしょう?configureは
./configure --enable-threads=win32 --with-system-zlib で行いました。
154デフォルトの名無しさん
2008/07/19(土) 15:30:42 Open => OpenMPのミスです。
155デフォルトの名無しさん
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)
参考までに。
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を使って一次元配列から最大値、最小値を求める方法を教えてください。
157デフォルトの名無しさん
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_);
}
}
俺はスレッド数を取得して解決した気がする。
大雑把に書くとこんな感じ。
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_);
}
}
158デフォルトの名無しさん
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
----------------------------------------------
------------- 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 にしちゃうんだけどね。
> reductionにminやmaxは無いんだよな
あれ、あったと思うけど・・・。
reduction(min:unko)
とか。Fortran でしか使ったこと無いけど。
でもどのアドレスでminだったか、とかを取得したいときは
結局 shared にしちゃうんだけどね。
160デフォルトの名無しさん
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でコンパイルしてもちゃんと動く・・・はず。
そうなんだ。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で使えないんでしたっけ?
164デフォルトの名無しさん
2008/09/07(日) 13:20:49 NG。
ifortは出来た気がする。
ifortは出来た気がする。
165デフォルトの名無しさん
2008/09/07(日) 13:26:10 #pragma omp for
#pragma omp parallel for
てなにが違うの?
#pragma omp parallel for
てなにが違うの?
166デフォルトの名無しさん
2008/09/07(日) 17:53:44 #pragma omp for は #pragma omp parallel ブロックの中に書く必要があるが、
parallelブロックにforブロックが1つのことも多いので
#pragma omp parallel for でまとめて書けるようにしてある。
parallelブロックにforブロックが1つのことも多いので
#pragma omp parallel for でまとめて書けるようにしてある。
167デフォルトの名無しさん
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には入ってくれません…
スレチな質問で申し訳ないのだけど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には入ってくれません…
169デフォルトの名無しさん
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;
}
}
}
}
//画像上でランダムで数点選んできた線との距離が最少になる座標を算出
#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属性付けて)ループ処理するといいかも。
計算は遅くなりそうだけどね。
get_randum_number
で配列dataにはいる乱数が変わるからじゃね?
たぶん呼ばれる順番が並列と1CPUのときで違うだろうから。
ループ内で乱数つくらないで、でかい乱数用の2次元配列
data0[KURIKAWSIKAISUU][ITIDONIERAZUKAZU]
をループが始まる前に「並列処理しないで」作ってから
(配列data0をshared属性付けて)ループ処理するといいかも。
計算は遅くなりそうだけどね。
171デフォルトの名無しさん
2009/01/21(水) 14:12:47 んでループ内で乱数生成してた部分は
for (i=.....){data[i]=data0[j][i];}
と乱数値の複製に置き換える、と。
for (i=.....){data[i]=data0[j][i];}
と乱数値の複製に置き換える、と。
172169
2009/01/26(月) 11:03:50 >170
>171
ありがとうございます。
いただいた意見を参考に修正し、できたらご報告します。
>171
ありがとうございます。
いただいた意見を参考に修正し、できたらご報告します。
173デフォルトの名無しさん
2009/01/26(月) 11:33:59 マルチスレッドでrand()使うと全然ランダムじゃないデータが出てくるよ
174デフォルトの名無しさん
2009/01/26(月) 12:52:37 rand_r
175デフォルトの名無しさん
2009/02/24(火) 20:57:22 gcc-4.3 で OMP を使い始めました。初心者で正しい使いかたをしている
かどうか判然としません。/proc/cpuinfo で cpufamily 6, model
23 (Harpertown と呼ぶらしい)と表示されるXEONでは確かに速くなるので
すが、cpufamily 15 model 4 (Nocona と呼ぶらしい) では非常に遅くな
ります。これは正しい振る舞いでしょうか。時間は
clock()/CLOCKS_PER_SEC; で測っていますが、これで正しい判断ができる
のでしょうか? 並列化すれば速くなる速度のネックになっている部分を
探す方法はあるのでしょうか? 並列化できるかどうか判然としない部分
を並列化可能なコードに書き直してくれるようなソフトはないでしょうか?
かどうか判然としません。/proc/cpuinfo で cpufamily 6, model
23 (Harpertown と呼ぶらしい)と表示されるXEONでは確かに速くなるので
すが、cpufamily 15 model 4 (Nocona と呼ぶらしい) では非常に遅くな
ります。これは正しい振る舞いでしょうか。時間は
clock()/CLOCKS_PER_SEC; で測っていますが、これで正しい判断ができる
のでしょうか? 並列化すれば速くなる速度のネックになっている部分を
探す方法はあるのでしょうか? 並列化できるかどうか判然としない部分
を並列化可能なコードに書き直してくれるようなソフトはないでしょうか?
176デフォルトの名無しさん
2009/02/24(火) 23:13:22 どうせNoconaの方はデュアルCPU構成じゃなくてしかもHT無効というオチだろ。
177デフォルトの名無しさん
2009/02/25(水) 00:35:19 Nocona の /proc/cpuinfo は
processor : 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
となっています
processor : 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
となっています
178デフォルトの名無しさん
2009/02/25(水) 23:58:19 環境変数 OMP_NUM_THREADS などでスレッド数を指定してますよね。
明示的に指定しないと環境によってスレッド数が1になったりコア数になったりします。
きちんと並列実行できているのに 4-way Nocona で並列性能が出ないとすると
応用依存の問題かと。例えばメモリ帯域幅がネックになっているのかも知れません
(Harpertown ではメモリ帯域幅が足りていて Nocona では足りていないとか)。
どういう計算をしているのかを書くともっと直接的なアドバイスが得られるかもです。
計時の仕方はそれでいいと思います。精度が気になるなら RDTSC について調べると良さげ。
速度のネックになっている部分は、皆目見当がつかないならプロファイラが利用できます。
GCC なら -pg オプション付きでコンパイル、プログラム実行後に gprof コマンドを使って
統計情報を得ます。
時間のかかっている部分が分かったとしてそれを並列化して高速化できるかは別問題。
OpenMP はループを分割して並列化するのがお手軽で効果的ですが、
それができるのはループ間にデータの依存関係がない場合です。
a[i] += a[i-1] のように前後の反復の計算結果を利用したり、
配列の同じ要素に書き込むといった処理がデータ依存性の典型例です。
データ依存関係がある場合はコードを書き換えないと普通は並列化できません。
このあたりは並列プログラミングの普遍的な課題で、対策はケースバイケースです。
自動並列化は研究レベルではよく聞きますが実用的なツールは寡聞にして知りません。
よい自動並列化ツールがあれば私も試してみたいです。
明示的に指定しないと環境によってスレッド数が1になったりコア数になったりします。
きちんと並列実行できているのに 4-way Nocona で並列性能が出ないとすると
応用依存の問題かと。例えばメモリ帯域幅がネックになっているのかも知れません
(Harpertown ではメモリ帯域幅が足りていて Nocona では足りていないとか)。
どういう計算をしているのかを書くともっと直接的なアドバイスが得られるかもです。
計時の仕方はそれでいいと思います。精度が気になるなら RDTSC について調べると良さげ。
速度のネックになっている部分は、皆目見当がつかないならプロファイラが利用できます。
GCC なら -pg オプション付きでコンパイル、プログラム実行後に gprof コマンドを使って
統計情報を得ます。
時間のかかっている部分が分かったとしてそれを並列化して高速化できるかは別問題。
OpenMP はループを分割して並列化するのがお手軽で効果的ですが、
それができるのはループ間にデータの依存関係がない場合です。
a[i] += a[i-1] のように前後の反復の計算結果を利用したり、
配列の同じ要素に書き込むといった処理がデータ依存性の典型例です。
データ依存関係がある場合はコードを書き換えないと普通は並列化できません。
このあたりは並列プログラミングの普遍的な課題で、対策はケースバイケースです。
自動並列化は研究レベルではよく聞きますが実用的なツールは寡聞にして知りません。
よい自動並列化ツールがあれば私も試してみたいです。
179デフォルトの名無しさん
2009/02/26(木) 01:53:54 Intel C++ Compiler 11.0の自動並列化オプション(-parallel)でSPEC CPU 2006のいくつかのベンチマークが高速化しているが
実際のコードでどれだけ役に立つかは使ったことが無いのでわからない
実際のコードでどれだけ役に立つかは使ったことが無いのでわからない
180デフォルトの名無しさん
2009/03/07(土) 23:30:29 OpenMPの効果を調べるため、同じコードを、gfprtranで二通りにコンパイルして実行してみました。
全然速くなりません。むしろ遅くなっています。実行方法やコードが間違っているのでしょうか?
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
全然速くなりません。むしろ遅くなっています。実行方法やコードが間違っているのでしょうか?
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
181180
2009/03/07(土) 23:32:33 ソースコードは
module 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
module 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
182180
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
!$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
183デフォルトの名無しさん
2009/03/08(日) 14:53:53 gfortranは良くしらんけど・・
環境変数で使うCPUの数を指定してみて。
setenv OMP_THREAD_NUM 2
とか。プログラム内で明示しているからいらない気もするけど、まあ
正確にはマニュアルで確認してね。
あとは、I/O(read,write文)はparallel文の外で
するのが吉。この例だと、open(100,....) と write(100)....は
!$omp end parallel
の後でする。ふつうI/OはプライマリのCPUが単独で担当させる方が安全。
同じファイルに複数のプロセスが書き込みしようとすると
順序の保証が無くなるのであとで使いにくいし、書き込みの順番待ちが
発生するのでのろくなる。
乱数代入のループだけなら1/2になっている可能性大。そうなら
作ったコードは一応OpenMPとして動作している・・・と思う。
環境変数で使うCPUの数を指定してみて。
setenv OMP_THREAD_NUM 2
とか。プログラム内で明示しているからいらない気もするけど、まあ
正確にはマニュアルで確認してね。
あとは、I/O(read,write文)はparallel文の外で
するのが吉。この例だと、open(100,....) と write(100)....は
!$omp end parallel
の後でする。ふつうI/OはプライマリのCPUが単独で担当させる方が安全。
同じファイルに複数のプロセスが書き込みしようとすると
順序の保証が無くなるのであとで使いにくいし、書き込みの順番待ちが
発生するのでのろくなる。
乱数代入のループだけなら1/2になっている可能性大。そうなら
作ったコードは一応OpenMPとして動作している・・・と思う。
184180
2009/03/09(月) 17:16:44 >>183
ありがとうございます。実行シェルは作らず、そのまま
$time ./test_omp.out
という風にやっていました。これから実行シェルを作って見ようと思います。
あと、i/oを外に書いたら、確かに一割ほど速くなりました。
でも、それでも圧倒的にOpenMPは遅いです...
ありがとうございます。実行シェルは作らず、そのまま
$time ./test_omp.out
という風にやっていました。これから実行シェルを作って見ようと思います。
あと、i/oを外に書いたら、確かに一割ほど速くなりました。
でも、それでも圧倒的にOpenMPは遅いです...
185180
2009/03/09(月) 17:18:47 乱数を使わないプログラムだとOKでした!!
~/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%!!乱数発生器がパラレルに対応していなかったようです。
アドバイス、ありがとうございました。
~/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%!!乱数発生器がパラレルに対応していなかったようです。
アドバイス、ありがとうございました。
186183
2009/03/10(火) 04:04:33 あ、そっか
乱数生成って種を使いまわすから、並列のときは最初に疑うべきだったね。
あまり役に立たなかったっぽいけど、
とりあえず、おめでとう。
乱数生成って種を使いまわすから、並列のときは最初に疑うべきだったね。
あまり役に立たなかったっぽいけど、
とりあえず、おめでとう。
187デフォルトの名無しさん
2009/04/19(日) 07:32:44 基本的な質問です。
#pragma omp for
でループを分割してもompを使わないときと差が出ないのですが
もしかしてループの外の資源にアクセスするとき、各スレッドは
排他制御してるってことなんでしょうか。
SSEとかで要素に演算を加えてるだけなんですけど・・・
外から渡された配列とか、mallocしたメモリとか、分割して処理
したいんですが、どこをどういじると改善されるのでしょう?
#pragma omp for
でループを分割してもompを使わないときと差が出ないのですが
もしかしてループの外の資源にアクセスするとき、各スレッドは
排他制御してるってことなんでしょうか。
SSEとかで要素に演算を加えてるだけなんですけど・・・
外から渡された配列とか、mallocしたメモリとか、分割して処理
したいんですが、どこをどういじると改善されるのでしょう?
188デフォルトの名無しさん
2009/04/19(日) 09:11:48 >>187
確認だけど #pragma omp for を parallel リージョンで囲んでる?
もし囲んでないなら #pragma omp parallel for としないと並列化されないよ。
確認だけど #pragma omp for を parallel リージョンで囲んでる?
もし囲んでないなら #pragma omp parallel for としないと並列化されないよ。
189デフォルトの名無しさん
2009/04/19(日) 10:08:48190デフォルトの名無しさん
2009/04/28(火) 10:36:42191デフォルトの名無しさん
2009/05/08(金) 04:21:24 OpenMPで並列化することをやってみたのですが、
GCCの方が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 }
GCCの方が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 }
192デフォルトの名無しさん
2009/05/08(金) 04:25:11 >>191
ちなみにCorei7 965での話です。
ちなみにCorei7 965での話です。
193デフォルトの名無しさん
2009/05/08(金) 09:10:20 >>191
>何かいけないことはありそうでしょうか?
・オプション指定辺り。
・時間の計測方法。
見たところ、gccにはunrollのヒントを与えているのにiccには与えていないように見える。
icc11が標準でunrollしたかどうか、記憶していないが影響があるかも知らん。
それと、gccでもiccでも言えることだがソース全部を見ないことには細かいことは判らん。
例えば、icc -fastでOpenMPを使わない場合の所要時間を測ってみてはどうだろう。
いずれにしても、iccスレ向きのネタになりそうだが。
>何かいけないことはありそうでしょうか?
・オプション指定辺り。
・時間の計測方法。
見たところ、gccにはunrollのヒントを与えているのにiccには与えていないように見える。
icc11が標準でunrollしたかどうか、記憶していないが影響があるかも知らん。
それと、gccでもiccでも言えることだがソース全部を見ないことには細かいことは判らん。
例えば、icc -fastでOpenMPを使わない場合の所要時間を測ってみてはどうだろう。
いずれにしても、iccスレ向きのネタになりそうだが。
194デフォルトの名無しさん
2009/05/08(金) 12:03:19 shared属性になる変数を大局変数で指定してるよね?念のため。
ifortだと-O2以上でunrollingはするけどiccだとどうなんだろう。
ifortだと-O2以上でunrollingはするけどiccだとどうなんだろう。
2009/05/08(金) 23:49:12
ICCなら-QaxSSE4.2くらいは最低限だろう。
196デフォルトの名無しさん
2009/05/09(土) 04:30:16 -ax??? /Qax???
ってかえって遅くなること無い?
コードにもよるだろうけど自分のはかえって遅くなるから切ってる
ってかえって遅くなること無い?
コードにもよるだろうけど自分のはかえって遅くなるから切ってる
197デフォルトの名無しさん
2009/05/09(土) 07:47:19 結局いろいろなオプションを試してみましたが、 iccはgccには歯が立ちませんでした。
iccは結構高いので、かなりガッカリしてます。orz...
iccは結構高いので、かなりガッカリしてます。orz...
2009/05/09(土) 11:34:06
たしかにlibgompは優秀
SIMD化されてないように思えるのだが
kをOMPによる並列化対象から外して-QxSSE4.2とかってのはどう?
たしかSIMD化とスレッド化は両立できなかったような
SIMD化されてないように思えるのだが
kをOMPによる並列化対象から外して-QxSSE4.2とかってのはどう?
たしかSIMD化とスレッド化は両立できなかったような
199デフォルトの名無しさん
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 コード晒さずに結果だけ書かれてもな
299デフォルトの名無しさん
2010/06/01(火) 23:45:19 #pragma omp parallel for private(共用しない変数) num_threads(スレッド数)
300デフォルトの名無しさん
2010/06/02(水) 00:00:30 まさかshare変数をnewしたの?
301デフォルトの名無しさん
2010/07/15(木) 01:58:36 よってたかって new か・・・・恐いな。
というかどうなるんだろう?
というかどうなるんだろう?
302デフォルトの名無しさん
2010/09/12(日) 05:59:15 この板では意味ないだろうけど・・・無意味にあげておく
303デフォルトの名無しさん
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;
}
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;
}
304デフォルトの名無しさん
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;
}
フラグを使うのはスレッド間の同期に必要なので、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;
}
305デフォルトの名無しさん
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
そのやり方はスマートだしちゃんと規格に準拠してるね
正月最後の休みを使って公式にある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の拡張)、
例えそれが実行されなくとも、性能がガタ落ちになるようだ。理由は不明だが。
例えそれが実行されなくとも、性能がガタ落ちになるようだ。理由は不明だが。
LinuxでもしCPUに空きがあるなら、並列数をあげるようにしたいのですが、どのようにすればいいのでしょうか?
308デフォルトの名無しさん
2011/04/23(土) 16:01:03.61 linuxでノンブロッキングなconnectって
connectよんでからselectで待つのが定石だと思ってたけど
connectが成功を返すまでsleepはさんでコールし続けるってコードを見かけた
これってありなの?
connectよんでからselectで待つのが定石だと思ってたけど
connectが成功を返すまでsleepはさんでコールし続けるってコードを見かけた
これってありなの?
309デフォルトの名無しさん
2011/04/23(土) 19:20:41.40310デフォルトの名無しさん
2011/04/25(月) 18:50:56.39 >>309
すまぬ、誤爆したうえ放置してた
すまぬ、誤爆したうえ放置してた
311デフォルトの名無しさん
2011/05/19(木) 08:24:03.85 omp_set_num_threadsってOpenMPのスレッド内で呼んでも有効にならないの?
312デフォルトの名無しさん
2011/05/23(月) 11:29:46.68 >>311
スレッドを幾つ起動するかを、起動してから指定するの?
スレッドを幾つ起動するかを、起動してから指定するの?
313デフォルトの名無しさん
2011/07/01(金) 06:24:21.77 VC++2010でシングルスレッドのループが並列化したループの有無によって
速度変わってしまうのですが、原因分かりませんか?
ttp://ideone.com/Yn67n
速度変わってしまうのですが、原因分かりませんか?
ttp://ideone.com/Yn67n
314デフォルトの名無しさん
2011/07/01(金) 12:39:39.32315デフォルトの名無しさん
2011/07/01(金) 14:43:07.70 clock()はCPU時間を取得するもの
なので、裏で走るスレッドの実行時間も加算される
実時間で計測する関数を使うようにしてみればいい
なので、裏で走るスレッドの実行時間も加算される
実時間で計測する関数を使うようにしてみればいい
316313
2011/07/01(金) 15:14:31.88 原因をやんわりとではありますが掴めた気がします。
ttp://ideone.com/6g1yy
上記のコードの様に、時間取得用変数にvolatileをつけると並列ループの有無に関わらず
シングルスレッドループの速度が一定となりました。
また、時間計測処理を省いて体感で測ってみましたが、
こちらでも速度が一定な感があります。
(体感の為誤差は確認出来てませんが)
この事から、時間取得とOpenMP有効時の最適化は相性が悪いのではないかと思います。
根本的な解決にはなってませんが、回避策は分かりました、有難うございました。
ttp://ideone.com/6g1yy
上記のコードの様に、時間取得用変数にvolatileをつけると並列ループの有無に関わらず
シングルスレッドループの速度が一定となりました。
また、時間計測処理を省いて体感で測ってみましたが、
こちらでも速度が一定な感があります。
(体感の為誤差は確認出来てませんが)
この事から、時間取得とOpenMP有効時の最適化は相性が悪いのではないかと思います。
根本的な解決にはなってませんが、回避策は分かりました、有難うございました。
317デフォルトの名無しさん
2011/07/01(金) 15:15:14.35 リロードしてませんでした・・・
>>315そうしてみます、有難うございます。
>>315そうしてみます、有難うございます。
318デフォルトの名無しさん
2011/07/17(日) 14:48:54.13 taskとsectionの使い分けって?
319デフォルトの名無しさん
2011/08/11(木) 16:34:58.28 fortran90でプログラミングしてるのに、
「C/C++プログラマーのためのOpenMP並列プログラミング」を買ってしまったんだが、
大まかな部分ってCもfortranも同じなのかな?
「C/C++プログラマーのためのOpenMP並列プログラミング」を買ってしまったんだが、
大まかな部分ってCもfortranも同じなのかな?
320デフォルトの名無しさん
2011/08/11(木) 19:04:57.30 その本を窓から投げ捨てて、「fortran90 OpenMP」でググって出たPDFを読んだ方が100倍マシだよ。
321デフォルトの名無しさん
2011/08/11(木) 23:46:57.30 >>320
おっけ今から全力でぶん投げてくる
おっけ今から全力でぶん投げてくる
322デフォルトの名無しさん
2011/08/22(月) 01:58:44.67 くれ。
いや、どうせなら
図書館にでも寄贈してやってくれ
いや、どうせなら
図書館にでも寄贈してやってくれ
323デフォルトの名無しさん
2011/08/22(月) 20:50:41.53 OpenMPのスタティックなライブラリってないの?
VCだとMP使うと再頒布可能パッケージが必要だ。
VCだとMP使うと再頒布可能パッケージが必要だ。
324デフォルトの名無しさん
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使う」ってするだけでできるようにしたらいいと思うんだけど。
(配布時は別途対応するにしても)
> 先ほど構成を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使う」ってするだけでできるようにしたらいいと思うんだけど。
(配布時は別途対応するにしても)
325デフォルトの名無しさん
2011/08/23(火) 01:32:00.61 俺はフリーだろうとシェアウェアだろうと、
余計なモノをインストールさせるアプリは使わない。
余計なモノをインストールさせるアプリは使わない。
326デフォルトの名無しさん
2011/08/23(火) 01:56:49.13 Visual Studioなんて眼中に無さそうだね
327デフォルトの名無しさん
2011/08/24(水) 20:10:32.31 >>324
その記事の筆者名でググって見たほうがよい
その記事の筆者名でググって見たほうがよい
328324
2011/08/24(水) 21:41:49.47329デフォルトの名無しさん
2011/11/01(火) 13:47:35.24 C+11のparallel_forだとキャプチャする変数を指定する文法があることから
外側の関数からラムダ関数に変数を渡すっていうオーバーヘッドが
ありそうだけど、#pragma omp parallel forだとそのへんどうなってるの?
外側の関数からラムダ関数に変数を渡すっていうオーバーヘッドが
ありそうだけど、#pragma omp parallel forだとそのへんどうなってるの?
330デフォルトの名無しさん
2011/11/15(火) 14:04:00.87 C++やC99において、OpenMPループの中で、変数を宣言するのは安全なのでしょうか?
例えば、
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もスレッドプライベート変数になると思うのですが…。
何か問題があればご教示をお願いいたします。
例えば、
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もスレッドプライベート変数になると思うのですが…。
何か問題があればご教示をお願いいたします。
331デフォルトの名無しさん
2011/11/15(火) 16:07:23.72 問題ないよ!
Private 扱いの理解で無問題
Private 扱いの理解で無問題
332デフォルトの名無しさん
2011/11/15(火) 17:00:59.88 >331
ありがとうございます。これで安心して宣言できます。
今まではわざわざループの外で宣言していたので…。
ありがとうございます。これで安心して宣言できます。
今まではわざわざループの外で宣言していたので…。
333デフォルトの名無しさん
2011/11/24(木) 16:58:17.76 CreateThreadで作成したスレッド内でompを使うと
スレッドが終了してもゴミスレやメモリが残ってしまうようなのですが
これを解放する関数とかありませんか?
スレッドが終了してもゴミスレやメモリが残ってしまうようなのですが
これを解放する関数とかありませんか?
334デフォルトの名無しさん
2011/11/25(金) 08:06:46.80335デフォルトの名無しさん
2011/11/25(金) 12:24:01.62 _beginthreadex に置き換えてみましたがだめでした。
ompはランタイム関数ではないらしい?
ompはランタイム関数ではないらしい?
336デフォルトの名無しさん
2012/01/14(土) 23:38:53.03 OpenMP3.2とか出てきているみたいだけど、
OpenMPのバリア同期は関数内部でも使えるようになったのかな?
OpenMPのバリア同期は関数内部でも使えるようになったのかな?
337デフォルトの名無しさん
2012/04/20(金) 21:15:47.38 Android の NDK で使える様にならんかなぁ。。
338デフォルトの名無しさん
2012/05/03(木) 21:12:37.13 揚げ
339デフォルトの名無しさん
2012/05/07(月) 19:38:56.61 質問なんですが、
do a=1,10
do b=1,50
call test1(a,b)
call test2(a,b)
call test3(a,b)
enddo
enddo
こんなプログラムを動かしたいんですけど
これをa=1,b=1の時はCPU1がtest1,2,3を動かして、
a=1,b=2の時はCPU2がtest1,2,3を動かして(ry・・・って感じに
プログラムしたいのですが、これはdoループをparallel doで挟むだけじゃダメですか?
do a=1,10
do b=1,50
call test1(a,b)
call test2(a,b)
call test3(a,b)
enddo
enddo
こんなプログラムを動かしたいんですけど
これをa=1,b=1の時はCPU1がtest1,2,3を動かして、
a=1,b=2の時はCPU2がtest1,2,3を動かして(ry・・・って感じに
プログラムしたいのですが、これはdoループをparallel doで挟むだけじゃダメですか?
340デフォルトの名無しさん
2012/05/07(月) 19:40:00.56 >>339ですが
言語はfortranです
言語はfortranです
341デフォルトの名無しさん
2012/05/08(火) 09:21:00.56 例の前に条件を言えよ
342デフォルトの名無しさん
2012/05/08(火) 11:41:50.17 >>339
まあ、ふつうに
do a=1,10
を並列化して様子を見てみればいいんじゃね?
あるいは、
do i=1,10*50
a=(i-1)/50+1
b=mod(i-1,10)
,.,,,,,,,
enddo
として並列すべきループを一つにまとめて
dynamic な並列で処理するとか。
手元に本が無いので dynamic にするやり方がパッと出てこないが
まあ、ふつうに
do a=1,10
を並列化して様子を見てみればいいんじゃね?
あるいは、
do i=1,10*50
a=(i-1)/50+1
b=mod(i-1,10)
,.,,,,,,,
enddo
として並列すべきループを一つにまとめて
dynamic な並列で処理するとか。
手元に本が無いので dynamic にするやり方がパッと出てこないが
343デフォルトの名無しさん
2012/05/08(火) 14:55:56.02 と思ったら、b についての並列部分は
a に依存する可能性があるのか。
その場合は、2つのdo の間に
ディレクティブを入れるしかないな。
というか、まずは質問できるまで
いろいろ遊んでみるべし
a に依存する可能性があるのか。
その場合は、2つのdo の間に
ディレクティブを入れるしかないな。
というか、まずは質問できるまで
いろいろ遊んでみるべし
344デフォルトの名無しさん
2012/05/14(月) 11:39:23.47 privateって同じ変数でスレッドごとに違う数字を使えるってことだと思ってるんだけど、
これって配列をprivateに指定することってできますか?
これって配列をprivateに指定することってできますか?
345デフォルトの名無しさん
2012/05/14(月) 15:04:04.76 できるよ
346デフォルトの名無しさん
2012/05/14(月) 15:07:09.10 あ、あまり大きなサイズの配列を
private にすると、なんとか領域が
デフォを超えてエラーになるので、
何かの環境変数の値を変えないと
いけなかったハズ。
なんだっけ・・・heap だか stack だかいうヤツ。
private にすると、なんとか領域が
デフォを超えてエラーになるので、
何かの環境変数の値を変えないと
いけなかったハズ。
なんだっけ・・・heap だか stack だかいうヤツ。
347デフォルトの名無しさん
2012/05/14(月) 17:44:28.28348デフォルトの名無しさん
2012/05/18(金) 08:23:15.58349デフォルトの名無しさん
2012/05/18(金) 08:42:39.22 通りすがりだけど、
omp_set_lock と omp_unset_lock
これの使い方がいまいちよくわかんないんだよね。
omp_set_lock と omp_unset_lock
これの使い方がいまいちよくわかんないんだよね。
350デフォルトの名無しさん
2012/05/18(金) 08:55:39.47 じゃ、使わなければいいじゃん。
判らんものを無理に使うことはないよ。
判らんものを無理に使うことはないよ。
351デフォルトの名無しさん
2012/05/18(金) 10:24:47.70352デフォルトの名無しさん
2012/05/18(金) 12:14:48.44 >>349
単なるmutexじゃねーか。
単なるmutexじゃねーか。
353349
2012/05/18(金) 13:28:27.29 いじめないでくれよぅ。
shared private reduction
だけで今まで何とかなってたんだよ・・
shared private reduction
だけで今まで何とかなってたんだよ・・
354デフォルトの名無しさん
2012/05/18(金) 14:42:29.77 OpenMPの弊害か。
やっぱりある程度基礎が必要だな。
ちなみに、omp_set_lock/omp_unset_lock
は軽くて便利だぞ。
やっぱりある程度基礎が必要だな。
ちなみに、omp_set_lock/omp_unset_lock
は軽くて便利だぞ。
355デフォルトの名無しさん
2012/07/02(月) 18:29:55.05 これからOpenMP扱う初心者なのですがいきなり躓きました
Win7でVC++2010Expressを使用して
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
printf("OpenMP Spec %d\n",_OPENMP);
return 0;
}
を実行しようとすると、ファイル 'VCOMPD.lib' を開くことができません。と表示され失敗してしまいました
ググったら構成プロパティでOpenMPサポートを「はい」にし、vcomp90.dllをPATHの通ったディレクトリにコピーするこが必要のとのこと
OpenMPサポートは解決したのですが、PATHの通ったディレクトリにコピーしてないから、vcompd.libを開け〜とエラーが起きるのでしょうか?
ちなみにVSコマンドプロンプト(2010)でpathと入力したら多くのディレクトリが表示されどこに入れればいいのか分かりません・・・
どこのディレクトリにコピーすればいいのか教えてください
Win7でVC++2010Expressを使用して
#include "stdafx.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
printf("OpenMP Spec %d\n",_OPENMP);
return 0;
}
を実行しようとすると、ファイル 'VCOMPD.lib' を開くことができません。と表示され失敗してしまいました
ググったら構成プロパティでOpenMPサポートを「はい」にし、vcomp90.dllをPATHの通ったディレクトリにコピーするこが必要のとのこと
OpenMPサポートは解決したのですが、PATHの通ったディレクトリにコピーしてないから、vcompd.libを開け〜とエラーが起きるのでしょうか?
ちなみにVSコマンドプロンプト(2010)でpathと入力したら多くのディレクトリが表示されどこに入れればいいのか分かりません・・・
どこのディレクトリにコピーすればいいのか教えてください
356デフォルトの名無しさん
2012/07/03(火) 12:43:01.12 よく分かってないなら、絶対パスで指定すればいいんじゃね
357355
2012/07/03(火) 12:59:16.53358デフォルトの名無しさん
2012/07/03(火) 14:41:46.91 まずC++を10年勉強しろ
359デフォルトの名無しさん
2012/07/03(火) 15:32:38.77 OpenMP以前にC#とか使ってみ
360デフォルトの名無しさん
2012/07/03(火) 16:31:39.87361デフォルトの名無しさん
2012/07/03(火) 17:19:47.13 エラーに出てるけどビルドに必要なのはVCOMPD.libであってvcomp90.dllじゃないんで
362デフォルトの名無しさん
2012/07/03(火) 19:49:27.49 >>355
VS2010 (=verison 10.0) なのに、なんで vcomp90 (=version 9.0 : VS2008用) を
指定してたりするの?
あと、Debug用ライブラリ (vcompd.lib = Visual C++ OpneMP, debug) 使うなら、
VS2010 Pro (=有料版) が必要。
解決方法を4つ考えてみた:
(1) VS2010 Professional を買う
(2) VS2008 Express + Windows SDK 7.0 を使う
(3) Cygwin や MinGW をインストールして、付属のgcc/g++ を使う
(4) Linux や *BSD を使う (VMware/VirtualBoxでも併用すればよろし)
VS2010 (=verison 10.0) なのに、なんで vcomp90 (=version 9.0 : VS2008用) を
指定してたりするの?
あと、Debug用ライブラリ (vcompd.lib = Visual C++ OpneMP, debug) 使うなら、
VS2010 Pro (=有料版) が必要。
解決方法を4つ考えてみた:
(1) VS2010 Professional を買う
(2) VS2008 Express + Windows SDK 7.0 を使う
(3) Cygwin や MinGW をインストールして、付属のgcc/g++ を使う
(4) Linux や *BSD を使う (VMware/VirtualBoxでも併用すればよろし)
363デフォルトの名無しさん
2012/07/03(火) 20:26:40.35 VC++のOpenMPはデバッグビルドだと_DEBUGをundefしてからomp.hをincludeしないといけないってのが昔あったが
364デフォルトの名無しさん
2012/07/03(火) 23:09:00.31 VS2010 Pro 評価版を Virtual PC とかの捨て環境にインストールすれば vcompd.lib も入ってるけど、これコピーして使ったら逮捕されるかもしれないからやめたほうがいいね。
365355
2012/07/04(水) 16:57:37.98366355
2012/07/24(火) 17:16:07.86 久しぶりの書き込みです
言われた通りVS2008+SDK7.0でopenmpをコンパイラ実行することができました
できればサポ3.0以上を無償ソフトで使えればよかった・・・
言われた通りVS2008+SDK7.0でopenmpをコンパイラ実行することができました
できればサポ3.0以上を無償ソフトで使えればよかった・・・
367デフォルトの名無しさん
2012/08/03(金) 08:51:06.44 メモリのローカリティって何?
368デフォルトの名無しさん
2012/08/03(金) 11:28:21.30 なるべく近いアドレスのデータだけを
369デフォルトの名無しさん
2012/08/27(月) 13:57:29.01 本屋にOpenMPの新しげな本が置いてあったんだけど
あれって買った方がいいと思う?
あれって買った方がいいと思う?
370デフォルトの名無しさん
2012/08/28(火) 00:32:09.61 好きにすれば。
371デフォルトの名無しさん
2012/08/28(火) 08:21:46.94 元IBMのゴルゴ13こと
青山(名前あってるかな?)先生の本がいいからなぁ。
どこかでpdf版もあったと思うけど。
初心者なら青山さんの冊子でしばらく事足りるとおもうし、
だいぶ経験積んでいるのなら、買っても言うのではないかと。
青山(名前あってるかな?)先生の本がいいからなぁ。
どこかでpdf版もあったと思うけど。
初心者なら青山さんの冊子でしばらく事足りるとおもうし、
だいぶ経験積んでいるのなら、買っても言うのではないかと。
372デフォルトの名無しさん
2012/08/28(火) 08:24:31.34 あと、外人さんが書いたものの日本語訳なら
いっそのとこ原書買う方がいいかも。
アマゾンか丸善に
いっそのとこ原書買う方がいいかも。
アマゾンか丸善に
373デフォルトの名無しさん
2012/09/10(月) 09:28:48.06 ひょっとして並列できるところ全部並列化したら
かえって遅くなる?
かえって遅くなる?
374デフォルトの名無しさん
2012/09/10(月) 10:56:02.47 そういうこともある。
375デフォルトの名無しさん
2012/09/12(水) 16:33:48.58 TBBのスレってないんだね
376デフォルトの名無しさん
2012/09/12(水) 16:41:28.82 http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html
std::for_eachがOpenMP使えるみたいだけど
どんな使い方すればいいんんだろ
std::for_eachがOpenMP使えるみたいだけど
どんな使い方すればいいんんだろ
377デフォルトの名無しさん
2012/09/12(水) 18:26:21.73378デフォルトの名無しさん
2012/09/12(水) 23:59:00.24 イテレータの実装はスレッドセーフになってんのかね?
379デフォルトの名無しさん
2012/09/20(木) 00:58:26.64 先週出た Visual Studio Express 2012 for Desktop で、
OpenMP が使えるかどうか試してみた。
WIN32 Release/Debug, x64 Release/Debug のすべてで、
omp_get_num_procs(), omp_get_num_threads() を使ったプログラムを
ビルドして実行できたよ。
OpenMP が使えるかどうか試してみた。
WIN32 Release/Debug, x64 Release/Debug のすべてで、
omp_get_num_procs(), omp_get_num_threads() を使ったプログラムを
ビルドして実行できたよ。
380デフォルトの名無しさん
2012/09/20(木) 02:12:25.71 VS 2010 ExpressはSDK入れても出来なかったのにな
2008はできていたのに
2008はできていたのに
381デフォルトの名無しさん
2012/09/23(日) 23:36:08.84 >>373
アムダールの法則
アムダールの法則
382デフォルトの名無しさん
2012/10/17(水) 09:15:52.02 OpenMP有効で、Core i 3 530(2.93GHz)の環境で
23.66Gflops出た。理論値は23.44Gflopsだが・・
OpenMP簡単でスゲーな
23.66Gflops出た。理論値は23.44Gflopsだが・・
OpenMP簡単でスゲーな
383デフォルトの名無しさん
2012/10/17(水) 17:33:00.60 結果が壊れてないか確認する必要はあるけどね
384デフォルトの名無しさん
2012/10/18(木) 15:22:42.12 spec.org だっけ・・・わすれたwけど
にSMP マシンのテストで
どういうコンパイルオプションを使ったか書いてあるので
それと同じでやってみるとなおいいかも。
ものにもよるけど、経験上は20CPU(コアか・・)くらいまでなら
コア数に比例して上がっていくよね。
大規模流体計算とかだとMPI とかになるだろうけど、
それでも、OpenMP はデュアルコアが一般になった今日では簡単でとても便利だ。
にSMP マシンのテストで
どういうコンパイルオプションを使ったか書いてあるので
それと同じでやってみるとなおいいかも。
ものにもよるけど、経験上は20CPU(コアか・・)くらいまでなら
コア数に比例して上がっていくよね。
大規模流体計算とかだとMPI とかになるだろうけど、
それでも、OpenMP はデュアルコアが一般になった今日では簡単でとても便利だ。
385デフォルトの名無しさん
2012/10/21(日) 22:56:24.36 >>384
OpenMPがいいかMPIがいいかの違いは、
共有メモリがいいか分散メモリがいいかの違いだけ。
大規模問題は往々にしてメモリ帯域が足りなくなったり、ロックの問題が出てくるから、MPIが使われる。
それ以外はOpenMPのほうが有利。
あと、メモリに依存しないオンキャッシュで収まる問題なら、
MPI、OpenMPに限らずほぼコア数にスケールする。
しかし、OpenMPで20コアまでスケールするような問題は見たことがないな。
OpenMPがいいかMPIがいいかの違いは、
共有メモリがいいか分散メモリがいいかの違いだけ。
大規模問題は往々にしてメモリ帯域が足りなくなったり、ロックの問題が出てくるから、MPIが使われる。
それ以外はOpenMPのほうが有利。
あと、メモリに依存しないオンキャッシュで収まる問題なら、
MPI、OpenMPに限らずほぼコア数にスケールする。
しかし、OpenMPで20コアまでスケールするような問題は見たことがないな。
386デフォルトの名無しさん
2012/10/21(日) 23:34:46.32 Opteron 24コアだと8コアくらいまでがリニアに速くなって
それ以上は足せば速くなるけど少しの違いだったな
メモリの帯域が問題だと思ってたけど
それ以上は足せば速くなるけど少しの違いだったな
メモリの帯域が問題だと思ってたけど
387デフォルトの名無しさん
2012/10/22(月) 00:15:04.44 >>386
Opteronで6コア以上だったらNUMAだからメモリバインドをしっかりしないとスピードは上がらんよ。
Linuxならnumactlが必要。Windowsは残念ながらOS任せなので、スケールは難しい。
Opteronで6コア以上だったらNUMAだからメモリバインドをしっかりしないとスピードは上がらんよ。
Linuxならnumactlが必要。Windowsは残念ながらOS任せなので、スケールは難しい。
388デフォルトの名無しさん
2012/10/25(木) 04:31:05.92 MPIだと一部だけパージ可能だからその点は楽
389デフォルトの名無しさん
2013/08/05(月) NY:AN:NY.AN openmp を使って並列化したプログラムを intel fortran コンパイラでコンパイル(最適化は -O0)して4コア(Xeon 5150)のマシンで実行したところ、-openmpオプションの有無によってかかる時間が
有:実時間3m39s、ユーザーcpu時間14m22s
無:実時間2m53s、ユーザーcpu時間2m53s
のようになりました。
つまり openmp で4コアを使っているのに実時間は減っておらず、cpu 時間がコア数の数にだいたい比例して増えています。
まったく同じプログラムを別のマシン Core i5-3470S で同じバージョンの ifort で -openmp オプション付きでコンパイル・実行したところ、かかった実時間は (-optionmp 無しでの実時間)/コア数より少し大きい程度だったので、このマシンでは問題が無さそうです。
どういった原因が考えられますか?
有:実時間3m39s、ユーザーcpu時間14m22s
無:実時間2m53s、ユーザーcpu時間2m53s
のようになりました。
つまり openmp で4コアを使っているのに実時間は減っておらず、cpu 時間がコア数の数にだいたい比例して増えています。
まったく同じプログラムを別のマシン Core i5-3470S で同じバージョンの ifort で -openmp オプション付きでコンパイル・実行したところ、かかった実時間は (-optionmp 無しでの実時間)/コア数より少し大きい程度だったので、このマシンでは問題が無さそうです。
どういった原因が考えられますか?
390デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.ANID:ptOJnDCf!391デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN >>389
ロックのしかたがクソとか
プログラム依存の話なのか環境の話なのか切り分けるために
配列要素を合計するような単純なforループで試してみたらいいんじゃないのかな
CPU時間が増えているということは複数コアが使われているのは確かだと思うけど
普通はコア数に比例してCPU時間が増えてコア数に反比例して実時間が減るよね
ロックのしかたがクソとか
プログラム依存の話なのか環境の話なのか切り分けるために
配列要素を合計するような単純なforループで試してみたらいいんじゃないのかな
CPU時間が増えているということは複数コアが使われているのは確かだと思うけど
普通はコア数に比例してCPU時間が増えてコア数に反比例して実時間が減るよね
392デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN 処理を分割せずに同じ処理をマルチコアで実行してしまっている気がする
393389
2013/08/07(水) NY:AN:NY.AN みなさんありがとうございます。
FGSL のプログラムを使って多数回のモンテカルロ積分をしていて上記のような問題が起きたのですが、private, shared などの指定がまずかったようです。
積分値が異常ではなかったので、答えは間違いないが Xeon では時間短縮できていないと誤解してしまいました。しかし積分値の分散は openmp ありのほうが小さいので、どうも何らかの異常があったようです。
モンテカルロ積分に関係する量をすべて private にし、乱数の種をスレッドごとに異なる値にすることによって、積分値の異常も計算時間の異常も解決したようです。
ありがとうございました。
FGSL のプログラムを使って多数回のモンテカルロ積分をしていて上記のような問題が起きたのですが、private, shared などの指定がまずかったようです。
積分値が異常ではなかったので、答えは間違いないが Xeon では時間短縮できていないと誤解してしまいました。しかし積分値の分散は openmp ありのほうが小さいので、どうも何らかの異常があったようです。
モンテカルロ積分に関係する量をすべて private にし、乱数の種をスレッドごとに異なる値にすることによって、積分値の異常も計算時間の異常も解決したようです。
ありがとうございました。
394デフォルトの名無しさん
2013/11/23(土) 01:04:27.62 critical (name)
のnameってグローバル?
あるライブラリで
#pragma omp critical(hoge)
があった場合、別のライブラリの
#pragma omp critical(hoge)
と衝突する?
のnameってグローバル?
あるライブラリで
#pragma omp critical(hoge)
があった場合、別のライブラリの
#pragma omp critical(hoge)
と衝突する?
395デフォルトの名無しさん
2014/05/08(木) 22:30:36.12ID:9TYJ/CaO >>394
Cの場合、グローバル変数とローカル変数の名前が被っている時はローカル変数の方が優先されるので、衝突は起こりません
Cの場合、グローバル変数とローカル変数の名前が被っている時はローカル変数の方が優先されるので、衝突は起こりません
396デフォルトの名無しさん
2014/11/06(木) 04:20:52.83ID:iaZsweTc 何これ言語?
397デフォルトの名無しさん
2014/12/01(月) 17:06:44.85ID:K0YH10ym あ
398デフォルトの名無しさん
2015/01/21(水) 08:16:38.01ID:2itpjj+z い
399デフォルトの名無しさん
2015/01/21(水) 21:47:03.58ID:WAMGwClq を
400デフォルトの名無しさん
2016/02/05(金) 21:06:34.41ID:pgxZ4RMK つい最近、凝縮体の数値計算でお世話になりました
といっても6時間程度の規模の計算量でしたけど
といっても6時間程度の規模の計算量でしたけど
401デフォルトの名無しさん
2017/04/08(土) 10:41:47.71ID:8WOwQIDe ものすごく過疎っているね
OpenMPでGPUを使う時にC++のvectorくらい使わせてくれないものか
全くの素人だから知らないだけかも知れないけど・・・
OpenMPでGPUを使う時にC++のvectorくらい使わせてくれないものか
全くの素人だから知らないだけかも知れないけど・・・
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 [蚤の市★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ [Hitzeschleier★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★4 [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【悲報】麻生太郎さん、オムツをしていた。晋さん…ここにいたんだね… [731544683]
- トランプ、G7に代わるcore 5を発表 [805596214]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- はいはい
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★5
