実現したいこと
2000要素のint型の一次元配列を、先頭から200要素単位で10個に分けて、各200個の配列を作成したいです。Rank0は各要素を0で初期化します。
詳細は以下の通りです。
・MPI_Recvで[自身のランク-1]のプロセスから200要素の配列を受信(Rank0は例外)
・200個の要素全てに自身のランク番号を加算
・加算した200個の要素を[自身のランク+1]のプロセスにMPI_Isendで送信(Rank n-1は例外)
・次の200個の要素に上記の処理を繰り返す
・末尾のランクは自身のランクを加算した後に0番目の要素を出力
イメージ図
下記のソースコードは「全データを受信して、加算した後に、全データを送信する」ものですが、コードを書き換えて「200個の配列に分割して並列に送受信」を行いたいです。どのように書き換えればよろしいでしょうか?
該当のソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <mpi.h> 4 5int main(int argc, char** argv){ 6 MPI_Init(&argc, &argv); 7 int rank, size; 8 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 9 MPI_Comm_size(MPI_COMM_WORLD, &size); 10 int* buffer = (int*)malloc(sizeof(int)*2000); 11 12 if (rank == 0){ 13 for (int i=0; i<2000; i++){ 14 buffer[i] = 0; 15 } 16 } 17 /*自身の前のrankから受信*/ 18 if(rank != 0){ 19 MPI_Recv( buffer, 2000, MPI_INT, rank-1, 0, MPI_COMM_WORLD, NULL); 20 } 21 /*対象のバッファに対してrank番号を加算*/ 22 for (int i=0; i<2000; i++){ 23 buffer[i] += rank; 24 } 25 /*自身の次のrankへ送信*/ 26 if(rank != size - 1){ 27 MPI_Send( buffer, 2000, MPI_INT, rank+1, 0, MPI_COMM_WORLD); 28 } 29 if (rank == size-1){ 30 printf("buffer[0] is %d\n", buffer[0]); 31 } 32 MPI_Finalize(); 33 return 0; 34} 35
補足情報(FW/ツールのバージョンなど)
・言語:c言語
・コマンド:cygwin
・コンパイラ:mpicc
・MPI用のランチャー:mpirun
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/03 23:28