OpenMPについて

コンパイル方法

  • gfortran -fopenmp file.f90
  • ifort -openmp file.f90
  • frt -KOMP -Am file.f90 (thinの場合)

基本的なこと

  • !$ use omp_lib を最初に宣言.!$とuseの間にはスペースが必要.
progaram hoge
  !$ use omp_lib
  !$ use another_module
  implicit none
...
end program hoge
  • 並列化したいところを!$OMP parallelと!$OMP end parallelではさむ.はさまれたところは複数のCPUで計算される.
  • !$OMP doと!$OMP singleが分かれば大体のことはできる.
  • 「!$につづけてスペース+命令文」とすると,openmpとしてコンパイルしたときだけその命令が実行される.
  • コンパイルの仕方は gfortran -fopenmp, ifort -openmp, frt -KOMP.

注意点

  • !$の後にOMPが続く場合は!$OMPと続けて書く.!$の後にOMPが続かない場合はスペースを入れる.
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
  • defaultの後は(none)が無難?FIXME
  • doループの制御変数はいわゆる定義済み変数になるので共有属性節1)に記述する必要はない.書くとすればprivateかfirstprivateのいずれか.
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
  • !$OMPのついた文を改行するときは改行した文にも!$OMPが必要
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
  • doループが入れ子になっている場合,外側で回すのが一般的らしいFIXME.ただし,MPIとのハイブリッドの場合は外をMPI,内をOpenMPとするのが良いらしいFIXME
!$OMP do 
 do i=1,n
   do j=1,m
     実行文
   end do
 end do
 !$OMP end do

threadprivate

moduleなどで、グローバル変数を定義している場合に、thread間ではその変数を共有しないで欲しいときに。

module common
  implicit none
  real(8) a,b,c
!$OMP threadprivate(a,b,c)
end module common
1) sharedとかprivateとかfirstprivateとか
fortran/openmp.txt · 最終更新: 2012/07/11 11:55 by hoge
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0