MPI_IRecv/MPI_ISend
のペアは同じになる必要がありますcount
?MPI_IRecv/MPI_ISendが同じ `count`を持つべきですか?
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source,
int tag, MPI_Comm comm, MPI_Request *request)
...
count
number of elements in receive buffer (integer)
documentationは、それがいけない示唆しているようだが、私は言葉遣いで混乱していますし、それは少し異なるMPI_Recvから処方されます。私は別のものを渡すと私が期待しているように動作する例を添付していますcount
。
のMakefile
cc=mpicc
isend : isend.c; $(cc) $< -o [email protected]
run: isend
run:; mpiexec -np 2 ./isend
clean:; rm -f isend
.PHONY: clean run
/* Usage: make run */
#include <stdio.h>
#include <mpi.h>
#define send_cnt 1
#define recv_cnt 10
#define SEND 0 /* who sends and who receives? */
#define RECV 1
#define TAG 0
#define COMM MPI_COMM_WORLD
MPI_Status status;
MPI_Request request;
void send() {
int dest = RECV;
int buf[] = {42};
MPI_Isend(buf, send_cnt, MPI_INT, dest, TAG, COMM, &request);
MPI_Wait(&request, &status);
}
void recv() {
int dest = SEND;
int buf[123];
MPI_Irecv(buf, recv_cnt, MPI_INT, dest, TAG, COMM, &request);
MPI_Wait(&request, &status);
printf("recv: %d\n", buf[0]);
}
int main(int argc, char *argv[]) {
int rank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(COMM, &rank);
if (rank == SEND) send();
else recv();
MPI_Finalize();
return 0;
}
ありがとうございました。私はコードを修正した。 – slitvinov
'MPI_Send'を使って' MPI_Irecv'で受信するメッセージを送ることもできます。 –