SlideShare a Scribd company logo
1 of 52
Download to read offline
MPIによる並列計算
             MPIによる並列計算

                      並列化とは
                      並列化例


             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All
2009/10/06                                                              1
                             rights reserved.
目次

• 並列計算ってなんだろう

• 効果・メリット

• MPIで並列計算するには

• 基本的なMPIコードのリーディング

• 実習環境の使い方

             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          2
                          All rights reserved.
並列計算とは
• 部分問題に切り分けて、同時に複数実行する

                                            小P
                                            小P
             Problem
                                            小P

                                            小P



                 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                              3
                              All rights reserved.
計算間の並列性
                                  ・・・      ・      ・   ・
• 並列性:                                     ・      ・ =
    – 複数のCPUへ分担させて                ・・・      ・      ・                 ・
      同時に実行しても正しい
      計算結果が得られること                        ・・・                        ・
                                                  ・
                                                  ・          =
• たとえば行列積では:                                      ・
    – 結果の各要素の計算は                               同時実行可能!
      全て同時に実行してOK
                                                         ・
                                                         ・ =
                                         ・・・             ・              ・
             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                              4
                          All rights reserved.
並列計算のメリット
• さらなる高速化向上への道
    – 周波数向上が頭打ち→メニーコア化
    – 「時間」を買える
• さらなる大規模化への道
    – シミュレーションの高精度化、大規模化




             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          5
                          All rights reserved.
並列化の効果
• 理想的にはCPUをつぎ込んだだけ速く計算できる

                                                                    t



                                                                    t



              実際は通信がオーバーヘッドとなることが多い

             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                              6
                          All rights reserved.
並列版の作り方
• どんなモデル?
    – 並列実行モデル
    – 分散メモリアーキテクチャ
• 何をどのように書けばいい?
    – rankによる条件分岐
    – 通信処理




             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          7
                          All rights reserved.
並列計算の実際の流れ
             並列計算実行


                                     アプリ

                                     アプリ

                                     アプリ                        LAN
                                     アプリ
                                             通
                                     アプリ
                                             信
                                     アプリ
                                                               クラスタ
     ユーザ                             アプリ

                                     アプリ




                                                 同時に複数CPUを
                                                 同時に複数   を
               結果                                  使って計算
                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                             8
                             All rights reserved.
MPIシステムの位置関係
               MPIシステムの位置関係

           プロセス0
           プロセス                                      プロセス1
                                                     プロセス

                              Message

                                通信
                          TCP/IP通信
   システム
MPIシステム
(ライブラリ)




                   第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
  2009/10/06                                                              9
                                All rights reserved.
並列プロセスの内容
• 全ノード上で同一のバイナリを動かす
    – 一般に、並列動作には共通コードが多い
• でもちょっと振舞いを変える必要あり
    – 例:1番目は1~50を足す、2番目は51~100を足す

                        同一のバイナリ
         プロセス0
         プロセス                                      プロセス1
                                                   プロセス
                  ~   の総和
                 1~100の総和
                      の和+51~
                 =1~50の和+ ~100の和
                   ~ の和+      の和

                 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                              10
                              All rights reserved.
rankによる条件分岐
             rankによる条件分岐
• 1番目は1~50を足す、2番目は51~100を足す

• 実行時のプロセス識別番号「rank」で書き分ける
• rank IP
  rankとIPアドレス(NIC)との対応づけは
              NIC
  MPIシステムが行う
                       if rank==0 then
         プロセス0
         プロセス              ~ を足す
                         1~50を足す                   プロセス1
                                                   プロセス
                       else
                            ~   を足す
                         51~100を足す

                 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                              11
                              All rights reserved.
プログラミングする上で:
     隣のメモリを直接読み書き可能?
     隣のメモリを直接読み書き可能?
   分散メモリ(複数ノード)
NO:分散メモリ(複数ノード)                      共有メモリ(マルチコア)
                                 YES:共有メモリ(マルチコア)
• 隣のプロセスがメモリ内容を                  • 隣のスレッドのメモリは
  変更したら新しい値を通信で                    自由に読み書き(load,store)
  授受する必要がある                        できる
    – 複数のメモリアドレス空間                   – 単一のメモリアドレス空間
• 通信を考えるのは難しいが                   • 通信コードを書かずに済む
  事実多くのアプリの並列化に                      – 敷居が低い
  使用できている                        • OpenMP, Pthread
• MPI, (Grid)RPC



             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          12
                          All rights reserved.
並列計算の例
                                                                       Σ
               Y=a[0]+a[1]+…+a[99]
                                                                   1CPU
                                                                   4CPU


プロセス0
プロセス                         a=a[0]+…+a[24]         Y=a+b+c+d

プロセス1                       b=a[25]+…+a[49]
プロセス
プロセス2
プロセス                        c=a[50]+…+a[74]


プロセス3
プロセス                        d=a[75]+…+a[99]




                        並列処理を行う部分
                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
  2009/10/06                                                           13
                             All rights reserved.
通信処理の書き方
• メッセージ送信関数
  MPI_Send(送信バッファのアドレス, 送信数,
  MPI_Send(送信バッファのアドレス, 送信数, 型,
         受信するプロセスのrank, メッセージタグ,
         受信するプロセスのrank, メッセージタグ,
         コミュニケータ)
         コミュニケータ)          この2つを
                           この つを
                                                       おさえれば
• メッセージ受信関数                                             書ける

  MPI_Recv(受信バッファのアドレス, 受信数,
  MPI_Recv(受信バッファのアドレス, 受信数, 型,
         送信してくるプロセスのrank, メッセージタグ,
         送信してくるプロセスのrank, メッセージタグ,
         コミュニケータ, ステータス情報用バッファ)
         コミュニケータ, ステータス情報用バッファ)
             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          14
                          All rights reserved.
MPI_Send/Recvの動作
               MPI_Send/Recvの動作
                                                                         t
   プロセス 0                   MPI_Send
                    ↓sendbuf

                                                      メモリ空間0
                                                      メモリ空間

                                 int
                                           ↓recvbuf

                                                      メモリ空間1
                                                      メモリ空間
   プロセス 1                   MPI_Recv

if (rank == 0 {
            0)
    MPI_Send( sendbuf,
    MPI_Send &sendbuf 1, MPI_INT, 1, 1,MPI_COMM_WORLD);
} else if (rank == 1 {
                   1)
    MPI_Recv( recvbuf
    MPI_Recv &recvbuf 1, MPI_INT, 0, 1,MPI_COMM_WORLD, &status);
                   buf,
}
                  第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
  2009/10/06                                                                 15
                               All rights reserved.
MPIの定型句を入れましょう(1/2)
    MPIの定型句を入れましょう(1/2)
static const int root = 0; // Rank of the master process
MPI_Init(&argc, &argv); // Initialize MPI system
int nproc; // The number of processes being used
MPI_Comm_size(MPI_COMM_WORLD, &nproc); // Calculate nproc
int rank; // My process number
MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Calculate rank

                           nproc=4
                            P rank=0(root)
                            P rank=1
                            P rank=2
                            P rank=3

                   第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                16
                                All rights reserved.
MPIの定型句を入れましょう(2/2)
    MPIの定型句を入れましょう(2/2)
char hostname[MPI_MAX_PROCESSOR_NAME];
int namelen;
MPI_Get_processor_name(hostname, &namelen); // Hostname
fprintf(stdout, "[%d/%d] %s¥n", rank, nproc, hostname);
fflush(stdout); // Output immediately

                          nproc=4
                           P rank=0   on   node00   (CPU0)
… (並列コード)…                 P rank=1   on   node00   (CPU1)
                           P rank=2   on   node01   (CPU0)
                           P rank=3   on   node01   (CPU1)

                                            確認:ちゃんと複数CPUコアを
MPI_Finalize(); // Finalize MPI system      使 っ て 動 か せ て い る か ?

                   第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                17
                                All rights reserved.
MPIを使用するための必須事項
                  MPIを使用するための必須事項
                                                     例       からRANK1へ情報を送信するプログラム
                                                             から
                                                    (例) RANK0から     へ情報を送信するプログラム
                                1.    #include <stdio.h>
必須のインクルード
                                2.                         のためのインクルードファイル
                                      #include “mpi.h” ←MPIのためのインクルードファイル
               の場合はmpif.h)
