この文書の現在のバージョンと選択したバージョンの差分を表示します。
Both sides previous revision Previous revision Next revision | Previous revision | ||
openmp [2009/06/24 14:32] 10.249.202.217 |
openmp [2011/02/21 15:58] saito |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | ====== OpenMPについて ====== | + | [[fortran:openmp]]へ移動しました. |
- | + | ||
- | * 使い方は以下の文献を参考に | + | |
- | * [[http://download.intel.com/jp/business/japan/pdf/527J-002.pdf|インテル® Fortran コンパイラー OpenMP* 活用ガイド]]が分かりやすい. | + | |
- | * OpenMPによる並列プログラミングと数値計算法牛島省(著)も良い. | + | |
- | * !$ 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. | + | |
- | + | ||
- | ===== 注意点 ===== | + | |
- | * !$の後にOMPが続く場合は!$OMPと続けて書く.!$の後にOMPが続かない場合はスペースを入れる. | + | |
- | <code fortran> | + | |
- | program hoge | + | |
- | !$ use omp_lib | + | |
- | !$OMP parallel default(none) private(j) | + | |
- | !$ j=omp_get_num_threads() | + | |
- | !$ write(*,*) j | + | |
- | !$ j=omp_get_thread_num() | + | |
- | !$ write(*,*) j | + | |
- | !$ | + | |
- | !$OMP end parallel | + | |
- | end program hoge | + | |
- | </code> | + | |
- | * defaultの後は(none)が無難?FIXME | + | |
- | * doループの制御変数はいわゆる定義済み変数になるので共有属性節((sharedとかprivateとかfirstprivateとか))に記述する必要はない.書くとすればprivateかfirstprivateのいずれか. | + | |
- | <code fortran> | + | |
- | program hoge | + | |
- | !$ use omp_lib | + | |
- | implicit none | + | |
- | integer i,j,k | + | |
- | !$OMP parallel default(none) private(j) | + | |
- | !$OMP do | + | |
- | do i=1,4 | + | |
- | !$ j=omp_get_thread_num() | + | |
- | !$ write(*,*) i,j | + | |
- | end do | + | |
- | !$OMP end do | + | |
- | !$OMP end parallel | + | |
- | end program hoge | + | |
- | </code> | + | |
- | * !$OMPのついた文を改行するときは改行した文にも!$OMPが必要 | + | |
- | <code fortran> | + | |
- | program hoge | + | |
- | !$ use omp_lib | + | |
- | implicit none | + | |
- | integer i,j,k | + | |
- | k=-1 | + | |
- | !$OMP parallel default(none) private(i,j)& | + | |
- | !$OMP & shared(k) | + | |
- | !$ i=omp_get_thread_num() | + | |
- | !$ j=omp_get_num_threads() | + | |
- | !$ write(*,*) i,j,k | + | |
- | !$OMP end parallel | + | |
- | end program hoge | + | |
- | </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> | + |