2011年8月4日木曜日

メモ:プロセス間でのデータ交換

長さは同じだがそれぞれの要素が違う二つのベクトルを作り、二つのMPIプロセスに各々のベクトルを分配する。その後、ベクトルの一部分(VECだと頭から11要素の所から25要素分、VECtempだと頭から11要素分)ををプロセス間で入れ替えるプログラム。

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv){
 int neib, i;
 int MyRank, PeTot;
        double VEC[35], VECtemp[35];
        
        int start_send, length_send, start_recv, length_recv;

 MPI_Status *StatSend, *StatRecv;
 MPI_Request *RequestSend, *RequestRecv;

 MPI_Init(&argc, &argv);
 MPI_Comm_size(MPI_COMM_WORLD, &PeTot);
 MPI_Comm_rank(MPI_COMM_WORLD, &MyRank);

 StatSend = malloc(sizeof(MPI_Status) * 1);
 StatRecv = malloc(sizeof(MPI_Status) * 1);
 RequestSend = malloc(sizeof(MPI_Request) * 1);
 RequestRecv = malloc(sizeof(MPI_Request) * 1);

 if(MyRank == 0) {
             neib= 1; 
             start_send=0;
             length_send=11;
             start_recv=length_send+1;
             length_recv=25;
             for (i=0;i<=35;i++){
                  VEC[i] = 100 + i;
            }
        }
        if(MyRank == 1) {
             neib= 0; 
             start_send=0;
             length_send=25;
             start_recv=length_send+1;
             length_recv=11;
             for (i=0;i<=35;i++){
                  VEC[i] = 200 + i;
             }
        }
        for (i=0;i<=35;i++){
      printf("%s%2d%5d%8.0f\n", "### before", MyRank, i, VEC[i]);
        }

 MPI_Isend(&VEC[start_send], length_send, MPI_DOUBLE, neib, 0, 
                   MPI_COMM_WORLD, &RequestSend[0]);
 MPI_Irecv(&VEC[start_recv], length_recv, MPI_DOUBLE, neib, 0, 
                   MPI_COMM_WORLD, &RequestRecv[0]);
        MPI_Waitall(1, RequestRecv, StatRecv);
        MPI_Waitall(1, RequestSend, StatSend);

        for (i=0;i<=35;i++){
             printf("%s%2d%5d%8.0f\n", "### after", MyRank, i, VEC[i]);
 }
 MPI_Finalize();
 return 0;
}

0 件のコメント: