2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

OpenMPプログラミング

1 :デフォルトの名無しさん:04/12/08 14:24:34.net
オフィシャルサイト
http://www.openmp.org/

リンクなどは>>2以下で

351 :デフォルトの名無しさん:2012/05/18(金) 10:24:47.70 .net
>>349
オブジェクトをキーにしたmonitorが分からなければそもそもマルチスレッドプログラミングが分かっていないってことだろ


352 :デフォルトの名無しさん:2012/05/18(金) 12:14:48.44 .net
>>349
単なるmutexじゃねーか。

353 :349:2012/05/18(金) 13:28:27.29 .net
いじめないでくれよぅ。
shared private reduction
だけで今まで何とかなってたんだよ・・

354 :デフォルトの名無しさん:2012/05/18(金) 14:42:29.77 .net
OpenMPの弊害か。
やっぱりある程度基礎が必要だな。
ちなみに、omp_set_lock/omp_unset_lock
は軽くて便利だぞ。

355 :デフォルトの名無しさん:2012/07/02(月) 18:29:55.05 .net
これから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と入力したら多くのディレクトリが表示されどこに入れればいいのか分かりません・・・
どこのディレクトリにコピーすればいいのか教えてください

356 :デフォルトの名無しさん:2012/07/03(火) 12:43:01.12 .net
よく分かってないなら、絶対パスで指定すればいいんじゃね

357 :355:2012/07/03(火) 12:59:16.53 .net
>>356
上のほう読んでたら、vcomp90.dllを実行ファイルの場所にコピーと書いてあったので試してみます
それでもダメだったら、絶対パスで指定してみます。本当に初心者ですみません・・・

358 :デフォルトの名無しさん:2012/07/03(火) 14:41:46.91 .net
まずC++を10年勉強しろ


359 :デフォルトの名無しさん:2012/07/03(火) 15:32:38.77 .net
OpenMP以前にC#とか使ってみ

360 :デフォルトの名無しさん:2012/07/03(火) 16:31:39.87 .net
>>358
すみません、初歩的なJavaやC言語しか学んでなかったんです;;
でも菅原清文著のC/C++プログラマのためのOpenMPという本で、C言語でも扱えるということで始めてみました

>>359
はじめてのC#というサイトを見て頑張ってみます

ちなみに実行ファイルの場所(フォルダ)にコピーしてもエラーが起きてコンパイルできませんでした

361 :デフォルトの名無しさん:2012/07/03(火) 17:19:47.13 .net
エラーに出てるけどビルドに必要なのはVCOMPD.libであってvcomp90.dllじゃないんで

362 :デフォルトの名無しさん:2012/07/03(火) 19:49:27.49 .net
>>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でも併用すればよろし)


363 :デフォルトの名無しさん:2012/07/03(火) 20:26:40.35 .net
VC++のOpenMPはデバッグビルドだと_DEBUGをundefしてからomp.hをincludeしないといけないってのが昔あったが


364 :デフォルトの名無しさん:2012/07/03(火) 23:09:00.31 .net
VS2010 Pro 評価版を Virtual PC とかの捨て環境にインストールすれば vcompd.lib も入ってるけど、これコピーして使ったら逮捕されるかもしれないからやめたほうがいいね。

365 :355:2012/07/04(水) 16:57:37.98 .net
>>361-364
多数のレス本当にありがとうございます。
とりあえずVS2010Expressでは、OpenMPが使用できないということですね
>>362さんの(2)の方法で試してみます。あと>>364さんの提案だとできそうですが・・・やめたほうがいいですね

366 :355:2012/07/24(火) 17:16:07.86 .net
久しぶりの書き込みです
言われた通りVS2008+SDK7.0でopenmpをコンパイラ実行することができました

できればサポ3.0以上を無償ソフトで使えればよかった・・・

367 :デフォルトの名無しさん:2012/08/03(金) 08:51:06.44 .net
メモリのローカリティって何?

368 :デフォルトの名無しさん:2012/08/03(金) 11:28:21.30 .net
なるべく近いアドレスのデータだけを

369 :デフォルトの名無しさん:2012/08/27(月) 13:57:29.01 .net
本屋にOpenMPの新しげな本が置いてあったんだけど
あれって買った方がいいと思う?

370 :デフォルトの名無しさん:2012/08/28(火) 00:32:09.61 .net
好きにすれば。

