具有多个 Pthread 的 MPI

Posted

技术标签:

【中文标题】具有多个 Pthread 的 MPI【英文标题】:MPI with Multiple Pthreads 【发布时间】:2016-08-02 11:39:02 【问题描述】:

我正在使用以下代码段为多个线程初始化 mpi 库。但是我总是得到以下输出,说这个 MPI 实现不支持 MPI_THREAD_MULTIPLE。

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); 
if(provided != MPI_THREAD_MULTIPLE) 

   fprintf(stderr, "This MPI implementation does not support MPI_THREAD_MULTIPLE.\n"

在做

mpiexec --version and ompi_info

我得到这个输出:mpiexec (OpenRTE) 1.4.3 和 Open MPI: 1.4.3

我使用mpicc mpi_hello.c 编译,其中c 文件包含上述代码部分。任何想法为什么我的 mpi 库不支持多线程? 我想从不同的线程而不是进程发送和接收 mpi 消息。

谢谢

【问题讨论】:

【参考方案1】:

您没有指定您正在使用哪个平台或发行版或构建。您使用的库很可能没有配置为多线程使用。从源代码构建时,您需要使用以下内容构建它:

$ ./configure --enable-mpi-thread-multiple

您可以通过运行测试您的二进制文件具有哪些功能:

$ ompi_info | grep -i thread
          Thread support: posix (mpi: yes, progress: no)

如果不支持,您可能需要build from source。

请咨询OpenMPI documentation on MPI_Init_Thread了解重要详情,包括在此模式下运行的限制信息:

请注意,MPI_THREAD_MULTIPLE 支持仅经过轻微测试。它可能不适用于线程密集型应用程序。另请注意,只有下面列出的 BTL 的 MPI 点对点通信功能被认为是线程安全的。其他支持功能(例如 MPI 属性)在被多个线程同时使用时尚未被证明是安全的。

请注意,您报告的版本(1.4)也很旧;当前的稳定版本是v1.10。

如果您想使用多线程,您可能需要重新考虑您的设计;有几个线程框架(例如Threaded Building Blocks)比 MPI 更适合,后者主要用于集群应用程序。一些替代方案:

【讨论】:

【参考方案2】:

查看 MPI 关于线程支持的文档: 如果使用 --enable-mpi-thread-multiple 配置开关配置 Open MPI,则包括 MPI_THREAD_MULTIPLE 支持。您可以检查 ompi_info(1) 的输出以查看 Open MPI 是否支持 MPI_THREAD_MULTIPLE:

shell$ ompi_info | grep -i thread
      Thread support: posix (mpi: yes, progress: no)

上述输出的“mpi: yes”部分表示 Open MPI 是在 MPI_THREAD_MULTIPLE 支持下编译的。

所以检查你系统上的 ompi_info 输出,看看它是否受支持。

【讨论】:

这个答案虽然很老,但当然仍然是正确的。我只想补充一点,ompi_info | grep -i thread 的输出现在看起来不同了;例如使用 OpenMPI 3.1 版,我得到以下信息:Thread support: posix (MPI_THREAD_MULTIPLE: yes, OPAL support: yes, OMPI progress: no, ORTE progress: yes, Event lib: yes)

以上是关于具有多个 Pthread 的 MPI的主要内容,如果未能解决你的问题,请参考以下文章

pthread_join - 多个线程等待

pthread多线程是指同时运行多个程序吗?

pthread_create()创建线程时传入多个參数

Linux--线程

使用 pthread 分割和搜索数组段的问题

在可能尚未创建的pthread_t上调用pthread_join