C++ 从不同的线程调用MPI_Init安全吗?

C++ 从不同的线程调用MPI_Init安全吗?,c++,mpi,C++,Mpi,从std::线程调用MPI_Init安全吗 好的,这里有两个问题 1问题中的代码是否安全 是的,这里显示的代码是100%安全的,因为MPI计算发生在单个线程上。如果出现问题,我们需要一个可复制的示例,其中包括编译器和有关集群的一些信息。有一种可能是由于供应商特定的配置问题,许多年前,供应商会为MPI的主线程提供支持 2 MPI是线程安全的吗?你能在第二个线程上调用MPI_RECV吗 这里讨论的是一个更难的问题:好的,这里有两个问题 1问题中的代码是否安全 是的,这里显示的代码是100%安全的,因

从std::线程调用MPI_Init安全吗


好的,这里有两个问题

1问题中的代码是否安全

是的,这里显示的代码是100%安全的,因为MPI计算发生在单个线程上。如果出现问题,我们需要一个可复制的示例,其中包括编译器和有关集群的一些信息。有一种可能是由于供应商特定的配置问题,许多年前,供应商会为MPI的主线程提供支持

2 MPI是线程安全的吗?你能在第二个线程上调用MPI_RECV吗


这里讨论的是一个更难的问题:

好的,这里有两个问题

1问题中的代码是否安全

是的,这里显示的代码是100%安全的,因为MPI计算发生在单个线程上。如果出现问题,我们需要一个可复制的示例,其中包括编译器和有关集群的一些信息。有一种可能是由于供应商特定的配置问题,许多年前,供应商会为MPI的主线程提供支持

2 MPI是线程安全的吗?你能在第二个线程上调用MPI_RECV吗

这里讨论的是一个更难的问题:

有一个关于MPI和线程的部分。其中一个重要部分是:

初始化和完成对MPI_FINALIZE的调用应在初始化MPI的同一线程上进行。我们把这个线程称为主线程。该调用只应在 所有进程线程都已完成其MPI调用,并且没有挂起的通信或I/O操作

您的代码确实满足了这个要求

MPI知道多个级别的线程支持。您的代码需要:

MPI_线程\u漏斗进程可能是多线程的,但应用程序必须确保只有主线程进行MPI调用

为了更好地测量,您应该调用以下函数,而不是MPI_Init:

非线程兼容的MPI库必须返回provided==MPI\u thread\u SINGLE,这表示您无法在代码中正确使用此实现

在实践中,您应该对常见的实现很熟悉。有关不同级别的线程支持的更多信息,请参阅MPI标准中的12.4.3。有了更高级别的线程支持,您的里程可能会因您选择的实现而异。

有一节介绍MPI和线程。其中一个重要部分是:

初始化和完成对MPI_FINALIZE的调用应在初始化MPI的同一线程上进行。我们把这个线程称为主线程。该调用只应在 所有进程线程都已完成其MPI调用,并且没有挂起的通信或I/O操作

您的代码确实满足了这个要求

MPI知道多个级别的线程支持。您的代码需要:

MPI_线程\u漏斗进程可能是多线程的,但应用程序必须确保只有主线程进行MPI调用

为了更好地测量,您应该调用以下函数,而不是MPI_Init:

非线程兼容的MPI库必须返回provided==MPI\u thread\u SINGLE,这表示您无法在代码中正确使用此实现


在实践中,您应该对常见的实现很熟悉。有关不同级别的线程支持的更多信息,请参阅MPI标准中的12.4.3。使用更高级别的线程支持,您的里程可能会因您选择的实现而有所不同。

我看不出这有什么错,但我想知道这是为了什么。您可能也想使用更好的界面。目前我是这样想的,但Boost.MPI本身也有一系列问题。很多时候,你不得不回到MPI文档来猜测到底发生了什么。我看不出这有什么错,但我想知道这是为了什么。你可能也想使用更好的界面。我暂时是这样想的,但是Boost.MPI也有它自己的一系列问题。很多时候,你不得不回到MPI文档来猜测到底发生了什么。非常感谢。我知道,MPI通常不是线程安全的,我不得不用艰苦的方式学习这一点。我甚至会说,你的答案的第2部分是不明智的。这种情况或多或少会造成僵局。@HenriMenke哪一部分?我不建议将线程库(又称pthreads/std::用于节点本地通信)与节点间的MPI结合使用,如果不仅仅是为了代码复杂性的话。虽然有些研究小组有太多的资源做这件事。非常感谢。我知道,MPI通常不是线程安全的,我不得不用艰苦的方式学习这一点。我甚至会说,你的答案的第2部分是不明智的。这种情况或多或少会造成僵局。@HenriMenke哪一部分?我不建议将线程库(又称pthreads/std::用于节点本地通信)与节点间的MPI结合使用,如果不仅仅是为了代码复杂性的话
. 虽然有些研究小组有太多的资源做这件事。非常感谢。这是非常详细的标准参考thx。非常感谢。这是非常详细的thx参考标准。
int main(int argc, char** argv) {

    std::thread mpi_thread([...](){
        MPI_Init(...);

       // All MPI calls are done by this thread.

        MPI_Finalize();
    });

    // The main thread is doing different stuff

    mpi_thread.join();
    return 0;
}
int provided;
MPI_Init_thread(NULL, NULL, MPI_THREAD_FUNNELED, &provided);
if (provided < MPI_THREAD_FUNNELED)
    MPI_Abort(MPI_COMM_WORLD, -1);