gpt4 book ai didi

multithreading - 使用 MPI_Probe 的线程安全

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

我正在使用 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 不是线程安全的。您必须检查您的特定库是否已针对线程安全进行编译,然后使用 MPI_Init_thread 初始化 MPI。而不是 MPI_Init .

假设您的 MPI 实例是为线程安全例程初始化的,由于您已经确定的竞争条件,您的代码仍然不是线程安全的。
MPI_Probe的配对和 MPI_Recv在多线程环境中不是线程安全的,这是 MPI-2 中的一个已知问题:http://htor.inf.ethz.ch/publications/img/gregor-any_size-mpi3.pdf

至少有两种可能的解决方案。您可以使用 MPI-3 MPI_MprobeMPI_MRecv ,或在关键代码周围使用锁/互斥锁。这可能如下所示:

MPI-2 解决方案 (使用互斥锁/锁):

int number_amount;
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;
int count = -1;
/* aquire mutex/lock */
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
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);
/* release mutex/lock */
}

MPI-3 解决方案 :

int number_amount;
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_Message msg;
int count = -1;
MPI_Mprobe(0, 0, MPI_COMM_WORLD, &msg, &status);
MPI_Get_count(&status, MPI_INT, &count);
int* buffer = (int*)malloc(sizeof(int) * count);
MPI_Mrecv(buffer, count, MPI_INT, &msg, MPI_STATUS_IGNORE);
}

关于multithreading - 使用 MPI_Probe 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29305842/

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