gpt4 book ai didi

c++ - MPI_Irecv 在这个简单的代码中没有收到消息

转载 作者:行者123 更新时间:2023-11-28 04:17:08 27 4
gpt4 key购买 nike

我有这段代码用于测试 MPI_Irecv 和 MPI_Isend

    if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} while(flag != 0);

}
if(rank==0){
int cc=0;
MPI_Request request;
for(int i=1;i<10;i++){
cc+=1;
MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
}
}

如果我执行这段代码,有时它会打印从 1 到 9 的 cc,有时什么也不会打印。

这是有道理的,因为进程 0 可能在进程 1 完成后执行。

但是,如果我让进程 1 像这样无限循环:

    if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} while(true);

}

我认为进程 1 每次都会打印 cc 从 1 到 9,但它不会。

如果我在进程 1 中插入 MPI_Wait(),似乎进程 1 每次都会打印 cc 从 1 到 9。但如果其他进程没有发送任何内容并且我实际上想要非阻塞通信,它也会永远等待。

回复评论:

1.关于版本:mpiexec --versionmpiexec (OpenRTE) 2.1.1

2.我不明白“MPI 进度线程”是什么意思。

其实我希望每个进程都可以无阻塞地相互通信,并且每次接收时都在缓冲区中获取信息。

3.可执行代码如下

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <unistd.h>

int main(void)
{
MPI_Comm allcomm;
int i;
int size, rank, irank;
int tablesize, localtablesize;
int *table,*table2;

allcomm = MPI_COMM_WORLD;
MPI_Init(NULL, NULL);
MPI_Comm_size(allcomm, &size);
MPI_Comm_rank(allcomm, &rank);

if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} //while(flag!=0);
while(true);

}
if(rank==0){
int cc=0;
MPI_Request request;
for(int i=1;i<10;i++){
cc+=1;
MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
}
}
MPI_Finalize();
}

最佳答案

您的程序不正确。

例如,如果rank 1比rank 0快,第一个MPI_Test()将不匹配任何消息,然后直接走到 MPI_Finalize()

最重要的是,这个程序可能会打印 0 到 10 行。如果排名 1 以某种方式落后于排名 0,此程序将只打印 10 行,但由于两个排名不同步,所以这不太可能发生。

关于c++ - MPI_Irecv 在这个简单的代码中没有收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56331205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com