MPI_Ibcast+MPI_测试无法接收数据
我有一个数据需要广播给工人。 但是,即使我使用MPI_Wait而不是MPI_Test,我也无法接收它,除非我使用阻塞MPI_Bcast 我不知道会发生什么,我尝试过很多方法,但都不管用 我的代码有什么错误吗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
#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);