•mpi.h (Fortranの場合は
               の場合は      )
                                3.
                                4.    int main(int argc, char* argv[]){
変数                              5.      int rank, nproc, status;
• int rank        自ランク番号        6.      MPI_Status status;
• int nproc       総ランク数         7.       int buffer, Message=25;
                                8.      MPI_Init(&argc, &argv);         ①
                                9.                                           ②
                                        MPI_Comm_rank(MPI_COMM_WORLD, &rank);②
処理
                                10.     MPI_Comm_size(MPI_COMM_WORLD, &nproc); ③
①MPI_Init         MPI環境の初期化     11.
②MPI_Comm_size    プロセスの総数取得     12.
③MPI_Comm_Rank    自ランク取得        13.       if(RANK==0){
④MPI_Finalize     MPI終了処理       14.          MPI_Send( Message, 1, MPI_INT, 1, 1,MPI_COMM_WORLD);
                                15.       }else if(RANK==1){
                                16.          MPI_Recv(buffer, 1, MPI_INT, 0, 1,MPI_COMM_WORLD, &status) ;
                                17.       }
                                18.
                                19.
                                20.       MPI_Finalize();   ④
                                21.       return 0;
                                22.   }
                       第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
     2009/10/06                                                                                      18
                                    All rights reserved.
基本MPIコード
             基本MPIコード リーディング

                        一対一通信を使った
                       具体例「配列の総和」を
                         深く理解しよう



               第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                            19
                            All rights reserved.
お話しすること
• 配列の総和


             1/2                    1/2

         rank=0                     1



    1/nproc 1/nproc           ・・・       1/nproc

    rank=0         1                    nproc-1


                       第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                    20
                                    All rights reserved.
rank=0                               rank=1
 main() {                               main() {
             MPI初期化
             MPI初期化                                MPI初期化
                                                   MPI初期化
              Aの確保
             Aの初期化
         offset, numの計算
                 numの計算                         offset, numの計算
                                                        numの計算
             subAの確保
             subAの確保                               subAの確保
                                                   subAの確保
       の後半をrank=1へ送信
      Aの後半をrank=1へ送信                         の後半をrank=0から受信
                                            Aの後半をrank=0から受信
       の前半をsubAにコピー
      Aの前半をsubAにコピー
     sumup(subA,num[0],&subtotal);          sumup(subA,num[1],&subtotal);
         answer = subtotal
      subtotalをrank=1から受信
      subtotalをrank=1から受信                    subtotalをrank=0へ送信
                                             subtotalをrank=0へ送信
        answer += subtotal
             結果テスト
             MPI終了処理
             MPI終了処理                              MPI終了処理
                                                  MPI終了処理
             メモリ解放                                 メモリ解放
 }                                      }
                      第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                   21
                                   All rights reserved.
nproc並列版に変えるには(1/2)
      nproc並列版に変えるには(1/2)
• rank=1から/への処理がnproc-1倍に増える
             rank=0                                         rank=1..nproc-1
                                                                 1..nproc-

   rank=1への送信                                         rank=0からの受信

      rank=1..nproc-1への送信(繰り返し)
           1..nproc-

   rank=1からの受信                                        rank=0への送信

     rank=1..nproc-1からの受信(繰り返し)
          1..nproc-
                                                        ※マスタワーカ型の場合
                      第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                    22
                                   All rights reserved.
nproc並列版に変えるには(2/2)
       nproc並列版に変えるには(2/2)
 • C言語でいうと
              rank=0                             rank=1..nproc-1
                                                      1..nproc-



for ( i = 1; i < nproc; i++ )
                 nproc;
   MPI_Send(A+offset[i], num[i], i…);
                        i     i           MPI_Recv( A+offset[rank], num[rank], 0…);




for ( i = 1; i < nproc; i++ )
                 nproc;
   MPI_Recv(B+offset[i], num[i], i…);
                       i      i           MPI_Send( B+offset[rank], num[rank], 0…);


                       第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
 2009/10/06                                                                    23
                                    All rights reserved.
rank=0                               rank=1..nproc-1
 main() {                                 main() {
             MPI初期化
             MPI初期化                                   MPI初期化
                                                      MPI初期化
              Aの確保
             Aの初期化
         offset, numの計算
                 numの計算                           offset, numの計算
                                                          numの計算
             subAの確保
             subAの確保                                 subAの確保
                                                     subAの確保
       の一部をrank=1..nproc-1へ送信
       の一部を
      Aの一部を               へ送信                   の一部をrank=0から受信
                                                の一部を
                                               Aの一部を      から受信
      の一部をsubAにコピー
      の一部を
     Aの一部を    にコピー
     sumup(subA,num[0],&subtotal);            sumup(subA,num[rank],&subtotal);
         answer = subtotal
             を               から受信
     subtotalをrank=1..nproc-1から受信               subtotalをrank=0へ送信
                                                subtotalをrank=0へ送信
        answer += subtotal
             結果テスト
             MPI終了処理
             MPI終了処理                                 MPI終了処理
                                                     MPI終了処理
             メモリ解放                                   メモリ解放
 }                                        }
                        第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                       24
                                     All rights reserved.
実習環境の使い方




             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          25
                          All rights reserved.
VNC: リモートデスクトップツール
VNCクライアントの起動
    http://www.realvnc.com/




                                       遠隔にLinuxのGUIを使える
                                       遠隔にLinuxのGUIを使える
                 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                              26
                              All rights reserved.
コンパイル:mpicc
             コンパイル:mpicc
    > mpicc matmul-mpi.c


    – MPIライブラリが自動的にリンクされる
    – gccのオプション(-lや-o)をそのまま使える




             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          27
                          All rights reserved.
実行:mpirun
                      実行:mpirun
                    計算に使うCPUコア総数 ./a.out
       > mpirun –np 計算に使う   コア総数

             並列計算の依頼
                                                 ソフト




                                                                LAN




                                                               クラスタ
     ユーザ

                                               複数CPUを使って
                                               複数         を使って
                                                   並列に計算
2009/10/06      結果
                 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
                              All rights reserved.
                                                                        28
おまけ:rank割当て変更方法
         おまけ:rank割当て変更方法
  > mpirun --hostfile マシンファイルのパス
      計算に使うCPUコア総数 --byslot ./a.out
  –np 計算に使う        コア総数 --byslot

• --byslot 幅優先                   • --bynode 深さ優先


 node01               0   1       node01                            0   4
 node02               2   3       node02                            1   5
 node03               4   5       node03                            2   6
 node04               6   7       node04                            3   7



             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                  29
                          All rights reserved.
画像ビューア:GQView
             画像ビューア:GQView


     S
Slide show




              第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                           30
                           All rights reserved.
2次元熱伝導解析
             アプリケーションの並列化
                    HPCシステムズ
                    新規事業企画室


               第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                            31
                            All rights reserved.
2次元熱伝導シミュレーション
• 熱伝導とは...
    – 物質中の熱が伝わる様子をシミュレーション
    – 基本的な物理現象の一つ
    – 熱伝導方程式から数値的に解析可能




             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          32
                          All rights reserved.
計算モデルについて
                出典:大分大学工学部生産システム工学科 三村泰成氏作成
                http://mikilab.doshisha.ac.jp/dia/smpp/00_cluster/doc/chapter05.pdf


    ×   格子
 256×256格子




                             初期条件
                             300K                                   断熱
                                                                    条件

                      熱源
                      800K


              第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                       33
                           All rights reserved.
逐次版熱伝導
             シミュレーションプログラム
• ソース名 sfdm2d.c
• コンパイル
    > icc sfdm2d.c -O0 -pg -o sfdm2d.exe

              プロファイル取得

• 実行
    > ./sfdm2d.exe


                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                             34
                             All rights reserved.
HOT SPOT特定
                       SPOT特定
• コンパイル時に-pgオプションを付けることにより、
  プログラム実行時に、関数呼び出しの時間を計測
  できる(gmon.out出力)
• gprofコマンドにより、gmon.outの内容を表示

        > gprof ./sfdm2d.exe | less



                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                             35
                             All rights reserved.
差分法
                                        (solve関数)
                                         solve関数)
      ∂T     ∂ 2T ∂ 2T
         = a( 2 + 2 )
      ∂t     ∂x   ∂y
                     差分法で用いる形に変換

