【发布时间】:2015-06-01 02:03:22
【问题描述】:
我正在使用MPI_Probe 动态发送消息(接收方不知道正在发送的消息的大小)。我的代码看起来有点像这样 -
if (world_rank == 0) {
int *buffer = ...
int bufferSize = ...
MPI_Send(buffer, buffersize, MPI_INT, 1, 0, MPI_COMM_WORLD);
} else if (world_rank == 1) {
MPI_Status status;
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
int count = -1;
MPI_Get_count(&status, MPI_INT, &count);
int* buffer = (int*)malloc(sizeof(int) * count);
MPI_Recv(buffer, count, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
如果我在多个线程中运行此代码,是否有可能MPI_Probe 在一个线程中被调用,MPI_recv 在另一个线程中被调用,因为调度程序交错线程。本质上,上面的代码是线程安全的。
【问题讨论】:
-
你说得对,这是一个竞争条件,在 MPI 3 之前没有办法解决它,MPI_Mprobe 可能还有 MRecv。例如见Jeff Squyres' blog post。
-
@JonathanDursi,链接已损坏。 Jeff Squyres 来自 Internet Archive web.archive.org/web/20151015111933/https://blogs.cisco.com/… 的博客文章。不幸的是,图片(帖子的重要部分)丢失了。
标签: multithreading mpi openmpi