gpt4 book ai didi

c++ - 交错式 MPI Isend/Recv 的安全保证

转载 作者:行者123 更新时间:2023-11-28 07:02:53 26 4
gpt4 key购买 nike

related question 中我了解到执行 request = Isend(...);接收(...); request.Wait(); 保证工作,因为 Isend 可能不会做任何事情,直到 request.Wait(),因此在 Recv(...) 处陷入僵局(有关详细信息,请参阅原始问题)。

但是如果 Isend()/Wait() 是在另一个线程而不是 Recv 上执行的呢?我现在对标准的安全保证不直接感兴趣。这是因为如果调用适当的 Init_thread 方法并返回正确的级别,则该标准仅断言线程安全。对于我的 openMPI 配置,情况并非如此。但是,我看不出一个实现实际上将调用限制为仅来自调用 Init_thread 的线程的原因(需要对线程 ID 进行实际比较)。我的理由是:如果我序列化所有发送和所有接收,mpi 应该永远无法注意到我使用了多个线程。

所以我的简化代码是这样的:

#include <cassert>
#include <thread>
#include "mpi.h"

void send(int rank, int& item)
{
MPI::Request request = MPI::COMM_WORLD.Isend(&item, sizeof(int), MPI::BYTE, rank, 0);
request.Wait();
}

void recv(int rank, int& item)
{
MPI::COMM_WORLD.Recv(&item, sizeof(int), MPI::BYTE, rank, 0);
}

int main()
{
MPI::Init();
int ns[] = {-1, -1};
int rank = MPI::COMM_WORLD.Get_rank();
ns[rank] = rank;
auto t_0 = std::thread(send, 1 - rank, std::ref(ns[rank])); // send rank to partner (i.e. 1 - rank)
auto t_1 = std::thread(recv, 1 - rank, std::ref(ns[1 - rank])); // receive partner rank from partner
t_0.join();
t_1.join();
assert( ns[0] == 0 );
assert( ns[1] == 1 );
MPI::Finalize();
}

代码解释:每个处理器上执行两个线程。一个尝试Isend一些数据给合作伙伴并等待直到完成,另一个从合作伙伴接收一些数据。

问题:我可以安全地假设大多数 MPI 实现不会在这段代码上阻塞吗?

(免责声明:这段代码并不是为了异常安全或特别漂亮而设计的。它仅用于演示目的)

最佳答案

Question: Can I safely assume that most implementations of MPI don't choke up on this piece of code?

在实践中 - 是的,如果您添加同步(您的代码缺少同步);理论上-不。虽然某些实现可能允许在 MPI_THREAD_SINGLE 级别从不同线程进行序列化调用(Open MPI 就是这样一个 - 请参阅 here ),但 MPI 标准要求库必须在初始化MPI_THREAD_SERIALIZED 级别。如果您希望您的软件具有可移植性并且能够与其他 MPI 实现一起正确编译和运行,则不应依赖某些特定的 Open MPI 行为。

也就是说,在构建库时,可以将 Open MPI 配置为支持多线程 (MPI_THREAD_MULTIPLE)。出于性能原因,默认情况下未启用 MT 支持。您可以使用 ompi_info 检查特定安装的状态:

$ ompi_info | grep MPI_THREAD_MULTIPLE
Thread support: poxis (MPI_THREAD_MULTIPLE: no, progress: no)
^^^^^^^^^^^^^^^^^^^^^^^

该特定构建不支持多线程,并且将始终在 MPI_Init_threadprovided 输出参数中返回 MPI_THREAD_SINGLE

关于c++ - 交错式 MPI Isend/Recv 的安全保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22174639/

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