[[
fortran:openmp
]]
Applied Mechanics Lab. WIKI
トレース:
文書の表示
以前のリビジョン
最近の変更
サイトマップ
ログイン
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== OpenMPについて ====== * 使い方は以下の文献を参考に * [[http://download.intel.com/jp/business/japan/pdf/527J-002.pdf|インテル® Fortran コンパイラー OpenMP* 活用ガイド]]が分かりやすい. * OpenMPによる並列プログラミングと数値計算法牛島省(著)も良い. ===== コンパイル方法 ===== * gfortran -fopenmp 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 -openmp, 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> ===== threadprivate ===== moduleなどで、グローバル変数を定義している場合に、thread間ではその変数を共有しないで欲しいときに。 <code fortran> module common implicit none real(8) a,b,c !$OMP threadprivate(a,b,c) end module common </code>
fortran/openmp.1341913367.txt.gz
· 最終更新: 2012/07/10 18:42 by
isakari
文書の表示
以前のリビジョン
[unknown link type]
文書の先頭へ