2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

plantFEMでMPIとOpenMPを一緒に使えるようになりました。

Posted at

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のみを使っていますね。
今後、ソルバと組み合わせて使ってみたいと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?