Ti ,( n +1) − Ti ,( n )
      j             j            Ti +n ,) j + Ti −n ,) j − 2Ti ,( n )
                                    (
                                      1
                                                 (
                                                   1              j         Ti ,( n+1 + Ti ,( n−1 − 2Ti ,( n )
                                                                                  j
                                                                                    )
                                                                                              j
                                                                                                )
                                                                                                           j
                          = a(                       2
                                                                        +                      2
                                                                                                                 )
         ∆t                                    ∆x                                        ∆y
                                               2
     格子が等間隔であるこ とから ∆ x = ∆ y = h 、 γ = ∆ t / h とすると、

        Ti ,( n +1) = γ (Ti +n ,) j + Ti −n ,) j + Ti ,( n+1 + Ti ,( n−1 − 4Ti ,( n ) ) + Ti ,( n )
              j
                            (
                              1
                                         (
                                           1             j
                                                           )
                                                                     j
                                                                       )
                                                                                  j             j


                             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                                                       36
                                          All rights reserved.
void solve(double gamma){                    for(i=NW/2 ; i<NW-1 ; i++){                i = NW-1;
   double Te, Tw, Ts, Tn;                       Tw = T[i-1][j];                         j = NH-1;
   int i,j;                                     Te = T[i+1][j];                         Tw = T[i-1][j];
                                                Ts = T[i][j+1]; /* insulation */        Te = T[i-1][j]; /* insulation */
  /* Left boundary */    境界計算                   Tn = T[i][j+1];                         Ts = T[i][j-1];
  i = 0;                                        T_new[i][j] = gamma*(                   Tn = T[i][j-1]; /* insulation */
  for(j=1 ; j<NH-1 ; j++){                 Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];   T_new[i][j] = gamma*(
     Tw = T[i+1][j]; /* insulation */
     Te = T[i+1][j];
                                             }
                                             /* corner */
                                                                                                          一般的な点
                                                                                      Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];

     Ts = T[i][j-1];                         i = 0;              四隅の計算                                     の計算
                                                                                        /* Calc. inner temp. */
     Tn = T[i][j+1];                         j = 0;                                     for(i=1 ; i<NW-1 ; i++){
     T_new[i][j] = gamma*(                   Tw = T[i+1][j]; /* insulation */              for(j=1 ; j<NH-1 ; j++){
Tw + Te + Ts + Tn –4.0*T[i][j]) + T[i][j];   Te = T[i+1][j];                                  Tw = T[i-1][j];
  }                                          Ts = T[i][j+1]; /* insulation */                 Te = T[i+1][j];
  /* Right boundary */                       Tn = T[i][j+1];                                  Ts = T[i][j-1];
  i = NW-1;                                  T_new[i][j] = gamma*(                            Tn = T[i][j+1];
  for(j=1 ; j<h_mid ; j++){                Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];         T_new[i][j] = gamma*(
     Tw = T[i-1][j];                                                                  Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];
     Te = T[i-1][j]; /* insulation */        i = 0;                                        }
     Ts = T[i][j-1];                         j = NH-1;                                  }
     Tn = T[i][j+1];                         Tw = T[i+1][j]; /* insulation */         }
     T_new[i][j] = gamma*(                   Te = T[i+1][j];
Tw + Te + Ts + Tn –4.0*T[i][j]) + T[i][j];   Ts = T[i][j-1];
  }                                          Tn = T[i][j-1]; /* insulation */
  /* Upper boundary */                       T_new[i][j] = gamma*(
  j = NH-1;                                Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];
  for(i=1 ; i<NW-1 ; i++){
     Tw = T[i-1][j];                         i = NW-1;
     Te = T[i+1][j];                         j = 0;
     Ts = T[i][j-1];                         Tw = T[i-1][j];
     Tn = T[i][j-1]; /* insulation */        Te = T[i-1][j]; /* insulation */
     T_new[i][j] = gamma*(                   Ts = T[i][j+1]; /* insulation */
Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];   Tn = T[i][j+1];
  }                                          T_new[i][j] = gamma*(
  /* Lower boundary */                     Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j];
                                      第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
  j = 2009/10/06
      0;                                                                                                                 37
                                                                All rights reserved.
int main(int argc, char** argv){        T[i][0] = temp_high;                      T,filename);
   int i, j;                            T_new[i][0] = temp_high;           }
   int count;                       }
   int nprint;                                                             /* Update temp. */
   double a, t;                     t=0.0;                                 for(i=0 ; i<NW ; i++){
   double Te, Tw, Ts, Tn;           sprintf(filename,"                        for(j=0 ; j<NH ; j++){
   double gamma;                            %f%s",t,".bmp");                     T[i][j] = T_new[i][j];
   double dq = DBL_MAX;             printf("FILENAME=%s                       }
   FILE *fp;                                       メイン
                                            ¥n",filename);                 }
   time_t time;                                  ループ
                                    write_bmp_mono(T,filename);        }

  a = k / rou / c;                  for(count=1 ; count<=nlimit ;      sprintf(filename,
  gamma = a * dt / (h*h);                       count++){                      "%f%s",t,".bmp");
  h_mid = NH / 2;                      t += dt;
                                                         差分法         printf("FILENAME=%s¥n",filename)
  printf("gamma = %e¥n",                solve(gamma);                ;
gamma);                                                                 write_bmp_mono(T,filename);
  if( gamma > 0.5 ){                    //Over write HEATER
      exit(0);                          for(i=0 ; i<NW/2 ; i++){      return 0;
  }                  初期                    T[i][0] = temp_high;     }
                       温度                  T_new[i][0] = temp_high;
  /* Init. Temp. */                     }
  for(i=0 ; i<NW ; i++){    データ
     for(j=0 ; j<NH ; j++){             /* write data */
        T[i][j] = temp_low; 書き出し        if( (count%1000) == 0){
        T_new[i][j] = temp_low;             sprintf(filename,
     }                                       "%f%s",t,".bmp");
  }                                         printf("FILENAME=
                                                  %s¥n",filename);
  // Init. HEATER
                               第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
     2009/10/06
  for(i=0 ; i<NW/2 ; i++){            write_bmp_mono(reserved.                                     38
                                              All rights
並列化手順


                   1. 定型句の挿入
                   2. 2並列化
                   3. n並列化




             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          39
                          All rights reserved.
定型句の挿入
• ヘッダファイル挿入: mpi.h
• 関数
    –   MPI_Init
    –   MPI_Comm_World
    –   MPI_Comm_Size
    –   MPI_Finalize
• ホスト名の取得
    – char hostname[MPI_MAX_PROCESSOR_NAME];
      int namelen;
      MPI_Get_processor_name(hostname, &namelen);
      fprintf(stdout, "[%d/%d] %s¥n", rank, nproc, hostname);
      fflush(stdout);

                     第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                  40
                                  All rights reserved.
差分法の並列化(2分割)
     RANK0 担当                                     RANK1 担当




                128格子                     128格子




                       領域分割




                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                             41
                             All rights reserved.
境界部分の計算

                                        126       127        128       129

                                                    n
RANK0                  RANK1                                      持ってない!

                                          w                   e


                                                    s


         領域分割


                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
 2009/10/06                                                             42
                             All rights reserved.
0         127

             128                           126      127         128    129
             部分計算
                                                       n


                                             w                  e
rank0


                                                       s
                    128        255




                          128
rank1                     部分計算

                第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                             43
                             All rights reserved.
128            T_Right           126      127         128    129

                                                          n


                                                w                  e
rank0
                                                                    バッファの
                                                          s         値を使う




        T_Left
                           128           rank1
                   第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                                44
                                All rights reserved.
n並列化にあたっての留意点
• 自rank+1、又は、自rank-1と送受信
• rank0、nproc-1、それ以外のrankの挙動の違い
• 境界条件の扱い
                        1     2     3
              rank0 rank1 rank2 rank3


                64      64       64       64




                                                   の場合
                                                n=4の場合
             第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
2009/10/06                                                          45
                          All rights reserved.
n並列化 実装その1                rank0             1
                                        rank1            2
                                                     rank2            3
                                                                  rank3

プログラムが単純で、理解し
やすい反面、他のランクが通                     ①             ①            ①        ②
信中は、順番が回ってこない
と通信ができないため、無駄
な待ち時間が多くなる。
                                                       ②              ③

    が       でなければ、
rankがnproc-1でなければ、                       ②            ③
      右に SEND ①
                                  ④      ③
    が でなければ、
rankが0でなければ、
      左から RECV ②
                                                ④
    が でなければ、
rankが0でなければ、
      左に SEND ③
                                                             ④
    が       でなければ、
rankがnproc-1でなければ、
      右から RECV ④

               第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
 2009/10/06                                                               46
                            All rights reserved.
n並列化 実装その2                rank0             1
                                        rank1            2
                                                     rank2            3
                                                                  rank3

複数の通信を同時にすることで、
通信時間の短縮を図る。                       ②      ⑤            ①               ⑥
同期通信を使う場合、偶奇で、
         する方向を合わせて
SEND/RECVする方向を合わせて
おかないと、deadlockを起こす。
おかないと、        を起こす。                             ⑥     ②

    が偶数なら
rankが偶数なら                         ③             ⑦            ③        ⑦
      左に (I)SEND ①
      右に (I)SEND ②
      右から (I)RECV ③                             ⑧     ④
      左から (I)RECV ④

    が奇数なら
rankが奇数なら
      右から (I)RECV ⑤
      左から (I)RECV ⑥
      左に (I)SEND ⑦
      右に (I)SEND ⑧
               第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
 2009/10/06                                                               47
                            All rights reserved.
n並列化 実装その3                     rank0           1
                                           rank1            2
                                                        rank2          3
                                                                   rank3

非同期通信を使用する。
領域境界の点の計算と、
その他一般的な場所の点の
計算を分離して考えると、
通信時間を利用して
                               通信と同時に、
計算を進めることができる。
                               通信と関係ない点について計算を進める
• 非同期通信で、全ての
           を呼び出す
  SEN/RECVを呼び出す
• 一般的な場所の点の計算を開
  始し、その間に非同期通信を実
  行する
• 一般的な場所の点が全て
  終了してもなお、通信が
  終わっていない場合の             通信が終わってから、領域境界のみ計算
  ために、MPI_WAITによって、
  ために、         によって、
  正しい通信の終了を待つ
• 通信修了後、領域境界に
  必要な情報がそろっている
  はずなので、領域境界の    第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc.
 2009/10/06                                                                48
  計算を別途行う                     All rights reserved.
課題                       挑戦者数   達成者数
定形文の挿入                   2      2
 並列化
2並列化                     2      1
 並列化
4並列化                     1      1
 並列化(実装
 並列化 実装1)
N並列化 実装                  2      2
 並列化(実装 偶奇分け)
 並列化 実装2:偶奇分け
N並列化 実装 偶奇分け             2      2
 並列化(実装 通信と計算のオーバーラップ)
 並列化 実装3:通信と計算のオーバーラップ
N並列化 実装 通信と計算のオーバーラップ    2      2
  両方向分割並列
XY両方向分割並列
性能測定                     1      1
配列の領域(NW)を小さく 大きくしてみる
配列の領域    を小さく/大きくしてみる
         を小さく            1      1
要らないメモリを使わないようにする        1
性能分析(計算・通信の内訳は?
性能分析 計算・通信の内訳は?)
     計算・通信の内訳は?
0   63
rank0



                        ずつ
                      64ずつ
rank1    64   127     部分計算




rank2          128   191



rank3                 192    255
n並列化時の書き方
• 「各プロセスが担当する処理」を書く。
 – ×:全プロセスが実行する処理を書く
  • 各プロセスが全プロセス分の処理をやってしまうので間違い
• n並列に一般化して書くには
        が のとき、 のとき、2のとき、・・・」という
          のとき、1のとき、
 – 「rankが0のとき、 のとき、 のとき、・・・」という
   ベタな値の条件分岐が並んだソースコードは書かない
  • 128並列用のソースコードは書きたくないですよね?
 – ポイント:処理自体を、
        処理自体を、rankを使って読み替えさせる
        処理自体を、    を使って読み替えさせる
x = 2 * rank;
 //各プロセスの変数xに、値「自rank*2」を代入
    0    2   4     6                2*(nproc-
                                       1)
    x    x   x     x   ・・・      x

for (i=NW/nproc*rank ; i < NW/nproc*(rank+1) ; i++)
 //長さNWの領域を等分割して、プロセス群に
それぞれ割り当てる
     (NW/nproc)*1
0                                                NW


                 (NW/nproc)*2

More Related Content

What's hot

最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情Yuta Kikuchi
 
近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer近年のHierarchical Vision Transformer
近年のHierarchical Vision TransformerYusuke Uchida
 
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)智啓 出川
 
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...Preferred Networks
 
ChatGPTがもたらす未来予測
ChatGPTがもたらす未来予測ChatGPTがもたらす未来予測
ChatGPTがもたらす未来予測Koji Fukuoka
 
Transformer メタサーベイ
Transformer メタサーベイTransformer メタサーベイ
Transformer メタサーベイcvpaper. challenge
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)RyuichiKanoh
 
【DL輪読会】Scaling Laws for Neural Language Models
【DL輪読会】Scaling Laws for Neural Language Models【DL輪読会】Scaling Laws for Neural Language Models
【DL輪読会】Scaling Laws for Neural Language ModelsDeep Learning JP
 
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法SSII
 
【 xpaper.challenge 】ブレインストーミング法
【 xpaper.challenge 】ブレインストーミング法【 xpaper.challenge 】ブレインストーミング法
【 xpaper.challenge 】ブレインストーミング法cvpaper. challenge
 
アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)RCCSRENKEI
 
SSII2022 [OS3-04] Human-in-the-Loop 機械学習
SSII2022 [OS3-04] Human-in-the-Loop 機械学習SSII2022 [OS3-04] Human-in-the-Loop 機械学習
SSII2022 [OS3-04] Human-in-the-Loop 機械学習SSII
 
Minecraft による強化学習の実践 (MineRL)
Minecraft による強化学習の実践 (MineRL)Minecraft による強化学習の実践 (MineRL)
Minecraft による強化学習の実践 (MineRL)Tusyoshi Matsuzaki
 
[DL輪読会]GLIDE: Guided Language to Image Diffusion for Generation and Editing
[DL輪読会]GLIDE: Guided Language to Image Diffusion  for Generation and Editing[DL輪読会]GLIDE: Guided Language to Image Diffusion  for Generation and Editing
[DL輪読会]GLIDE: Guided Language to Image Diffusion for Generation and EditingDeep Learning JP
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法Hirokatsu Kataoka
 
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Yusuke Uchida
 
[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況Deep Learning JP
 
ベイズ最適化によるハイパラーパラメータ探索
ベイズ最適化によるハイパラーパラメータ探索ベイズ最適化によるハイパラーパラメータ探索
ベイズ最適化によるハイパラーパラメータ探索西岡 賢一郎
 
Neural text-to-speech and voice conversion
Neural text-to-speech and voice conversionNeural text-to-speech and voice conversion
Neural text-to-speech and voice conversionYuki Saito
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
 

What's hot (20)

最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer
 
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
 
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
 
ChatGPTがもたらす未来予測
ChatGPTがもたらす未来予測ChatGPTがもたらす未来予測
ChatGPTがもたらす未来予測
 
Transformer メタサーベイ
Transformer メタサーベイTransformer メタサーベイ
Transformer メタサーベイ
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
 
【DL輪読会】Scaling Laws for Neural Language Models
【DL輪読会】Scaling Laws for Neural Language Models【DL輪読会】Scaling Laws for Neural Language Models
【DL輪読会】Scaling Laws for Neural Language Models
 
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
SSII2021 [OS2-01] 転移学習の基礎:異なるタスクの知識を利用するための機械学習の方法
 
【 xpaper.challenge 】ブレインストーミング法
【 xpaper.challenge 】ブレインストーミング法【 xpaper.challenge 】ブレインストーミング法
【 xpaper.challenge 】ブレインストーミング法
 
アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)アプリケーションの性能最適化2(CPU単体性能最適化)
アプリケーションの性能最適化2(CPU単体性能最適化)
 
SSII2022 [OS3-04] Human-in-the-Loop 機械学習
SSII2022 [OS3-04] Human-in-the-Loop 機械学習SSII2022 [OS3-04] Human-in-the-Loop 機械学習
SSII2022 [OS3-04] Human-in-the-Loop 機械学習
 
Minecraft による強化学習の実践 (MineRL)
Minecraft による強化学習の実践 (MineRL)Minecraft による強化学習の実践 (MineRL)
Minecraft による強化学習の実践 (MineRL)
 
[DL輪読会]GLIDE: Guided Language to Image Diffusion for Generation and Editing
[DL輪読会]GLIDE: Guided Language to Image Diffusion  for Generation and Editing[DL輪読会]GLIDE: Guided Language to Image Diffusion  for Generation and Editing
[DL輪読会]GLIDE: Guided Language to Image Diffusion for Generation and Editing
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
 
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
 
[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況
 
ベイズ最適化によるハイパラーパラメータ探索
ベイズ最適化によるハイパラーパラメータ探索ベイズ最適化によるハイパラーパラメータ探索
ベイズ最適化によるハイパラーパラメータ探索
 
Neural text-to-speech and voice conversion
Neural text-to-speech and voice conversionNeural text-to-speech and voice conversion
Neural text-to-speech and voice conversion
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 

Viewers also liked

並列プログラミング 入門!&おさらい!
並列プログラミング入門!&おさらい!並列プログラミング入門!&おさらい!
並列プログラミング 入門!&おさらい!道化師 堂華
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Windows XP Professional for Embedded切り替えのご案内
Windows XP Professional for Embedded切り替えのご案内Windows XP Professional for Embedded切り替えのご案内
Windows XP Professional for Embedded切り替えのご案内HPCシステムズ株式会社
 
低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について
低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について
低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法についてAtsushi Suzuki
 
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなものHiroshi Watanabe
 
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜Hiroshi Watanabe
 
0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラムMinoru Nakamura
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設Minoru Nakamura
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelMinoru Nakamura
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例についてMasanori Itoh
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワークNaoto MATSUMOTO
 
Jvm reading-synchronization
Jvm reading-synchronizationJvm reading-synchronization
Jvm reading-synchronizationMinoru Nakamura
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例Naoto MATSUMOTO
 

Viewers also liked (20)

OpenMPI入門
OpenMPI入門OpenMPI入門
OpenMPI入門
 
並列プログラミング 入門!&おさらい!
並列プログラミング入門!&おさらい!並列プログラミング入門!&おさらい!
並列プログラミング 入門!&おさらい!
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
CMSI計算科学技術特論A(4) Hybrid並列化技法
CMSI計算科学技術特論A(4) Hybrid並列化技法CMSI計算科学技術特論A(4) Hybrid並列化技法
CMSI計算科学技術特論A(4) Hybrid並列化技法
 
Windows XP Professional for Embedded切り替えのご案内
Windows XP Professional for Embedded切り替えのご案内Windows XP Professional for Embedded切り替えのご案内
Windows XP Professional for Embedded切り替えのご案内
 
低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について
低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について
低遅延10Gb EthernetによるGPUクラスタの構築と性能向上手法について
 
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの
 
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
短距離ハイブリッド並列分子動力学コードの設計思想と説明のようなもの 〜並列編〜
 
0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム
 
Jvm reading-parallel gc
Jvm reading-parallel gcJvm reading-parallel gc
Jvm reading-parallel gc
 
SC16 NVIDIA NEWS
SC16 NVIDIA NEWSSC16 NVIDIA NEWS
SC16 NVIDIA NEWS
 
Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-Model
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例について
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
 
Jvm reading-synchronization
Jvm reading-synchronizationJvm reading-synchronization
Jvm reading-synchronization
 
JVM-Reading-ParalleGC
JVM-Reading-ParalleGCJVM-Reading-ParalleGC
JVM-Reading-ParalleGC
 
CMSI計算科学技術特論A (2015) 第2回 MPIの基礎
CMSI計算科学技術特論A (2015) 第2回 MPIの基礎CMSI計算科学技術特論A (2015) 第2回 MPIの基礎
CMSI計算科学技術特論A (2015) 第2回 MPIの基礎
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例
 

Similar to MPIによる並列計算

El text.tokuron a(2019).katagiri190509
El text.tokuron a(2019).katagiri190509El text.tokuron a(2019).katagiri190509
El text.tokuron a(2019).katagiri190509RCCSRENKEI
 
Windows HPC Server 講習会 第1回 導入編 1/2
Windows HPC Server 講習会 第1回 導入編 1/2Windows HPC Server 講習会 第1回 導入編 1/2
Windows HPC Server 講習会 第1回 導入編 1/2Osamu Masutani
 
CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能
CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能
CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能Computational Materials Science Initiative
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki publicKazuaki Ishizaki
 
第3回システム系輪講会:IPDPS'17 の機械学習系論文
第3回システム系輪講会:IPDPS'17 の機械学習系論文第3回システム系輪講会:IPDPS'17 の機械学習系論文
第3回システム系輪講会:IPDPS'17 の機械学習系論文Junya Arai
 
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングOptuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングMasao Tsukiyama
 
SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)
SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)
SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)NTT DATA OSS Professional Services
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイドEtsuji Nakai
 
第2回 配信講義 計算科学技術特論A (2021)
第2回 配信講義 計算科学技術特論A (2021) 第2回 配信講義 計算科学技術特論A (2021)
第2回 配信講義 計算科学技術特論A (2021) RCCSRENKEI
 
2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm
2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm
2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvmNaoto Gohko
 
3-コンテナスターターパックのご紹介
3-コンテナスターターパックのご紹介3-コンテナスターターパックのご紹介
3-コンテナスターターパックのご紹介KotaSato3
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7Tomohiro Namba
 
Atc15_reading_networking_session
Atc15_reading_networking_sessionAtc15_reading_networking_session
Atc15_reading_networking_session紘也 金子
 

Similar to MPIによる並列計算 (20)

El text.tokuron a(2019).katagiri190509
El text.tokuron a(2019).katagiri190509El text.tokuron a(2019).katagiri190509
El text.tokuron a(2019).katagiri190509
 
Windows HPC Server 講習会 第1回 導入編 1/2
Windows HPC Server 講習会 第1回 導入編 1/2Windows HPC Server 講習会 第1回 導入編 1/2
Windows HPC Server 講習会 第1回 導入編 1/2
 
CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能
CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能
CMSI計算科学技術特論B(1) スーパーコンピュータとアプリケーションの性能
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki public
 
第3回システム系輪講会:IPDPS'17 の機械学習系論文
第3回システム系輪講会:IPDPS'17 の機械学習系論文第3回システム系輪講会:IPDPS'17 の機械学習系論文
第3回システム系輪講会:IPDPS'17 の機械学習系論文
 
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングOptuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
 
SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)
SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)
SIプロジェクトでのインフラ自動化の事例 (第1回 Puppetユーザ会 発表資料)
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
第2回 配信講義 計算科学技術特論A (2021)
第2回 配信講義 計算科学技術特論A (2021) 第2回 配信講義 計算科学技術特論A (2021)
第2回 配信講義 計算科学技術特論A (2021)
 
