この文書の現在のバージョンと選択したバージョンの差分を表示します。
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
openmp [2009/05/11 12:18] 10.249.202.199 |
openmp [2009/12/24 22:29] isakari |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
====== OpenMPについて ====== | ====== OpenMPについて ====== | ||
- | OpenMPによる並列プログラミングと数値計算法 | + | * 使い方は以下の文献を参考に |
- | 牛島省(著)を参考に. | + | * [[http://download.intel.com/jp/business/japan/pdf/527J-002.pdf|インテル® Fortran コンパイラー OpenMP* 活用ガイド]]が分かりやすい. |
+ | * OpenMPによる並列プログラミングと数値計算法牛島省(著)も良い. | ||
+ | |||
+ | ===== コンパイル方法 ===== | ||
+ | * gfortran -openmp file.f90 | ||
+ | * ifort -openmp file.f90 | ||
+ | * frt -KOMP -Am file.f90 (thinの場合) | ||
+ | |||
+ | |||
+ | ===== 基本的なこと ===== | ||
+ | |||
+ | * !$ use omp_lib を最初に宣言.**!$とuseの間にはスペースが必要.** | ||
+ | <code fortran> | ||
+ | progaram hoge | ||
+ | !$ use omp_lib | ||
+ | !$ use another_module | ||
+ | implicit none | ||
+ | ... | ||
+ | end program hoge | ||
+ | </code> | ||
+ | * 並列化したいところを!$OMP parallelと!$OMP end parallelではさむ.はさまれたところは複数のCPUで計算される. | ||
+ | * !$OMP doと!$OMP singleが分かれば大体のことはできる. | ||
+ | * 「!$につづけてスペース+命令文」とすると,openmpとしてコンパイルしたときだけその命令が実行される. | ||
+ | * コンパイルの仕方は gfortran -openmp, ifort -opemmp, frt -KOMP. | ||
===== 注意点 ===== | ===== 注意点 ===== | ||
ライン 50: | ライン 73: | ||
end program hoge | end program hoge | ||
</code> | </code> | ||
+ | |||
+ | * doループが入れ子になっている場合,外側で回すのが一般的らしいFIXME.ただし,MPIとのハイブリッドの場合は外をMPI,内をOpenMPとするのが良いらしいFIXME. | ||
+ | <code fortran> | ||
+ | !$OMP do | ||
+ | do i=1,n | ||
+ | do j=1,m | ||
+ | 実行文 | ||
+ | end do | ||
+ | end do | ||
+ | !$OMP end do | ||
+ | </code> | ||
+ | |||
+ | ===== threadprivate ===== | ||
+ | moduleなどで、グローバル変数を定義している場合に、thread間ではその変数を共有しないで欲しいときに。 | ||
+ | <code fortran> | ||
+ | module common | ||
+ | implicit none | ||
+ | real(8) a,b,c | ||
+ | !$OMP threadprivate(a,b,c) | ||
+ | end module common | ||
+ | </code> | ||
+ |