1 名前:デフォルトの名無しさん [04/12/08 14:24:34] オフィシャルサイト www.openmp.org/ リンクなどは>>2 以下で
2 名前:デフォルトの名無しさん mailto:sage [04/12/08 14:54:21] ↑
3 名前:デフォルトの名無しさん mailto:sage [04/12/08 17:09:03] 産業的な視点から考えて需要はありますか?
4 名前:デフォルトの名無しさん mailto:sage [04/12/08 17:22:01] NULL
5 名前:デフォルトの名無しさん [04/12/10 05:41:05] >>3 ある
6 名前:デフォルトの名無しさん mailto:sage [04/12/10 07:10:00] OpenMPってなに?
7 名前:デフォルトの名無しさん mailto:sage [04/12/10 08:16:19] 共有メモリ型の並列計算のためのAPI。 対極にあるのが分散メモリ型のMPI。 いずれも計算用途。 pthreadやMPIより、OpenMPによる並列化ははるかに容易。 ただし共有メモリで並列計算するには、マシンのプロセッサ数が並列数以上でなくてはならない。 つまり、マシンのコストが高い。
8 名前:デフォルトの名無しさん [04/12/13 16:00:47] gccにインストールできますか?
9 名前:デフォルトの名無しさん mailto:sage [04/12/13 23:36:26] 共有メモリ型のプログラミングって何十台というPCでできるものですか?
10 名前:デフォルトの名無しさん mailto:sage [04/12/14 02:00:57] >>9 ( ゚Д゚)ポカーン
11 名前:デフォルトの名無しさん mailto:sage [04/12/14 11:20:37] >>9 SDSMとか使ってがんばればできるぞ。 お薦めはしないがなー。
12 名前:デフォルトの名無しさん [05/01/13 02:38:10] よい入門書があれば教えてください
13 名前:デフォルトの名無しさん [05/02/13 04:39:43 ] 初めてのMP
14 名前:デフォルトの名無しさん mailto:sage [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
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になっちまうのかな。スゲエ。
20 名前:デフォルトの名無しさん [2005/05/06(金) 05:11:22 ] OpenMPをVCで使う方法を教えてください
21 名前:デフォルトの名無しさん [2005/05/06(金) 07:39:08 ]
22 名前:デフォルトの名無しさん [2005/05/07(土) 11:38:36 ] >>20 2005β使え。
23 名前:デフォルトの名無しさん [2005/05/14(土) 04:41:12 ] LinuxでOpenMPを使いたいのですが、gccのほかに何をダウンロードすればよいのでしょうか?
24 名前:デフォルトの名無しさん [2005/05/23(月) 08:04:49 ] OpenMPを使う利点を教えてください
25 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 12:54:36 ] >>7
26 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 20:05:51 ] 共有メモリ型擬似4CPUは、もう普及へ向かっているわけだがw CELLは分散メモリだからMPIか?
27 名前:デフォルトの名無しさん mailto:sage [2005/06/16(木) 00:42:33 ] gccに対応したフリーのOpenMPはどこからダウンロードできるのでしょうか?
28 名前:デフォルトの名無しさん mailto:sage [2005/06/26(日) 17:44:34 ] phase.hpcc.jp/Omni/home.ja.html
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
30 名前:デフォルトの名無しさん mailto:sage [2005/08/11(木) 16:14:03 ] 2000年の本だと古いんじゃないかなあ。 Intelのサイトで技術PDF探してみては?
31 名前:デフォルトの名無しさん [2005/08/12(金) 01:20:16 ] >>30 ですよねぇ。こういう方面の技術って、手詰まりなんですかね?
32 名前:デフォルトの名無しさん [2005/08/22(月) 04:23:24 ] OpenMPってpthreadと比較して何が違うのでしょうか?
33 名前:デフォルトの名無しさん mailto:sage [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が分割されているってことですか?
35 名前:デフォルトの名無しさん mailto:sage [2005/11/09(水) 21:46:22 ] 愛を分割してる方
36 名前:デフォルトの名無しさん [2005/11/27(日) 06:12:29 ] インテルのコンパイラにはOpenMPはついてくるのですか?
37 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 10:56:58 ] >>36 日本語(ry icc -openmp hoge.c
38 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 19:13:26 ] Sunのソラリス落とせば OpenMP付のSunのコンパイラも手に入るよ 高性能コンパイラが無料だなんてなあ
39 名前:デフォルトの名無しさん mailto:sage [2005/12/03(土) 12:29:21 ] Athlon系は分散メモリだからOpenMP使えないのかな?
40 名前:デフォルトの名無しさん [2006/01/30(月) 08:24:14 ] >>39 どういう意味?
41 名前:デフォルトの名無しさん mailto:sage [2006/01/30(月) 15:18:18 ] 簡単に並列処理を行わせるようにするためのもの? 将来的にはこういうのが普通に使われるようになるかもね。
42 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 01:28:59 ] GCCも4.2でOpenMP対応するみたいだね。 そしたらいよいよ知名度上がるんじゃないの?
43 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 06:14:02 ] gccがないとOpenMP使えなかった環境てマックくらいじゃない? Windowsもかな
44 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 12:48:54 ] Intel コンパイラはサポートに熱心だよな。 今度Mac版も出るらしいから、Win、Mac、Linuxどの環境でもGCC、IntelコンパイラでOpenMP できるようになる鴨。
45 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 21:19:59 ] >>44 おまい、髭のおっさんだろ。
46 名前:デフォルトの名無しさん [2006/02/17(金) 12:06:20 ] OpenMPが使えるかどうかによってヘッダをインクルードするかどうかを条件分岐したいのですが どのようにしたらコンパイラがOpenMPをサポートしているか調べられるでしょうか?
47 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 16:15:54 ] >>43 VC++8は対応してるよ
48 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 17:36:01 ] >>46 #ifdef _OPENMP #endif
49 名前:デフォルトの名無しさん [2006/03/12(日) 17:43:30 ] GOMPはどこのページからダウンロードできるのでしょうか?
50 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 17:47:28 ] C++相談室で教えてやっただろうが。
51 名前:http://www.vector.co.jp/soft/win95/util/se072729.html mailto:http://msdn2.microsoft.com/ja-jp/library/h2k70f3s.aspx [2006/03/18(土) 21:11:59 ] TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか? そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
52 名前:デフォルトの名無しさん mailto:sage [2006/03/19(日) 09:25:20 ] >>50 kwsk
53 名前:デフォルトの名無しさん mailto:sage [2006/03/19(日) 14:16:22 ] >>52 今はマージされたのがtagsにある。 鯖の健康を損なわない範囲で好きなだけチェックアウトしなさい。
54 名前:デフォルトの名無しさん [2006/04/11(火) 11:57:56 ] OpenMP初めて知りました。こんなに簡単にマルチスレッドプログラムが作れるなんて 時代が変わったようだな
55 名前:デフォルトの名無しさん mailto:sage [2006/04/18(火) 12:54:01 ] 大きい単位で独立性の高いスレッドを切り出すのがパフォーマンスを上げるポイントなので、 細かい単位であっちこちで同期を取るようなプログラムが手軽に作れてしまえるOpenMPは痛し痒し。 激しくパフォーマンスが出なくてシングルで動かしたときより遅くなることも。
56 名前:デフォルトの名無しさん [2006/04/21(金) 15:19:26 ] OpenMPってwindowsでできるの?
57 名前:デフォルトの名無しさん mailto:sage [2006/04/21(金) 15:25:08 ] >>56 VC++ 2005
58 名前:デフォルトの名無しさん mailto:sage [2006/05/02(火) 14:09:55 ] >>55 細粒度はパフォーマンスでないけど、お手軽並列化〜♪って感じなんでないかい。
59 名前:デフォルトの名無しさん [2006/06/02(金) 08:39:59 ] OpenMPってお手軽だけど、効率はあまり良くないよね
60 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 00:55:01 ] モチロンソウヨ
61 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:01:58 ] ハイパースレッディングでOpenMP使うと激しく遅くなるよね。
62 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 22:40:12 ] それは論理CPUにスレッドをバインドすれば なおるんじゃね? どうやってバインドするかしらねーけど。
63 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 23:52:44 ] あまってる演算器や回路をつかって2CPUに見せかけるのがHTだから 行列の計算のような同じタイプの計算を並列化した場合遅くなるのは当たり前。 片方は整数もう片方で実数計算をさせると効果が出るかもしれない。
64 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 01:38:10 ] そうなると #pragma omp for が全滅・・・
65 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 18:15:49 ] 同じ回路を使う場合でもレジスタが倍になって依存性が減るから、パイプラインのストールが減るよ。 あと実数がメインの場合、実数程の負荷は無いにせよアドレスの計算やループカウンタで整数も結構忙しい。 実数をメインにするとそこらへん上手く住み分け出来てると思った。 演算器を効率良く使えてウマー。
66 名前:デフォルトの名無しさん mailto:sage [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使ってますか?
68 名前:デフォルトの名無しさん mailto:sage [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でも導入できる。
69 名前:デフォルトの名無しさん mailto:sage [2006/08/27(日) 16:59:19 ] >>67 うん、普通に使える。 >プログラムが開始する前にエラーが起こります。 ってのがどういう意味かよく分からんし(コンパイル時か実行時か)、 とりあえずエラーメッセージとかソースとか晒してみたら。
70 名前:デフォルトの名無しさん mailto:sage [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 オプションでのコンパイルは出来るからこれで我慢。
71 名前:67 [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割くらい早くなった。 ちなみに、ハイパースレッドのデュアル
72 名前:デフォルトの名無しさん mailto:sage [2006/08/29(火) 13:38:55 ] #pragma omp parallel for reduction(+:s) for ( ... そのプログラムだとこうですか?うちの環境だとHTの1CPUだからかずぶずぶの結果です。
73 名前:デフォルトの名無しさん [2006/10/03(火) 02:54:43 ] OpenMP 入門ありますよ。 www.xlsoft.com/jp/products/intel/docs/OpenMP/html/OpenMP.html
74 名前:デフォルトの名無しさん [2006/10/26(木) 16:01:43 ] その次のステップの入門書がほしい
75 名前:デフォルトの名無しさん [2006/10/29(日) 00:07:31 ] 72>> その意味で ずぶずぶ とはどこの方言?
76 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 08:21:18 ] >>75 東京
77 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 03:38:12 ] g++では利用できないのでしょうか?
78 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 21:45:14 ] >>77 snapshotsとかからGCC 4.2以降を取ってきて試してみろ
79 名前:デフォルトの名無しさん mailto:sage [2006/11/18(土) 02:07:03 ] Openマンコぽこちんか
80 名前:デフォルトの名無しさん mailto:sage [2006/11/20(月) 03:17:24 ] OpenマンPのG☆SPOTに決まってるだろバカか
81 名前:デフォルトの名無しさん [2006/12/03(日) 17:52:02 ] >>70 omp.hがPSDK(SP1)/(R2)に入っていませんでした。 実際には何をインストールなさいましたか。 >>68 マージモジュールを使ったインストール例を参照することは可能でしょうか。 vs6しか使ったことがなく、どうもうまくいきません。 なお、私はVS2005のstd(アップグレード)を使っています。
82 名前:デフォルトの名無しさん [2006/12/24(日) 23:44:00 ] Sun SorilisとVC++(std)の組み合わせで、OpenMPできますか??
83 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 14:20:45 ] >>82 できない
84 名前:デフォルトの名無しさん [2007/02/28(水) 07:03:32 ] OpenMPでスレッド数を取得するには #pragma omp parallel { cout<<omp_get_num_threads()<<endl; } でよいのでしょうか?もっと何かスマートな方法はないでしょうか?
85 名前:デフォルトの名無しさん [2007/03/06(火) 08:50:24 ] #pragma omp sectionsでfor構文でのdynamicスケジュールの様な動作をさせたいのですが、 どのように書けばよいのでしょうか?
86 名前:デフォルトの名無しさん [2007/03/09(金) 12:49:12 ] しらね
87 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 13:28:27 ] >>72-73 OpenMPによる並列プログラミングと数値計算法 www.amazon.co.jp/gp/product/4621077171 とかどーでしょ。 >>84 パラレルリージョンの中でなくてもよいはず。 #ifdef _OPENMP cout<<omp_get_num_threads()<<endl; #endif などとすればよいかと。
88 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:10:13 ] omp_get_num_threads() はその時点でスレッドチームを構成しているスレッドの数を返すから 逐次実行部分で呼ぶと 1 を返す。
89 名前:デフォルトの名無しさん [2007/03/10(土) 16:00:16 ] #pragma omp parallel { #pragma omp single cout<<omp_get_num_threads()<<endl; }
90 名前:デフォルトの名無しさん [2007/03/25(日) 22:33:15 ] program main !$ use omp_lib implicit none character(len=4),parameter :: str(0:2) = ["hage","hoge","huge"] print *, "Hello, World!" !$omp parallel num_threads(3) !$ print *, trim(str(omp_get_thread_num())) !$omp end parallel end program main
91 名前:デフォルトの名無しさん [2007/04/02(月) 18:31:00 ] レベルの低い人向けの商売ってあるじゃないですか たとえば、カレーライス。子供の食い物ね。マクドナルド。通はモスバーガーでしょ? 野球だと、巨人。クルマだと、トヨタ。音楽だと、ミスチル。政治だと、自民党。 ビートルズだと、ポールの曲。音楽分かってる人はジョンですよね。 マンガだと、手塚治虫や藤子不二雄。今更読む必要もないw 小説だと、古本屋に山積されてる赤川次郎。小説マニアは読みませんねw 長嶋茂雄・新庄剛志・三浦カズ・ゴン。名前だけでむかつきますね。 DELLってつまりそういうレベルの低い人向けの商品ですよね。 歴史を作るのは我々マニアですから、記憶からはいつか消え去るんですよDELLはw
92 名前:デフォルトの名無しさん [2007/04/07(土) 02:30:59 ] C++のクラスでstaticな変数を使いたいのですが、OpenMPの中で更新した場合、安全に更新されるのでしょうか?
93 名前:デフォルトの名無しさん mailto:sage [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::::::::::::ミ {,_.イニノ 彡ソ/ノハ ト、 \ / ,イ 川ハ ヾー‐'^┴
95 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 09:18:04 ] >>92 ちゃんと排他制御や共有のための宣言をすれば問題ないかと。 パラレルリージョンの中で single で1プロセスだけがアクセスするとか reduction で更新するとかね。
96 名前:デフォルトの名無しさん [2007/04/12(木) 10:50:30 ] 祗園精舎の鐘の声 諸行無常の響きあり 娑羅双樹の花の色 盛者必衰の理をあらはす おごれる人も久しからず 唯春の夜の夢のごとし たけき者も遂にはほろびぬ 偏に風の前の塵に同じ
97 名前:デフォルトの名無しさん [2007/06/02(土) 15:05:34 ] 一般論として、MPIよりもOpenMPの方が性能が低下する(遅くなる)ということはありえますか? MPIのプログラムをOpenMPを使って書き換えたのですが、3割近く遅くなってしまいました。
98 名前:デフォルトの名無しさん [2007/06/02(土) 15:29:34 ] 一般論では遅くなります
99 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 15:37:48 ] きちんとチューニングされていれば、MPIの方が速い。 あとはpthreadを使って自分で書くという手もある。
100 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 15:42:04 ] OpenMPはお手軽。だからそれに伴って犠牲になっている部分もある。それが性能。
101 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 17:50:17 ] MPIで並列効果出せるほどの大きな粒度ならOpenMPにする必要はない。 OpenMPの利点は小さな粒度の並列処理が簡単に書けることとシングルソースで 非OpenMP環境でもビルドしてテストできること。 それから既存のソースにディレクティブ挿入するだけで並列化できるところかな。
102 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 06:10:20 ] >>101 同じ粒度でも、OpenMPの方が遅くなってしまいます。 OpenMPはスレッドレベルでの切り替えなので、プロセスレベルのMPIよりも、効率が良いと思っていたので 何が問題なのか、測りかねています。
103 名前:デフォルトの名無しさん [2007/06/03(日) 08:40:24 ] 競合してるんじゃない?
104 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 10:07:50 ] キャッシュのヒット率の差だと思う もし、pragma omp forでやっているのなら、for文を二つに分けて pragma omp parallelで二つに並列してみたら?
105 名前:デフォルトの名無しさん [2007/06/03(日) 10:15:44 ] windows はaffinty maskを使えないの?
106 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 11:14:45 ] >>102 複数のスレッドが同じ行列要素とかメモリアドレスを参照しているなら効率は たいてい悪くなるし、プロセスの立ち上げより計算時間の方が長いのが普通だから OpenMPの宣伝文句に騙されない方がいいと思う。 モニタリングツールがあるなら>>104 の原因が疑われるからキャッシュのヒット率 みてみたらいいと思うけど、OpenMPの困る所は性能がコンパイラとライブラリに 依存しすぎることだから、どのコンパイラ使ってるかで全然違うので何とも言えないな。
107 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 12:26:25 ] 環境は、Fedora5にデュアルコアOpteronx2の計4cpuをインテルコンパイラを使って、コンパイルしています。 系を大きくしても(すなわち、スレッド生成頻度をかなり下げても)300%程度で飽和してしまいます。 以前、Redhat+Xeon+インテルコンパイラの時は,2CPUで200%(4CPUではないのであまりよい比較ではありませんが) 計算速度も倍になっていたので、コンパイラの問題なのか、opteronの問題なのか、そのあたりもう少し調べてみたいと思います。
108 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 12:32:32 ] 1CPU から 2CPU にスケールするのと、4CPU にスケールするのとじゃ 全然話が違うからね。
109 名前:デフォルトの名無しさん [2007/06/03(日) 12:57:34 ] 4cpuならうまく組めば1割も落ちないよ スレッドチェッカーで確認してみな
110 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 14:58:41 ] >>107 OpteronってことはNUMA構成で使ってるってことはないかな? OpenMPはSMP用だからNUMAだと効率ががた落ちになることがあるよ。 あと趣味でやってるのでなければCPU使用率よりも計算までの終了時間で考えた方がいいと思う。 メモリ競合起こすとCPU100%でも計算速度半分なんてざらだから。
111 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 15:24:23 ] カーネルがスレッドのスケジューリングとメモリページの割当を上手く管理していれば Dual Core x 2 Socket くらい何とかならないの?
112 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 15:30:27 ] CPUとSIMDで行列計算をうまく分散してくれるコンパイラはないものか
113 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 15:42:04 ] lapackのSIMD化でダメなの? そんなのはいくらでもあるが
114 名前:デフォルトの名無しさん [2007/06/04(月) 06:27:01 ] OpenMP節を入れ子にすると、並列化されなくなってしまいます。 入れ子のOpenMP節を並列化する方法はないものでしょうか?
115 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 09:06:41 ] >>114 OpenMP + nested loopで検索すればたくさんでてくるよ
116 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:29:55 ] インテルのスレッディング・ビルディング・ブロックとOpenMPの違いって何?
117 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:08:38 ] OpwnMP: 共有メモリ型並列計算機におけるマルチスレッド並列プログラミングのためのAPI インテル スレッディング・ビルディング・ブロック: C++用ランタイム・ライブラリー
118 名前:デフォルトの名無しさん mailto:sage [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にスパイウェアが入ってるのか?
119 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 01:13:00 ] Microsoft Windows Software Development Kit for Windows Vista vcredist_x86.exe この2つでVC2005Expressでも使えた。
120 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:49:32 ] 他人の書いた数値解析のプログラムをOpenMP対応にしている度素人です。 まずテストに単にパラレルリージョンを指定しただけのプログラムを走らせたら パフォーマンスが半分くらいにまで落ち込んで困っています(スレッド数はCPU数以下です)。 しかもパラレルリージョンの範囲が広ければ広いほどパフォーマンスが悪化するのですが これは当然なのでしょうか? ちなみにパラレルリージョン内を並列化しても1CPUのときより10%くらい悪いです。 環境はOSはRHEL、インテルのfortranコンパイラです。
121 名前:デフォルトの名無しさん [2007/09/19(水) 23:54:02 ] 的外れだが同じ作業をしていた素人として。 スレッド生成・消滅のオーバーヘッドは思いのほか大きい $omp parallel 〜 $omp end parallel が極めて複数回呼ばれる場合にパフォーマンスは非常に落ちる ネストループ内部、100万回呼ばれるルーチン内など シングルの作業内容をマルチ対応にするのは面倒ですね。 gprof等でタイムクリティカルな部分を探し、手を入れてみましょう
122 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 08:22:47 ] パラレルリージョンは例えば並列計算と逐次計算を交互にやるときに 逐次計算のたびにパラレルリージョンから出入りするオーバーヘッドを避けるために 使ったりするのが普通だと思う。 単にパラレルリージョンを指定しただけでは並列化による時間短縮はまったく起こらない。 並列化のオーバーヘッドがかかるだけ。 ループを並列化するとか、パラレルリージョンの中でデータ並列なりタスク並列の計算をするとかしないと。 一番大事なことはアルゴリズム中の並列性を見出すことかと。 並列性のない逐次アルゴリズムだとどうあがいてもパフォーマンスは出ない。
123 名前:120 mailto:sage [2007/09/21(金) 00:15:35 ] 今日いろいろ簡単なテストプログラムを組んでいたのですが かなり大きな配列を含む範囲を 単にパラレルリージョンに指定しただけのプログラムは 1CPUのときの1/3程度まで低下すると言う現象がありました。 (並列化を指定すると4CPUで3.8倍程度にちゃんとなりました) 同じ動作をするスレッドが複数あってメモリが競合してるんですかね? あしたスレッドチェッカーの体験版でも落として調べてみます。 >>121 今日試してみたところうちの環境では 100000回ループするプログラムの内と外に $omp parallel 〜 $omp end parallel をおいたプログラムをそれぞれ比較したのですがほとんど差はありませんでした。 リージョン内は簡単な内容だったのですが、 リージョン内のプログラムの内容によってもスレッド生成・消滅のオーバーヘッドは変わってくるんですかね? >>122 並列化の指定をする前にまず並列化予定の範囲をパラレルリージョン指定して ちゃんと動くのかを確認したかったのです。 長文失礼
124 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 15:20:28 ] sections分割でsection分けを行った時に、 自分でどのスレッドに割り当てる的な事は できないのでしょうか?
125 名前:120 mailto:sage [2007/10/25(木) 21:51:43 ] いまさらながら経過報告 元となったプログラムが古いものだったので、配列をallocateするのではなく メインの宣言でかなり大きくとっていたのですが、 それを必要量にしたところかなり早くなりました。 ただ強い最適化(fastオプションとか)つけると OpenMPはそんなにスピードが上がらずシングルスレッドに追いつかれてしまうんですけどね。
126 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 04:25:29 ] サーセーン。素人の恥ずかしい質問です。 OpenMPは従来の(OSなどに付属した)スレッドのライブラリの 置き換えとしては使用すべきではないのでしょうか? (どこかで逐次プログラムの並列化がOpenMPの利用の前提であるとか見たのですが、) 並列で動くことが前提であるプログラム(例:HTTPデーモンなど)を OpenMPを使って書こうと思っているのですが、止めたほうがいいのでしょうか・・・。
127 名前:126 [2007/11/30(金) 04:26:29 ] うわぁ、このスレ伸びてないんだなあ。悪いけどage
128 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 01:58:56 ] OpenMP はひとまとまりの大きなデータ(行列とか画像とか)に対する計算を 複数のスレッドで並列化するのに向いている希ガス。つまりデータ並列向き。 データ並列性のある for 文で書かれたアルゴリズム(行列ベクトル積とか 画像のしきい値処理とか)は parallel for ディレクティブでいとも簡単に並列化できる。 そこが OpenMP のおいしいところ。 タスク並列の並列プログラム、つまり各スレッドが独立に違う処理をする (例えばそれぞれ別のクライアントからの要求を処理する)並列プログラムも OpenMP で書けるけど、あまりうまみがないと思われ。 逐次プログラムを並列化するのが前提というのは違う気がする。 ただ、例えば parallel for ディレクティブしか使ってない並列プログラムは コンパイラの OpenMP 機能をオフにすれば逐次プログラムとしてコンパイルできる。 そこが他の並列化手法(POSIXスレッドとかMPIとか)と違うところ。 でも、OpenMP機能をオフにするとコンパイル不能になる並列プログラムも書けるし、 parallel sections を使ったプログラムは逐次プログラムとしてコンパイルはできても 意味が変わってしまう(各セクションが順番に逐次実行される)。 つまり、この手のプログラムは並列で動くことが前提で書くわけだ。 結局のところ、OpenMP を使うのが妥当かどうかは126さんがやりたいことに依る。 並列性の高いデータ並列の計算をやりたいなら使う価値がある。
129 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 02:04:37 ] 追加。OpenMPでHTTPデーモンを書いた、という報告を見たことがあったのを思い出した。 www.nic.uoregon.edu/iwomp2005/Papers/f35.pdf 俺は詳しく読んでないので内容についてはノーコメント。参考までに。
130 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 13:39:21 ] 並列化した部分じゃbreakやreturn使えないし、難しかっただろうなぁ。 普通のWindowsプログラムでCreateThreadをOpenMPで置き換えろって言われたら・・・ メッセージポンプ使ってなんとかなるんだろうか
131 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 23:44:51 ] >並列化した部分じゃbreakやreturn使えない kwsk
132 名前:126 mailto:sage [2007/12/03(月) 05:18:50 ] スレッドを横断したbreakやreturnが出来ないということでは? 字句上は単なるスコープにしか見えないので、出来そう・・・しかし出来ないもどかしさ(何)。 >>128 ご返答ありがとうございます。 128氏から頂いた意見も考慮に入れつつ、色々と検討してみた結果、 今回やりたいことにはOpenMPは適していない、という判断に至りました。 しかし実験的にHTTPサーバらしきものをOpenMPを使って書いてみたところ、 簡単なものならかなり簡潔に書けることも分かり、、全てでなくとも部分的にOpenMPを使うのもありかと思えました。
133 名前:デフォルトの名無しさん [2007/12/05(水) 05:51:33 ] >>119 の方法で VC2005ExpressEditionで使えるようになったはいいんだけど forループの所に #pragma omp parallel for ってやっても error C3005: ';' : OpenMP 'parallel' ディレクティブでは予期しないトークンです とかいうエラーが発生して使えないんだけど何故なの?? #pragma omp parallel sections とか他のは通るけど,forループのだけどうしても使えん・・・ #pragma omp parallel { #pragma omp for ・・・ } にすると error C3001: 'if' : OpenMP ディレクティブ名が必要です って言われる
134 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 18:47:08 ] >133 #pragma .. の行末に ';' がついてるとかいうオチだったら素っ裸で町内1周してこい
135 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 15:12:19 ] すでにあるプログラムをOpenMP化しようと思うのですが、以下のような場合にfuncがスレッドセーフで再入可能であれば問題ないですか? #pragma omp for for(int i=0;i<100000;i++) { func(i); }
136 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 15:53:58 ] 問題ないです func()の定義が別ファイルでもおk
137 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 16:38:48 ] >>136 ありがとうです。 OpenMPはSMPで使う分にはかなり便利ですね。
138 名前:sage [2008/02/06(水) 21:13:32 ] IntelFortran10.0で数値解析やってるんですけど サブルーチン内で並列化領域をつくるのと サブルーチンごとメインに展開して並列化領域つくるのとで 並列化時の速度が異なったり(逐次だとほぼ一緒) 逐次計算部分にある並列化と関係ないサブルーチンを コメントアウトするかしないかで並列化時の速度向上が変わります。 並列スレッドのスタックサイズとかの問題なんでしょうかね。
139 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:02:55 ] 速度や速度向上が具体的にどう違うの?
140 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 00:50:56 ] まず、各CPUに処理が効率よく割り振られているか、CPUの負荷率を見てみたらいいんじゃないか?
141 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:49:52 ] VC++2008でコンパイルするとVCOMPD.libが無いというエラーが出ます。 VCOMPD.libはどこで手に入りますか?
142 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:40:58 ] >>141 VS2005だとPro版以上でサポート。VS2008も同じだと思う。
143 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 20:12:04 ] >141 vcompd.libはProfessional版以外手に入れる方法はない。 ただしリリースビルド版のライブラリであるvcomp.libは Windows Server 2008 SDKをインストールするとゲットできる。 デバッグビルドでもリリースビルドのライブラリ(vcomp.lib)を リンクする設定にするとExpressでもOpenMPが自由に使用可能。
144 名前:デフォルトの名無しさん mailto:sage [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をいれといたらよいだけ?
145 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:26:50 ] nowaitを入れた場合、どのスレッドが生き残るのでしょうか? それとも、並列実行するところはすべて子スレッドで、実行中のスレッド数が最大より1少なくなった時点で メインスレッドが継続されるのでしょうか?
146 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:42:54 ] read/writeのtimeoutを入れておけば、なんとかなりますか。 しかし、openmp(のsections)では、スレッドは、死にますか? 一応、処理が終われば、lockが外れるだけでしょう(gccの実装ではそのようです)
147 名前:sage [2008/03/01(土) 00:47:47 ] スレッドプロファイラー使ってる人居るかな。 あのREGIONS VIEWの各リージョンの範囲はなにで決まってるの? 同期から同期の間かと思ってたんだけどソースの位置みるとちがうっぽい。 最適化オプションのせいでソースとの対応がとれなくなってるのかしらん。
148 名前:138 [2008/03/04(火) 19:19:48 ] chkstkという関数に要する時間が OpenMPにすると凄まじく増えているのが原因のようでした。 関数に引き渡す配列が多すぎなのか。
149 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 10:57:30 ] >>148 私もintel fortran10+mkl+openmpで数値計算しています openmp初心者の私は、intelのopenmpのドキュメントを参考にしました。 parallel do ,sections ,reduction,privateあたりしか使っていませんが、オリジナルの プログラムのマルチスレッド化は割と簡単に出来、計算時間も「ほぼ」スレッド数倍 にできました。 (当然ですがparallel region部分です。プログラム全体ではありません) そもそもchkstkは並列処理できるかどうかを検討してはどうですか。 各スレッドで相互参照するのであれば、reduction宣言等が適切であれば問題ないはず。
150 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:52:21 ] >>148 関数のエントリ近辺で chkstk が呼び出され、必要に応じてスタックが拡張される (実メモリが割り当てられる)わけですが、シングルスレッドの場合は一度拡張された スタックはもちろん再利用されるので負荷が軽いわけです。 スタックはリニアなアドレスに(ページング機構を用いて)メモリを割り当てる必要があるため、 割り当てられたページを再利用できない場合には時としてヒープよりも確保・解放が重い メモリとなります。マルチスレッドでスタックが頻繁に成長するような場合には、メモリを スタック上に取るのをやめて、std::vector などを用いてヒープから確保した方がよいと 思います。 たどたどしい説明になってしまった。
151 名前:デフォルトの名無しさん mailto:sage [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 じゃ使えねーってハナシになるんですが・・・・
152 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 17:00:29 ] >>143 Windows Server 2008 SDKにvcompd.libも入ってるみたい。
153 名前:デフォルトの名無しさん mailto:sage [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 で行いました。
154 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 15:30:42 ] Open => OpenMPのミスです。
155 名前:デフォルトの名無しさん mailto:sage [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=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 名前:デフォルトの名無しさん mailto:sage [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_); } }
158 名前:デフォルトの名無しさん mailto:sage [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=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 にしちゃうんだけどね。
160 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 14:19:32 ] C/C++だとmin/maxは演算子どころかビルトイン関数ですらないから無理だと思う。
161 名前:159 mailto:sage [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でコンパイルしてもちゃんと動く・・・はず。
162 名前:159 mailto:sage [2008/08/30(土) 17:19:44 ] reductionmax は reduction(max ね。
163 名前:デフォルトの名無しさん [2008/09/04(木) 22:56:21 ] 2次元配列変数は、reductionで使えないんでしたっけ?
164 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:20:49 ] NG。 ifortは出来た気がする。
165 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:26:10 ] #pragma omp for #pragma omp parallel for てなにが違うの?
166 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 17:53:44 ] #pragma omp for は #pragma omp parallel ブロックの中に書く必要があるが、 parallelブロックにforブロックが1つのことも多いので #pragma omp parallel for でまとめて書けるようにしてある。
167 名前:デフォルトの名無しさん mailto:sage [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には入ってくれません…
169 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:22:31 ] 並列化前後で答えが変わってしまいます。どこがおかしいのでしょうか? //画像上でランダムで数点選んできた線との距離が最少になる座標を算出 #ifdef _OPENMP #pragma omp parallel for private(data,x,y,a,b,i,error) #endif for(j=0;j<KURIKAWSIKAISUU;j++){ better_error[j] = 1000;//距離初期化 for(y=100;y<=HEIGHT-100;y++){ for(x=100;x<=WIDTH-100;x++){ error = 0; get_randum_number(data); //ランダムでデータNo.を選択 for(i=0;i<ITIDONIERAZUKAZU;i++){ error += abs(y - a[data[i]]*x - b[data[i]]) / sqrt(1+pow(a[data[i]],2)); } error /= select; if(better_error[j] > error){ better_error[j] = error; ans[j].x = x; ans[j].y = y; } } } }
170 名前:デフォルトの名無しさん [2009/01/21(水) 14:08:01 ] よくわかんねけど get_randum_number で配列dataにはいる乱数が変わるからじゃね? たぶん呼ばれる順番が並列と1CPUのときで違うだろうから。 ループ内で乱数つくらないで、でかい乱数用の2次元配列 data0[KURIKAWSIKAISUU][ITIDONIERAZUKAZU] をループが始まる前に「並列処理しないで」作ってから (配列data0をshared属性付けて)ループ処理するといいかも。 計算は遅くなりそうだけどね。
171 名前:デフォルトの名無しさん [2009/01/21(水) 14:12:47 ] んでループ内で乱数生成してた部分は for (i=.....){data[i]=data0[j][i];} と乱数値の複製に置き換える、と。
172 名前:169 mailto:sage [2009/01/26(月) 11:03:50 ] >170 >171 ありがとうございます。 いただいた意見を参考に修正し、できたらご報告します。
173 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 11:33:59 ] マルチスレッドでrand()使うと全然ランダムじゃないデータが出てくるよ
174 名前:デフォルトの名無しさん mailto:sage [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; で測っていますが、これで正しい判断ができる のでしょうか? 並列化すれば速くなる速度のネックになっている部分を 探す方法はあるのでしょうか? 並列化できるかどうか判然としない部分 を並列化可能なコードに書き直してくれるようなソフトはないでしょうか?
176 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:13:22 ] どうせNoconaの方はデュアルCPU構成じゃなくてしかもHT無効というオチだろ。
177 名前:デフォルトの名無しさん mailto:sage [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 となっています
178 名前:デフォルトの名無しさん mailto:sage [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] のように前後の反復の計算結果を利用したり、 配列の同じ要素に書き込むといった処理がデータ依存性の典型例です。 データ依存関係がある場合はコードを書き換えないと普通は並列化できません。 このあたりは並列プログラミングの普遍的な課題で、対策はケースバイケースです。 自動並列化は研究レベルではよく聞きますが実用的なツールは寡聞にして知りません。 よい自動並列化ツールがあれば私も試してみたいです。
179 名前:デフォルトの名無しさん mailto:sage [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
181 名前:180 [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
182 名前:180 [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
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として動作している・・・と思う。
184 名前:180 [2009/03/09(月) 17:16:44 ] >>183 ありがとうございます。実行シェルは作らず、そのまま $time ./test_omp.out という風にやっていました。これから実行シェルを作って見ようと思います。 あと、i/oを外に書いたら、確かに一割ほど速くなりました。 でも、それでも圧倒的にOpenMPは遅いです...
185 名前:180 mailto:sage [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%!!乱数発生器がパラレルに対応していなかったようです。 アドバイス、ありがとうございました。
186 名前:183 [2009/03/10(火) 04:04:33 ] あ、そっか 乱数生成って種を使いまわすから、並列のときは最初に疑うべきだったね。 あまり役に立たなかったっぽいけど、 とりあえず、おめでとう。