2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm
2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm
2012 OSC Kyoto / 2012 OSC Tokyo Fall - OpenStack vps kvm
 
Hadoop
HadoopHadoop
Hadoop
 
3-コンテナスターターパックのご紹介
3-コンテナスターターパックのご紹介3-コンテナスターターパックのご紹介
3-コンテナスターターパックのご紹介
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
Amazon Web Servicesブース:UI×API×AWS 横田 聡
Amazon Web Servicesブース:UI×API×AWS 横田 聡Amazon Web Servicesブース:UI×API×AWS 横田 聡
Amazon Web Servicesブース:UI×API×AWS 横田 聡
 
Deep SimNets
Deep SimNetsDeep SimNets
Deep SimNets
 
Web sphere2002 0624
Web sphere2002 0624Web sphere2002 0624
Web sphere2002 0624
 
Parallel Technology
Parallel TechnologyParallel Technology
Parallel Technology
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
Atc15_reading_networking_session
Atc15_reading_networking_sessionAtc15_reading_networking_session
Atc15_reading_networking_session
 
CMSI計算科学技術特論A (2015) 第3回 OpenMPの基礎
CMSI計算科学技術特論A (2015) 第3回 OpenMPの基礎CMSI計算科学技術特論A (2015) 第3回 OpenMPの基礎
CMSI計算科学技術特論A (2015) 第3回 OpenMPの基礎
 

