MPI Isend 和 Ireceive 不起作用
MPI Isend and Ireceive doesn't work
我在使用 Isend 和 Ireceive 时遇到问题。我正在尝试向所有其他处理器发送消息,然后从其他处理器接收相同类型的消息,这些处理器使用相同的 Isend 方法。
void msgs(int my_rank, int num_procs){
int arrive_count = 1;
int leave_count = 0;
int i;
bool b_req = true;
MPI_Request req, req2;
//Send to all other procs
for(i=0; i<num_procs; i++){
if(i != my_rank){
MPI_Isend(&b_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req);
}
}
bool c_req;
//Receive msgs from all other procs
while(arrive_count != num_procs){
for(i=0; i<num_procs; i++){
if(i != my_rank){
MPI_Irecv(&c_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req2);
if(c_req){
c_req = false;
arrive_count ++;
}
MPI_Request_free(&req2);
}
}
}
printf("Done from rank: %d \n", my_rank);
}
您的代码段至少存在三个问题:
- 您不能将
MPI_BYTE
与 bool
一起使用。 MPI 标准允许您将 MPI_C_BOOL
与 _Bool
一起使用,另一个选项是在传输 MPI_BYTE
[=36= 之前在 bool
和 byte
之间手动转换]
- 您没有正确使用
MPI_Isend()
或 MPI_Recv()
。您应该有一个请求数组,最后调用 MPI_Waitall()
。
- 您可以在第一个循环中
MPI_Irecv()
所有远程对等点,然后 MPI_Test()
查看消息是否已到达另一个循环(请注意,您将需要 c_req
),或者在消息到达之后有一个 MPI_Iprobe()
和 MPI_Recv()
的循环(这需要一个 c_req
.
作为旁注,除非您在 while
循环中进行任何处理,否则您可能需要考虑集体操作,例如 MPI_Alltoall()
.
我在使用 Isend 和 Ireceive 时遇到问题。我正在尝试向所有其他处理器发送消息,然后从其他处理器接收相同类型的消息,这些处理器使用相同的 Isend 方法。
void msgs(int my_rank, int num_procs){
int arrive_count = 1;
int leave_count = 0;
int i;
bool b_req = true;
MPI_Request req, req2;
//Send to all other procs
for(i=0; i<num_procs; i++){
if(i != my_rank){
MPI_Isend(&b_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req);
}
}
bool c_req;
//Receive msgs from all other procs
while(arrive_count != num_procs){
for(i=0; i<num_procs; i++){
if(i != my_rank){
MPI_Irecv(&c_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req2);
if(c_req){
c_req = false;
arrive_count ++;
}
MPI_Request_free(&req2);
}
}
}
printf("Done from rank: %d \n", my_rank);
}
您的代码段至少存在三个问题:
- 您不能将
MPI_BYTE
与bool
一起使用。 MPI 标准允许您将MPI_C_BOOL
与_Bool
一起使用,另一个选项是在传输MPI_BYTE
[=36= 之前在bool
和byte
之间手动转换] - 您没有正确使用
MPI_Isend()
或MPI_Recv()
。您应该有一个请求数组,最后调用MPI_Waitall()
。 - 您可以在第一个循环中
MPI_Irecv()
所有远程对等点,然后MPI_Test()
查看消息是否已到达另一个循环(请注意,您将需要c_req
),或者在消息到达之后有一个MPI_Iprobe()
和MPI_Recv()
的循环(这需要一个c_req
.
作为旁注,除非您在 while
循环中进行任何处理,否则您可能需要考虑集体操作,例如 MPI_Alltoall()
.