C 当有消息时,MPI_Iprobe将标志设置为0

C 当有消息时,MPI_Iprobe将标志设置为0,c,mpi,openmpi,C,Mpi,Openmpi,我试图探测消息,以便在MPI进程(8个进程)之间进行通信。到达代码某一部分的第一个进程将向所有其他进程发出信号,其他进程将在到达该部分后终止 以下是我实现的:(欢迎使用任何更简单的解决方案) if(深度==大小){ endTime=MPI_Wtime(); MPI_Iprobe(MPI_任意源、0、MPI_通信世界和统计、MPI_状态忽略); 如果(!stat){ printf(“执行在%.5f秒内完成。\n”,endTime-beginTime); 对于(ctr=0;ctr

我试图探测消息,以便在MPI进程(8个进程)之间进行通信。到达代码某一部分的第一个进程将向所有其他进程发出信号,其他进程将在到达该部分后终止

以下是我实现的:(欢迎使用任何更简单的解决方案)

if(深度==大小){
endTime=MPI_Wtime();
MPI_Iprobe(MPI_任意源、0、MPI_通信世界和统计、MPI_状态忽略);
如果(!stat){
printf(“执行在%.5f秒内完成。\n”,endTime-beginTime);
对于(ctr=0;ctr
代码是不言自明的
stat
是一个虚拟变量,仅用于“发送”消息,还用作
Iprobe
的标志。问题是,stat在所有进程中始终为零,这意味着探测不会返回任何等待接收的消息。但我可以确认MPI_Isend运行正确并发送消息

我是在做一些根本错误的事情,还是在某个我看不见的地方有一个简单的错误

谢谢


Can.

您的代码根本错误,因为您没有完成
MPI\u Isend
操作。它可能适用于您的情况(例如,考虑到您的MPI实现),因为消息非常小,很可能使用渴望协议发送,但标准要求您等待/测试
req
句柄。我该怎么做?我找不到任何涉及测试/等待的示例。我发现的那些与测试/等待无关。
if(depth == size){
    endTime = MPI_Wtime();
    MPI_Iprobe(MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &stat, MPI_STATUS_IGNORE);
    if(!stat){
        printf("Execution completed in %.5f seconds.\n", endTime - beginTime);
        for (ctr = 0; ctr < mpi_processors; ctr++) {
            if(ctr == mpi_my_pid) continue;
            MPI_Isend(&stat, 1, MPI_INT, ctr, 0, MPI_COMM_WORLD, &req);
            printf("sent to %d from %d\n",ctr,mpi_my_pid);

        }
    }
    return 1;
}