2011年8月3日水曜日

メモ:Hello World! MPI

Hello World!のコードにMPIを実装したもの。

課題では全てのプロセスで独立にprintf "Hello World!"する(プロセス間通信無し)コードを書くことが目的であったが、これに加え、プロセス間で1対1通信する(正確にはプロセス番号0のプロセスから全プロセスにHello Worldメッセージを送る)ものと、プロセス0からBroadcastで全プロセスにメッセージを送るものを作成した。


この2つを作るときに引っかかったのがstrcpyでchar型変数に文字列を代入するところ。はじめはポインタを用意して(char dsendbuf[]がchar *dsendbuf)いたが、それだと容量の大きいメッセージを送る場合にバグるみたいなので、string.hを使ってstrcpyで文字列代入する方法を採ったが、文字列の代入方法とかはあまり詳しく知らなかったので苦労した。

これをコンパイルして精製されるhelloをT2Kで動かす場合、helloとは別にnumactl命令の内容を書いたファイルとqsub用のバッチファイルが必要。


------------1対1通信-----------



#include <stdio.h>
#include "mpi.h"
#include <string.h>

void main(int argc, char* argv[]) {
     MPI_Status istatus;
     int    myid, numprocs;
     int    ierr, rc;
     char   dsendbuf[14], drecvbuf[14];
     int    i;
      
     ierr = MPI_Init(&argc, &argv);
     ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
     ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

     strcpy(dsendbuf, "Hello World!¥n");
     if (myid == 0) {
       for(i=1; i <= numprocs - 1; i++){
          ierr = MPI_Send(&dsendbuf, 14, MPI_CHAR, i, 0, MPI_COMM_WORLD);
       }
     }
     else {
          ierr = MPI_Recv(&drecvbuf, 14, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &istatus);
          printf(drecvbuf);
     }


     rc = MPI_Finalize();

     exit(0);
}





-----------Broadcast---------


#include <stdio.h>
#include "mpi.h"
#include <string.h>

void main(int argc, char* argv[]) {
     MPI_Status istatus;
     int    myid, numprocs;
     int    ierr, rc;
     char   dsendbuf[25];
     int    i;
      
     ierr = MPI_Init(&argc, &argv);
     ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
     ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

     if (myid == 0) {
       strcpy(dsendbuf,"Hello World!\n");
     }
     ierr = MPI_Bcast(&dsendbuf, 25, MPI_CHAR,0,MPI_COMM_WORLD);
    
     printf(dsendbuf);


     rc = MPI_Finalize();

     exit(0);
}




0 件のコメント: