MPI_Ibcast+MPI_测试无法接收数据

MPI_Ibcast+MPI_测试无法接收数据,c,mpi,C,Mpi,我有一个数据需要广播给工人。 但是,即使我使用MPI_Wait而不是MPI_Test,我也无法接收它,除非我使用阻塞MPI_Bcast 我不知道会发生什么,我尝试过很多方法,但都不管用 我的代码有什么错误吗 #include <stdio.h> #include <unistd.h> #include <mpi.h> int main() { int rank, size; int data; MPI_Init(NULL, NULL

我有一个数据需要广播给工人。 但是,即使我使用MPI_Wait而不是MPI_Test,我也无法接收它,除非我使用阻塞MPI_Bcast

我不知道会发生什么,我尝试过很多方法,但都不管用

我的代码有什么错误吗

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

int main()
{
    int rank, size;
    int data;

    MPI_Init(NULL, NULL);

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    printf("MPI start %d/%d\n", rank, size);

    if (rank == 0)
    {
        sleep(1);
        data = 1;
        printf("MPI %d/%d bcast\n", rank, size);
        MPI_Bcast(&data, 1, MPI_INT, 0, MPI_COMM_WORLD);
    }
    else
    {
        int flag = 0;
        MPI_Request req = MPI_REQUEST_NULL;
        MPI_Status status;
        MPI_Ibcast(&data, 1, MPI_INT, 0, MPI_COMM_WORLD, &req);
        while (flag == 0) {
            MPI_Test(&req, &flag, &status);
            usleep(100 * 1000);
        }
        // MPI_Bcast can be done!
        //MPI_Bcast(&data, 1, MPI_INT, 0, MPI_COMM_WORLD);
        printf("MPI %d/%d recv bcast data: %d\n", rank, size, data);
    }
    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Finalize();
    return 0;
}

我恐怕你不能简单地把0级的MPI\u广播和其他级的MPI\u Ibcast混合在一起。

我恐怕你不能简单地把0级的MPI\u广播和其他级的MPI\u Ibcast混合在一起。

Gilles完全正确,MPI明确指出

与点到点操作不同,非阻塞集合操作与阻塞集合操作不匹配[…]

不过,有一个非常简单的修复方法,只需将您的MPI_Bcast替换为:


Gilles是绝对正确的,MPI明确指出

与点到点操作不同,非阻塞集合操作与阻塞集合操作不匹配[…]

不过,有一个非常简单的修复方法,只需将您的MPI_Bcast替换为:


只是一个小提示:不要在MPI_测试上循环,除非你在循环中有有用的工作要做,或者你想让线程休眠,而你的MPI实现不能正确地支持它。或者使用MPI_Wait.Yep,我只是用它来代表其他代码,谢谢你的建议。顺便问一下,有没有办法像select一样将pthread_cond_Wait和MPI_Wait结合起来?我在工作线程中有一个循环,我需要等待pthread_cond_signal和MPI_Send.Not直接发出的通知。我想您可以做一些事情,比如向自己的线程发送消息并使用MPI_Waitany,或者做一些线程欺骗。非常确定任何类似的东西都需要MPI_THREAD_MULTIPLE.hmmmm,如果我关心来自两者的实时通知,那么实现这一点的唯一方法似乎是进行线程欺骗。只需一句小小的注释:不要在MPI_测试上循环,除非在循环中有有用的工作要做,或者b您希望线程休眠,而您的MPI实现无法正确支持。或者使用MPI_Wait.Yep,我只是用它来代表其他代码,谢谢你的建议。顺便问一下,有没有办法像select一样将pthread_cond_Wait和MPI_Wait结合起来?我在工作线程中有一个循环,我需要等待pthread_cond_signal和MPI_Send.Not直接发出的通知。我想您可以做一些事情,比如向自己的线程发送消息并使用MPI_Waitany,或者做一些线程欺骗。非常确定任何类似的东西都需要MPI_THREAD_MULTIPLE.hmmmm,看起来实现这一点的唯一方法是做线程欺骗,如果我关心来自两者的实时通知。是的,你是对的,我只是认为有相同的简单。是的,你是对的,我只是认为有相同的简单。顺便说一句,有没有办法为没有MPI 3.0实现的旧版本MPI模拟MPI_Ibcast?哦!这正是我想要的!顺便说一句,有没有办法为没有MPI3.0实现的旧版本MPI模拟MPI_Ibcast?哦!这正是我想要的!
MPI start 0/5
MPI start 1/5
MPI start 2/5
MPI start 3/5
MPI start 4/5
MPI 0/5 bcast
MPI_Request req;
MPI_Status status;
MPI_Ibcast(&data, 1, MPI_INT, 0, MPI_COMM_WORLD, &req);
MPI_Wait(&req, &status);