2020.10.24アップデートから、MPIとOpenMPを一緒に使えるようになりました。
端的には、以下のコードが動きます。
program doTest
! OpenMPの使用を宣言
!$use omp_lib
! plantFEMの中にMPIのラッパーがあります。
use plantFEM
implicit none
! MPIのラッパーを起動
type(MPI_) :: mpid
! サンプルで作るベクトルの大きさ(rank)
integer,parameter :: N = 10000
integer i, a(N),nthreads,myid
! MPIを開始。以下、mpid%end()までがプロセスごとに並列に実行されます(プロセス数2)
call mpid%start()
print *, "Running MPI with OpenMP"
! OpenMPによる自動並列化を開始、各プロセスごとに最大4スレッドを立ち上げて並列化します。
!$omp parallel num_threads(4)
! OpenMPによるスレッド数の取得
nthreads = omp_get_num_threads()
! OpenMPによるスレッドIDの取得
myid = omp_get_thread_num()
! プロセス数、プロセスID、プロセスあたりのスレッド数、スレッドIDを出力
print *, "nprocess :",trim(str(mpid%petot))," myrank :",trim(str(mpid%myrank)), &
" nthreads : " ,trim(str(nthreads)), " myid :",trim(str(myid))
! ベクトルa(:)に代入
do i=1,N
a(i) = i
end do
! 成分をそれぞれ2倍にする
do i=1,N
a(i) = a(i)*2
enddo
!ここまでがOpenMPによる並列化
!$omp end parallel
! mpiを終了
call mpid%end()
end program
plantFEMでは実行時のプロセス数を以下のように設定できます。
./plantfem cpu-core
>>> cpu-core
Current num of cpu-core is :: 1
Please input num of cpu-core
2
Current num of cpu-core is :: 2
以下では、2つのプロセスのそれぞれで、最大4つのスレッドを動かして並列化しています。
手元の環境では、以下のような出力が得られます。
Number of Core is 2
Running MPI with OpenMP
Number of Core is 2
Running MPI with OpenMP
nprocess :2 myrank :0 nthreads : 4 myid :3
nprocess :2 myrank :0 nthreads : 4 myid :3
nprocess :2 myrank :1 nthreads : 4 myid :2
nprocess :2 myrank :1 nthreads : 4 myid :2
nprocess :2 myrank :0 nthreads : 4 myid :3
nprocess :2 myrank :0 nthreads : 4 myid :3
nprocess :2 myrank :1 nthreads : 4 myid :3
nprocess :2 myrank :1 nthreads : 4 myid :3
############################################
Number of cores :: 2
############################################
Computation time (sec.) :: 1.8069430000000001E-003
Computation time (sec.) :: 1.8069430000000001E-003
逆に、4プロセスで2スレッドを動かすと、
num of process :: 4
Number of Core is 4
Running MPI with OpenMP
Number of Core is 4
Running MPI with OpenMP
Number of Core is 4
Running MPI with OpenMP
nprocess :4 myrank :1 nthreads : 2 myid :1
nprocess :4 myrank :2 nthreads : 2 myid :1
Number of Core is 4
Running MPI with OpenMP
nprocess :4 myrank :1 nthreads : 2 myid :1
nprocess :4 myrank :3 nthreads : 2 myid :1
nprocess :4 myrank :3 nthreads : 2 myid :1
nprocess :4 myrank :0 nthreads : 2 myid :1
nprocess :4 myrank :2 nthreads : 2 myid :1
nprocess :4 myrank :0 nthreads : 2 myid :1
############################################
Number of cores :: 4
############################################
Computation time (sec.) :: 1.8983343999999999E-002
Computation time (sec.) :: 1.8983343999999999E-002
Computation time (sec.) :: 1.8983343999999999E-002
Computation time (sec.) :: 1.8983343999999999E-002
スレッド2つもいらんわ!っていうことでmyidは1のみを使っていますね。
今後、ソルバと組み合わせて使ってみたいと思います。