371 :デフォルトの名無しさん:2012/08/28(火) 08:21:46.94 .net
元IBMのゴルゴ13こと
青山(名前あってるかな?)先生の本がいいからなぁ。
どこかでpdf版もあったと思うけど。

初心者なら青山さんの冊子でしばらく事足りるとおもうし、
だいぶ経験積んでいるのなら、買っても言うのではないかと。

372 :デフォルトの名無しさん:2012/08/28(火) 08:24:31.34 .net
あと、外人さんが書いたものの日本語訳なら
いっそのとこ原書買う方がいいかも。
アマゾンか丸善に

373 :デフォルトの名無しさん:2012/09/10(月) 09:28:48.06 .net
ひょっとして並列できるところ全部並列化したら
かえって遅くなる?

374 :デフォルトの名無しさん:2012/09/10(月) 10:56:02.47 .net
そういうこともある。

375 :デフォルトの名無しさん:2012/09/12(水) 16:33:48.58 .net
TBBのスレってないんだね

376 :デフォルトの名無しさん:2012/09/12(水) 16:41:28.82 .net
http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

std::for_eachがOpenMP使えるみたいだけど
どんな使い方すればいいんんだろ


377 :デフォルトの名無しさん:2012/09/12(水) 18:26:21.73 .net
>>376
OpenMPがfor文を並列化することが多いものだから普通すぎる使い方だろ


378 :デフォルトの名無しさん:2012/09/12(水) 23:59:00.24 .net
イテレータの実装はスレッドセーフになってんのかね?

379 :デフォルトの名無しさん:2012/09/20(木) 00:58:26.64 .net
先週出た Visual Studio Express 2012 for Desktop で、
OpenMP が使えるかどうか試してみた。

WIN32 Release/Debug, x64 Release/Debug のすべてで、
omp_get_num_procs(), omp_get_num_threads() を使ったプログラムを
ビルドして実行できたよ。

380 :デフォルトの名無しさん:2012/09/20(木) 02:12:25.71 .net
VS 2010 ExpressはSDK入れても出来なかったのにな
2008はできていたのに



381 :デフォルトの名無しさん:2012/09/23(日) 23:36:08.84 .net
>>373
アムダールの法則

382 :デフォルトの名無しさん:2012/10/17(水) 09:15:52.02 .net
OpenMP有効で、Core i 3 530(2.93GHz)の環境で
23.66Gflops出た。理論値は23.44Gflopsだが・・
OpenMP簡単でスゲーな

383 :デフォルトの名無しさん:2012/10/17(水) 17:33:00.60 .net
結果が壊れてないか確認する必要はあるけどね

384 :デフォルトの名無しさん:2012/10/18(木) 15:22:42.12 .net
spec.org だっけ・・・わすれたwけど
にSMP マシンのテストで
どういうコンパイルオプションを使ったか書いてあるので
それと同じでやってみるとなおいいかも。

ものにもよるけど、経験上は20CPU(コアか・・)くらいまでなら
コア数に比例して上がっていくよね。
大規模流体計算とかだとMPI とかになるだろうけど、
それでも、OpenMP はデュアルコアが一般になった今日では簡単でとても便利だ。

385 :デフォルトの名無しさん:2012/10/21(日) 22:56:24.36 .net
>>384
OpenMPがいいかMPIがいいかの違いは、
共有メモリがいいか分散メモリがいいかの違いだけ。
大規模問題は往々にしてメモリ帯域が足りなくなったり、ロックの問題が出てくるから、MPIが使われる。
それ以外はOpenMPのほうが有利。

あと、メモリに依存しないオンキャッシュで収まる問題なら、
MPI、OpenMPに限らずほぼコア数にスケールする。
しかし、OpenMPで20コアまでスケールするような問題は見たことがないな。



386 :デフォルトの名無しさん:2012/10/21(日) 23:34:46.32 .net
Opteron 24コアだと8コアくらいまでがリニアに速くなって
それ以上は足せば速くなるけど少しの違いだったな
メモリの帯域が問題だと思ってたけど

387 :デフォルトの名無しさん:2012/10/22(月) 00:15:04.44 .net
>>386
Opteronで6コア以上だったらNUMAだからメモリバインドをしっかりしないとスピードは上がらんよ。
Linuxならnumactlが必要。Windowsは残念ながらOS任せなので、スケールは難しい。

