実現したいこと
MPI_Allreduceを用いてMPI_SUMを計算することは可能なのですが、MPI_Allreduceを用いずに、同様の処理を行うプログラムを作りたいです。
具体的には、MPI_Allreduceを
・MPI_Isend
・MPI_Irecv
・MPI_Test
この3つを用いて作りたいです。
また、具体的な手順は以下の通りです。
①まず「sendbuf」に1024個の乱数を入れて、MPI_AllreduceでMPI_SUMの結果を「recvbuf_ans」に入れます。
②次に、MPI_Allreduceを用いないプログラムで、MPI_SUMの計算結果を「recvbuf」に入れます。
③最後に「recvbuf_ans」と「recvbuf」の値が一致するかを確かめます。この2つが一致すれば、正しいプログラムとなります。
該当のソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <mpi.h> 4#define BUFSIZE 1024 5 6 7 8int main(int argc, char** argv){ 9 MPI_Init(&argc, &argv); 10 int* sendbuf = (int*)malloc(sizeof(int)*BUFSIZE); 11 int* recvbuf = (int*)malloc(sizeof(int)*BUFSIZE); 12 int* recvbuf_ans = (int*)malloc(sizeof(int)*BUFSIZE); 13 for(int i=0; i<BUFSIZE; i++){ 14 sendbuf[i] = rand() % 10; 15 } 16 MPI_Allreduce(sendbuf, recvbuf_ans, BUFSIZE, MPI_INT, MPI_SUM, MPI_COMM_WORLD); 17 18/*------ここにMPI_Allreduceを用いないプログラムを記述------*/ 19 20 21 22 MPI_Finalize(); 23 24 /* ------Check------ */ 25 int is_different = 0; 26 for(int i=0; i<BUFSIZE; i++){ 27 is_different |= recvbuf[i] ^ recvbuf_ans[i]; 28 } 29 if (is_different){ 30 printf("NG\n"); 31 } 32 else { 33 printf("OK\n"); 34 } 35 36 return 0; 37} 38
試したこと
MPI_Allreduceの書き方などは分かるのですが、それを用いずに自作するのに手間取っているので、お助けください。
補足情報(FW/ツールのバージョンなど)
・MPIプログラミング:C言語
・MPIコンパイラ:mpicc
・MPI用のランチャー:mpirun
あなたの回答
tips
プレビュー