Recently uploaded

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (8)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

MPIによる並列計算

  • 1. MPIによる並列計算 MPIによる並列計算 並列化とは 並列化例 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All 2009/10/06 1 rights reserved.
  • 2. 目次 • 並列計算ってなんだろう • 効果・メリット • MPIで並列計算するには • 基本的なMPIコードのリーディング • 実習環境の使い方 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 2 All rights reserved.
  • 3. 並列計算とは • 部分問題に切り分けて、同時に複数実行する 小P 小P Problem 小P 小P 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 3 All rights reserved.
  • 4. 計算間の並列性 ・・・ ・ ・ ・ • 並列性: ・ ・ = – 複数のCPUへ分担させて ・・・ ・ ・ ・ 同時に実行しても正しい 計算結果が得られること ・・・ ・ ・ ・ = • たとえば行列積では: ・ – 結果の各要素の計算は 同時実行可能! 全て同時に実行してOK ・ ・ = ・・・ ・ ・ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 4 All rights reserved.
  • 5. 並列計算のメリット • さらなる高速化向上への道 – 周波数向上が頭打ち→メニーコア化 – 「時間」を買える • さらなる大規模化への道 – シミュレーションの高精度化、大規模化 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 5 All rights reserved.
  • 6. 並列化の効果 • 理想的にはCPUをつぎ込んだだけ速く計算できる t t 実際は通信がオーバーヘッドとなることが多い 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 6 All rights reserved.
  • 7. 並列版の作り方 • どんなモデル? – 並列実行モデル – 分散メモリアーキテクチャ • 何をどのように書けばいい? – rankによる条件分岐 – 通信処理 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 7 All rights reserved.
  • 8. 並列計算の実際の流れ 並列計算実行 アプリ アプリ アプリ LAN アプリ 通 アプリ 信 アプリ クラスタ ユーザ アプリ アプリ 同時に複数CPUを 同時に複数 を 結果 使って計算 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 8 All rights reserved.
  • 9. MPIシステムの位置関係 MPIシステムの位置関係 プロセス0 プロセス プロセス1 プロセス Message 通信 TCP/IP通信 システム MPIシステム (ライブラリ) 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 9 All rights reserved.
  • 10. 並列プロセスの内容 • 全ノード上で同一のバイナリを動かす – 一般に、並列動作には共通コードが多い • でもちょっと振舞いを変える必要あり – 例:1番目は1~50を足す、2番目は51~100を足す 同一のバイナリ プロセス0 プロセス プロセス1 プロセス ~ の総和 1~100の総和 の和+51~ =1~50の和+ ~100の和 ~ の和+ の和 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 10 All rights reserved.
  • 11. rankによる条件分岐 rankによる条件分岐 • 1番目は1~50を足す、2番目は51~100を足す • 実行時のプロセス識別番号「rank」で書き分ける • rank IP rankとIPアドレス(NIC)との対応づけは NIC MPIシステムが行う if rank==0 then プロセス0 プロセス ~ を足す 1~50を足す プロセス1 プロセス else ~ を足す 51~100を足す 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 11 All rights reserved.
  • 12. プログラミングする上で: 隣のメモリを直接読み書き可能? 隣のメモリを直接読み書き可能? 分散メモリ(複数ノード) NO:分散メモリ(複数ノード) 共有メモリ(マルチコア) YES:共有メモリ(マルチコア) • 隣のプロセスがメモリ内容を • 隣のスレッドのメモリは 変更したら新しい値を通信で 自由に読み書き(load,store) 授受する必要がある できる – 複数のメモリアドレス空間 – 単一のメモリアドレス空間 • 通信を考えるのは難しいが • 通信コードを書かずに済む 事実多くのアプリの並列化に – 敷居が低い 使用できている • OpenMP, Pthread • MPI, (Grid)RPC 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 12 All rights reserved.
  • 13. 並列計算の例 Σ Y=a[0]+a[1]+…+a[99] 1CPU 4CPU プロセス0 プロセス a=a[0]+…+a[24] Y=a+b+c+d プロセス1 b=a[25]+…+a[49] プロセス プロセス2 プロセス c=a[50]+…+a[74] プロセス3 プロセス d=a[75]+…+a[99] 並列処理を行う部分 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 13 All rights reserved.
  • 14. 通信処理の書き方 • メッセージ送信関数 MPI_Send(送信バッファのアドレス, 送信数, MPI_Send(送信バッファのアドレス, 送信数, 型, 受信するプロセスのrank, メッセージタグ, 受信するプロセスのrank, メッセージタグ, コミュニケータ) コミュニケータ) この2つを この つを おさえれば • メッセージ受信関数 書ける MPI_Recv(受信バッファのアドレス, 受信数, MPI_Recv(受信バッファのアドレス, 受信数, 型, 送信してくるプロセスのrank, メッセージタグ, 送信してくるプロセスのrank, メッセージタグ, コミュニケータ, ステータス情報用バッファ) コミュニケータ, ステータス情報用バッファ) 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 14 All rights reserved.
  • 15. MPI_Send/Recvの動作 MPI_Send/Recvの動作 t プロセス 0 MPI_Send ↓sendbuf メモリ空間0 メモリ空間 int ↓recvbuf メモリ空間1 メモリ空間 プロセス 1 MPI_Recv if (rank == 0 { 0) MPI_Send( sendbuf, MPI_Send &sendbuf 1, MPI_INT, 1, 1,MPI_COMM_WORLD); } else if (rank == 1 { 1) MPI_Recv( recvbuf MPI_Recv &recvbuf 1, MPI_INT, 0, 1,MPI_COMM_WORLD, &status); buf, } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 15 All rights reserved.
  • 16. MPIの定型句を入れましょう(1/2) MPIの定型句を入れましょう(1/2) static const int root = 0; // Rank of the master process MPI_Init(&argc, &argv); // Initialize MPI system int nproc; // The number of processes being used MPI_Comm_size(MPI_COMM_WORLD, &nproc); // Calculate nproc int rank; // My process number MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Calculate rank nproc=4 P rank=0(root) P rank=1 P rank=2 P rank=3 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 16 All rights reserved.
  • 17. MPIの定型句を入れましょう(2/2) MPIの定型句を入れましょう(2/2) char hostname[MPI_MAX_PROCESSOR_NAME]; int namelen; MPI_Get_processor_name(hostname, &namelen); // Hostname fprintf(stdout, "[%d/%d] %s¥n", rank, nproc, hostname); fflush(stdout); // Output immediately nproc=4 P rank=0 on node00 (CPU0) … (並列コード)… P rank=1 on node00 (CPU1) P rank=2 on node01 (CPU0) P rank=3 on node01 (CPU1) 確認:ちゃんと複数CPUコアを MPI_Finalize(); // Finalize MPI system 使 っ て 動 か せ て い る か ? 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 17 All rights reserved.
  • 18. MPIを使用するための必須事項 MPIを使用するための必須事項 例 からRANK1へ情報を送信するプログラム から (例) RANK0から へ情報を送信するプログラム 1. #include <stdio.h> 必須のインクルード 2. のためのインクルードファイル #include “mpi.h” ←MPIのためのインクルードファイル の場合はmpif.h) •mpi.h (Fortranの場合は の場合は ) 3. 4. int main(int argc, char* argv[]){ 変数 5. int rank, nproc, status; • int rank 自ランク番号 6. MPI_Status status; • int nproc 総ランク数 7. int buffer, Message=25; 8. MPI_Init(&argc, &argv); ① 9. ② MPI_Comm_rank(MPI_COMM_WORLD, &rank);② 処理 10. MPI_Comm_size(MPI_COMM_WORLD, &nproc); ③ ①MPI_Init MPI環境の初期化 11. ②MPI_Comm_size プロセスの総数取得 12. ③MPI_Comm_Rank 自ランク取得 13. if(RANK==0){ ④MPI_Finalize MPI終了処理 14. MPI_Send( Message, 1, MPI_INT, 1, 1,MPI_COMM_WORLD); 15. }else if(RANK==1){ 16. MPI_Recv(buffer, 1, MPI_INT, 0, 1,MPI_COMM_WORLD, &status) ; 17. } 18. 19. 20. MPI_Finalize(); ④ 21. return 0; 22. } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 18 All rights reserved.
  • 19. 基本MPIコード 基本MPIコード リーディング 一対一通信を使った 具体例「配列の総和」を 深く理解しよう 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 19 All rights reserved.
  • 20. お話しすること • 配列の総和 1/2 1/2 rank=0 1 1/nproc 1/nproc ・・・ 1/nproc rank=0 1 nproc-1 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 20 All rights reserved.
  • 21. rank=0 rank=1 main() { main() { MPI初期化 MPI初期化 MPI初期化 MPI初期化 Aの確保 Aの初期化 offset, numの計算 numの計算 offset, numの計算 numの計算 subAの確保 subAの確保 subAの確保 subAの確保 の後半をrank=1へ送信 Aの後半をrank=1へ送信 の後半をrank=0から受信 Aの後半をrank=0から受信 の前半をsubAにコピー Aの前半をsubAにコピー sumup(subA,num[0],&subtotal); sumup(subA,num[1],&subtotal); answer = subtotal subtotalをrank=1から受信 subtotalをrank=1から受信 subtotalをrank=0へ送信 subtotalをrank=0へ送信 answer += subtotal 結果テスト MPI終了処理 MPI終了処理 MPI終了処理 MPI終了処理 メモリ解放 メモリ解放 } } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 21 All rights reserved.
  • 22. nproc並列版に変えるには(1/2) nproc並列版に変えるには(1/2) • rank=1から/への処理がnproc-1倍に増える rank=0 rank=1..nproc-1 1..nproc- rank=1への送信 rank=0からの受信 rank=1..nproc-1への送信(繰り返し) 1..nproc- rank=1からの受信 rank=0への送信 rank=1..nproc-1からの受信(繰り返し) 1..nproc- ※マスタワーカ型の場合 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 22 All rights reserved.
  • 23. nproc並列版に変えるには(2/2) nproc並列版に変えるには(2/2) • C言語でいうと rank=0 rank=1..nproc-1 1..nproc- for ( i = 1; i < nproc; i++ ) nproc; MPI_Send(A+offset[i], num[i], i…); i i MPI_Recv( A+offset[rank], num[rank], 0…); for ( i = 1; i < nproc; i++ ) nproc; MPI_Recv(B+offset[i], num[i], i…); i i MPI_Send( B+offset[rank], num[rank], 0…); 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 23 All rights reserved.
  • 24. rank=0 rank=1..nproc-1 main() { main() { MPI初期化 MPI初期化 MPI初期化 MPI初期化 Aの確保 Aの初期化 offset, numの計算 numの計算 offset, numの計算 numの計算 subAの確保 subAの確保 subAの確保 subAの確保 の一部をrank=1..nproc-1へ送信 の一部を Aの一部を へ送信 の一部をrank=0から受信 の一部を Aの一部を から受信 の一部をsubAにコピー の一部を Aの一部を にコピー sumup(subA,num[0],&subtotal); sumup(subA,num[rank],&subtotal); answer = subtotal を から受信 subtotalをrank=1..nproc-1から受信 subtotalをrank=0へ送信 subtotalをrank=0へ送信 answer += subtotal 結果テスト MPI終了処理 MPI終了処理 MPI終了処理 MPI終了処理 メモリ解放 メモリ解放 } } 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 24 All rights reserved.
  • 25. 実習環境の使い方 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 25 All rights reserved.
  • 26. VNC: リモートデスクトップツール VNCクライアントの起動 http://www.realvnc.com/ 遠隔にLinuxのGUIを使える 遠隔にLinuxのGUIを使える 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 26 All rights reserved.
  • 27. コンパイル:mpicc コンパイル:mpicc > mpicc matmul-mpi.c – MPIライブラリが自動的にリンクされる – gccのオプション(-lや-o)をそのまま使える 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 27 All rights reserved.
  • 28. 実行:mpirun 実行:mpirun 計算に使うCPUコア総数 ./a.out > mpirun –np 計算に使う コア総数 並列計算の依頼 ソフト LAN クラスタ ユーザ 複数CPUを使って 複数 を使って 並列に計算 2009/10/06 結果 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. All rights reserved. 28
  • 29. おまけ:rank割当て変更方法 おまけ:rank割当て変更方法 > mpirun --hostfile マシンファイルのパス 計算に使うCPUコア総数 --byslot ./a.out –np 計算に使う コア総数 --byslot • --byslot 幅優先 • --bynode 深さ優先 node01 0 1 node01 0 4 node02 2 3 node02 1 5 node03 4 5 node03 2 6 node04 6 7 node04 3 7 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 29 All rights reserved.
  • 30. 画像ビューア:GQView 画像ビューア:GQView S Slide show 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 30 All rights reserved.
  • 31. 2次元熱伝導解析 アプリケーションの並列化 HPCシステムズ 新規事業企画室 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 31 All rights reserved.
  • 32. 2次元熱伝導シミュレーション • 熱伝導とは... – 物質中の熱が伝わる様子をシミュレーション – 基本的な物理現象の一つ – 熱伝導方程式から数値的に解析可能 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 32 All rights reserved.
  • 33. 計算モデルについて 出典:大分大学工学部生産システム工学科 三村泰成氏作成 http://mikilab.doshisha.ac.jp/dia/smpp/00_cluster/doc/chapter05.pdf × 格子 256×256格子 初期条件 300K 断熱 条件 熱源 800K 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 33 All rights reserved.
  • 34. 逐次版熱伝導 シミュレーションプログラム • ソース名 sfdm2d.c • コンパイル > icc sfdm2d.c -O0 -pg -o sfdm2d.exe プロファイル取得 • 実行 > ./sfdm2d.exe 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 34 All rights reserved.
  • 35. HOT SPOT特定 SPOT特定 • コンパイル時に-pgオプションを付けることにより、 プログラム実行時に、関数呼び出しの時間を計測 できる(gmon.out出力) • gprofコマンドにより、gmon.outの内容を表示 > gprof ./sfdm2d.exe | less 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 35 All rights reserved.
  • 36. 差分法 (solve関数) solve関数) ∂T ∂ 2T ∂ 2T = a( 2 + 2 ) ∂t ∂x ∂y 差分法で用いる形に変換 Ti ,( n +1) − Ti ,( n ) j j Ti +n ,) j + Ti −n ,) j − 2Ti ,( n ) ( 1 ( 1 j Ti ,( n+1 + Ti ,( n−1 − 2Ti ,( n ) j ) j ) j = a( 2 + 2 ) ∆t ∆x ∆y 2 格子が等間隔であるこ とから ∆ x = ∆ y = h 、 γ = ∆ t / h とすると、 Ti ,( n +1) = γ (Ti +n ,) j + Ti −n ,) j + Ti ,( n+1 + Ti ,( n−1 − 4Ti ,( n ) ) + Ti ,( n ) j ( 1 ( 1 j ) j ) j j 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 36 All rights reserved.
  • 37. void solve(double gamma){ for(i=NW/2 ; i<NW-1 ; i++){ i = NW-1; double Te, Tw, Ts, Tn; Tw = T[i-1][j]; j = NH-1; int i,j; Te = T[i+1][j]; Tw = T[i-1][j]; Ts = T[i][j+1]; /* insulation */ Te = T[i-1][j]; /* insulation */ /* Left boundary */ 境界計算 Tn = T[i][j+1]; Ts = T[i][j-1]; i = 0; T_new[i][j] = gamma*( Tn = T[i][j-1]; /* insulation */ for(j=1 ; j<NH-1 ; j++){ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; T_new[i][j] = gamma*( Tw = T[i+1][j]; /* insulation */ Te = T[i+1][j]; } /* corner */ 一般的な点 Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; Ts = T[i][j-1]; i = 0; 四隅の計算 の計算 /* Calc. inner temp. */ Tn = T[i][j+1]; j = 0; for(i=1 ; i<NW-1 ; i++){ T_new[i][j] = gamma*( Tw = T[i+1][j]; /* insulation */ for(j=1 ; j<NH-1 ; j++){ Tw + Te + Ts + Tn –4.0*T[i][j]) + T[i][j]; Te = T[i+1][j]; Tw = T[i-1][j]; } Ts = T[i][j+1]; /* insulation */ Te = T[i+1][j]; /* Right boundary */ Tn = T[i][j+1]; Ts = T[i][j-1]; i = NW-1; T_new[i][j] = gamma*( Tn = T[i][j+1]; for(j=1 ; j<h_mid ; j++){ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; T_new[i][j] = gamma*( Tw = T[i-1][j]; Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; Te = T[i-1][j]; /* insulation */ i = 0; } Ts = T[i][j-1]; j = NH-1; } Tn = T[i][j+1]; Tw = T[i+1][j]; /* insulation */ } T_new[i][j] = gamma*( Te = T[i+1][j]; Tw + Te + Ts + Tn –4.0*T[i][j]) + T[i][j]; Ts = T[i][j-1]; } Tn = T[i][j-1]; /* insulation */ /* Upper boundary */ T_new[i][j] = gamma*( j = NH-1; Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; for(i=1 ; i<NW-1 ; i++){ Tw = T[i-1][j]; i = NW-1; Te = T[i+1][j]; j = 0; Ts = T[i][j-1]; Tw = T[i-1][j]; Tn = T[i][j-1]; /* insulation */ Te = T[i-1][j]; /* insulation */ T_new[i][j] = gamma*( Ts = T[i][j+1]; /* insulation */ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; Tn = T[i][j+1]; } T_new[i][j] = gamma*( /* Lower boundary */ Tw + Te + Ts + Tn -4.0*T[i][j]) + T[i][j]; 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. j = 2009/10/06 0; 37 All rights reserved.
  • 38. int main(int argc, char** argv){ T[i][0] = temp_high; T,filename); int i, j; T_new[i][0] = temp_high; } int count; } int nprint; /* Update temp. */ double a, t; t=0.0; for(i=0 ; i<NW ; i++){ double Te, Tw, Ts, Tn; sprintf(filename," for(j=0 ; j<NH ; j++){ double gamma; %f%s",t,".bmp"); T[i][j] = T_new[i][j]; double dq = DBL_MAX; printf("FILENAME=%s } FILE *fp; メイン ¥n",filename); } time_t time; ループ write_bmp_mono(T,filename); } a = k / rou / c; for(count=1 ; count<=nlimit ; sprintf(filename, gamma = a * dt / (h*h); count++){ "%f%s",t,".bmp"); h_mid = NH / 2; t += dt; 差分法 printf("FILENAME=%s¥n",filename) printf("gamma = %e¥n", solve(gamma); ; gamma); write_bmp_mono(T,filename); if( gamma > 0.5 ){ //Over write HEATER exit(0); for(i=0 ; i<NW/2 ; i++){ return 0; } 初期 T[i][0] = temp_high; } 温度 T_new[i][0] = temp_high; /* Init. Temp. */ } for(i=0 ; i<NW ; i++){ データ for(j=0 ; j<NH ; j++){ /* write data */ T[i][j] = temp_low; 書き出し if( (count%1000) == 0){ T_new[i][j] = temp_low; sprintf(filename, } "%f%s",t,".bmp"); } printf("FILENAME= %s¥n",filename); // Init. HEATER 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 for(i=0 ; i<NW/2 ; i++){ write_bmp_mono(reserved. 38 All rights
  • 39. 並列化手順 1. 定型句の挿入 2. 2並列化 3. n並列化 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 39 All rights reserved.
  • 40. 定型句の挿入 • ヘッダファイル挿入: mpi.h • 関数 – MPI_Init – MPI_Comm_World – MPI_Comm_Size – MPI_Finalize • ホスト名の取得 – char hostname[MPI_MAX_PROCESSOR_NAME]; int namelen; MPI_Get_processor_name(hostname, &namelen); fprintf(stdout, "[%d/%d] %s¥n", rank, nproc, hostname); fflush(stdout); 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 40 All rights reserved.
  • 41. 差分法の並列化(2分割) RANK0 担当 RANK1 担当 128格子 128格子 領域分割 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 41 All rights reserved.
  • 42. 境界部分の計算 126 127 128 129 n RANK0 RANK1 持ってない! w e s 領域分割 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 42 All rights reserved.
  • 43. 0 127 128 126 127 128 129 部分計算 n w e rank0 s 128 255 128 rank1 部分計算 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 43 All rights reserved.
  • 44. 128 T_Right 126 127 128 129 n w e rank0 バッファの s 値を使う T_Left 128 rank1 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 44 All rights reserved.
  • 45. n並列化にあたっての留意点 • 自rank+1、又は、自rank-1と送受信 • rank0、nproc-1、それ以外のrankの挙動の違い • 境界条件の扱い 1 2 3 rank0 rank1 rank2 rank3 64 64 64 64 の場合 n=4の場合 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 45 All rights reserved.
  • 46. n並列化 実装その1 rank0 1 rank1 2 rank2 3 rank3 プログラムが単純で、理解し やすい反面、他のランクが通 ① ① ① ② 信中は、順番が回ってこない と通信ができないため、無駄 な待ち時間が多くなる。 ② ③ が でなければ、 rankがnproc-1でなければ、 ② ③ 右に SEND ① ④ ③ が でなければ、 rankが0でなければ、 左から RECV ② ④ が でなければ、 rankが0でなければ、 左に SEND ③ ④ が でなければ、 rankがnproc-1でなければ、 右から RECV ④ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 46 All rights reserved.
  • 47. n並列化 実装その2 rank0 1 rank1 2 rank2 3 rank3 複数の通信を同時にすることで、 通信時間の短縮を図る。 ② ⑤ ① ⑥ 同期通信を使う場合、偶奇で、 する方向を合わせて SEND/RECVする方向を合わせて おかないと、deadlockを起こす。 おかないと、 を起こす。 ⑥ ② が偶数なら rankが偶数なら ③ ⑦ ③ ⑦ 左に (I)SEND ① 右に (I)SEND ② 右から (I)RECV ③ ⑧ ④ 左から (I)RECV ④ が奇数なら rankが奇数なら 右から (I)RECV ⑤ 左から (I)RECV ⑥ 左に (I)SEND ⑦ 右に (I)SEND ⑧ 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 47 All rights reserved.
  • 48. n並列化 実装その3 rank0 1 rank1 2 rank2 3 rank3 非同期通信を使用する。 領域境界の点の計算と、 その他一般的な場所の点の 計算を分離して考えると、 通信時間を利用して 通信と同時に、 計算を進めることができる。 通信と関係ない点について計算を進める • 非同期通信で、全ての を呼び出す SEN/RECVを呼び出す • 一般的な場所の点の計算を開 始し、その間に非同期通信を実 行する • 一般的な場所の点が全て 終了してもなお、通信が 終わっていない場合の 通信が終わってから、領域境界のみ計算 ために、MPI_WAITによって、 ために、 によって、 正しい通信の終了を待つ • 通信修了後、領域境界に 必要な情報がそろっている はずなので、領域境界の 第三回並列化スキル修得セミナー Copyright (C) 2009 HPC SYSTEMS, Inc. 2009/10/06 48 計算を別途行う All rights reserved.
  • 49. 課題 挑戦者数 達成者数 定形文の挿入 2 2 並列化 2並列化 2 1 並列化 4並列化 1 1 並列化(実装 並列化 実装1) N並列化 実装 2 2 並列化(実装 偶奇分け) 並列化 実装2:偶奇分け N並列化 実装 偶奇分け 2 2 並列化(実装 通信と計算のオーバーラップ) 並列化 実装3:通信と計算のオーバーラップ N並列化 実装 通信と計算のオーバーラップ 2 2 両方向分割並列 XY両方向分割並列 性能測定 1 1 配列の領域(NW)を小さく 大きくしてみる 配列の領域 を小さく/大きくしてみる を小さく 1 1 要らないメモリを使わないようにする 1 性能分析(計算・通信の内訳は? 性能分析 計算・通信の内訳は?) 計算・通信の内訳は?
  • 50. 0 63 rank0 ずつ 64ずつ rank1 64 127 部分計算 rank2 128 191 rank3 192 255
  • 51. n並列化時の書き方 • 「各プロセスが担当する処理」を書く。 – ×:全プロセスが実行する処理を書く • 各プロセスが全プロセス分の処理をやってしまうので間違い • n並列に一般化して書くには が のとき、 のとき、2のとき、・・・」という のとき、1のとき、 – 「rankが0のとき、 のとき、 のとき、・・・」という ベタな値の条件分岐が並んだソースコードは書かない • 128並列用のソースコードは書きたくないですよね? – ポイント:処理自体を、 処理自体を、rankを使って読み替えさせる 処理自体を、 を使って読み替えさせる
  • 52. x = 2 * rank; //各プロセスの変数xに、値「自rank*2」を代入 0 2 4 6 2*(nproc- 1) x x x x ・・・ x for (i=NW/nproc*rank ; i < NW/nproc*(rank+1) ; i++) //長さNWの領域を等分割して、プロセス群に それぞれ割り当てる (NW/nproc)*1 0 NW (NW/nproc)*2