388 :デフォルトの名無しさん:2012/10/25(木) 04:31:05.92 .net
MPIだと一部だけパージ可能だからその点は楽

389 :デフォルトの名無しさん:2013/08/05(月) NY:AN:NY.AN .net
openmp を使って並列化したプログラムを intel fortran コンパイラでコンパイル(最適化は -O0)して4コア(Xeon 5150)のマシンで実行したところ、-openmpオプションの有無によってかかる時間が
有:実時間3m39s、ユーザーcpu時間14m22s
無:実時間2m53s、ユーザーcpu時間2m53s
のようになりました。
つまり openmp で4コアを使っているのに実時間は減っておらず、cpu 時間がコア数の数にだいたい比例して増えています。

まったく同じプログラムを別のマシン Core i5-3470S で同じバージョンの ifort で -openmp オプション付きでコンパイル・実行したところ、かかった実時間は (-optionmp 無しでの実時間)/コア数より少し大きい程度だったので、このマシンでは問題が無さそうです。

どういった原因が考えられますか?

390 :デフォルトの名無しさん:2013/08/06(火) NY:AN:NY.AN ID:ptOJnDCf!.net
>>389
memory-boundなプログラムなのでは?
Nehalem前後で並列性能が大きく変わるはず。

391 :デフォルトの名無しさん:2013/08/06(火) NY:AN:NY.AN .net
>>389
ロックのしかたがクソとか
プログラム依存の話なのか環境の話なのか切り分けるために
配列要素を合計するような単純なforループで試してみたらいいんじゃないのかな
CPU時間が増えているということは複数コアが使われているのは確かだと思うけど
普通はコア数に比例してCPU時間が増えてコア数に反比例して実時間が減るよね

392 :デフォルトの名無しさん:2013/08/06(火) NY:AN:NY.AN .net
処理を分割せずに同じ処理をマルチコアで実行してしまっている気がする

393 :389:2013/08/07(水) NY:AN:NY.AN .net
みなさんありがとうございます。
FGSL のプログラムを使って多数回のモンテカルロ積分をしていて上記のような問題が起きたのですが、private, shared などの指定がまずかったようです。
積分値が異常ではなかったので、答えは間違いないが Xeon では時間短縮できていないと誤解してしまいました。しかし積分値の分散は openmp ありのほうが小さいので、どうも何らかの異常があったようです。

モンテカルロ積分に関係する量をすべて private にし、乱数の種をスレッドごとに異なる値にすることによって、積分値の異常も計算時間の異常も解決したようです。
ありがとうございました。

394 :デフォルトの名無しさん:2013/11/23(土) 01:04:27.62 .net
critical (name)
のnameってグローバル?
あるライブラリで
#pragma omp critical(hoge)
があった場合、別のライブラリの
#pragma omp critical(hoge)
と衝突する?

395 :デフォルトの名無しさん:2014/05/23(金) 05:49:42.65 ID:eY132h5h.net
VS2013 SP2でOpenMP2.0が入ったから初めて来てみました
Intel C++のように自動ベクトル化してくれないコンパイラでは大事な要素になると思います

396 :デフォルトの名無しさん:2014/05/23(金) 10:48:49.16 ID:KAZQ16GG.net
ベクタ化とOpenMPじゃ対象領域が違うだろうに。

397 :デフォルトの名無しさん:2014/05/23(金) 10:55:20.24 ID:BYDPqsAk.net
VCだと最初からPPLで組んだ方がパフォーマンス良いよな
OpenMPてなるべく構文そのままでfor文を並列化すると速くなるか確かめる程度
気軽に切り替えられるのは利点だったけど

398 :デフォルトの名無しさん:2015/01/21(水) 21:47:03.58 ID:WAMGwClq.net


399 :デフォルトの名無しさん:2016/02/05(金) 21:06:34.41 ID:pgxZ4RMK.net
つい最近、凝縮体の数値計算でお世話になりました
といっても6時間程度の規模の計算量でしたけど

400 :デフォルトの名無しさん:2017/04/08(土) 10:41:47.71 ID:8WOwQIDe.net
ものすごく過疎っているね
OpenMPでGPUを使う時にC++のvectorくらい使わせてくれないものか
全くの素人だから知らないだけかも知れないけど・・・

総レス数 400
111 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★