C++11 和 MPI 库的兼容性

compatibility of c++11 and MPI library

本文关键字:兼容性 MPI C++11      更新时间:2023-10-16

在我的Linux中安装gcc和mpich库后,我可以使用编译器编译mpicxx代码。是否可以将 c++11 与 mpi 库一起使用,只需升级 gcc 编译器?

使用较新版本更改编译器通常应该有效,除非观察到一些强大的代码生成更改(例如,不同的数据对齐方式或不同的 ABI)。MPI 是一个库,因此它不关心你使用什么语言结构,只要这些结构不弄乱它的内部结构。由于您将使用 C++11 作为它提供的线程,因此您应该注意一些事项。

首先,多线程并不总是与 MPI 配合得很好。大多数 MPI 实现本身都是内部线程的,但默认情况下不是线程安全的。

其次,MPI 定义了四个级别的线程支持:

  • MPI_THREAD_SINGLE:不支持线程 - MPI 只有在单线程应用程序使用时才可以安全运行;
  • MPI_THREAD_FUNNELED:部分线程支持 - MPI 可以在多线程应用程序中使用,但只有主线程可以调用 MPI;
  • MPI_THREAD_SERIALIZED:部分线程支持 - MPI 可以在多线程应用程序中使用,但不允许在不同线程中进行并发调用。也就是说,每个线程都可以调用 MPI,但必须建立序列化机制;
  • MPI_THREAD_MULTIPLE:全线程支持 - MPI 可以从许多线程自由调用。

事实是,大多数 MPI 实现最多支持开箱即用MPI_THREAD_FUNNELED,其中大多数仅支持 MPI_THERAD_SINGLE .例如,打开 MPI 必须使用非默认选项进行编译才能获得完整的线程支持。

多线程应用程序应使用 MPI_Init_thread() 而不是 MPI_Init() 初始化 MPI 库,并且进行初始化调用的线程成为线程 - 仅当支持的级别MPI_THREAD_FUNNELED时才允许调用 MPI 的主线程完全相同。一个为MPI_Thread_init()提供所需的线程支持级别,该函数返回可能低于预期的支持级别。在后一种情况下,正确的可移植程序应该相应地操作,并切换到非线程操作或中止,并向用户发送相应的错误消息。

有关 MPI 如何与线程协同工作的更多信息,请参阅 MPI 标准 v2.2。

据我所知没有问题,因为您不应该以任何方式篡改 MPI 指令,除此之外,MPI 和 C++11 问题是正交的。

顺便说一下,在我的机器上发布mpic++mpicxx(gcc 4.6.3,MPICH2 1.4.1)只是简单地转换为

c++ -Wl,-Bsymbolic-functions -Wl,-z,relro -I/usr/include/mpich2 -L/usr/lib -lmpichcxx -lmpich -lopa -lmpl -lrt -lcr -lpthread

您可以使用mpic++ -show在自己的计算机上进行检查。

将 C++11 与 MPI 结合使用是没有问题的。

mpic++ 和 mpicxx 只是包装器,使用标准编译器或用户指定的编译器。因此,您可以定义 mpic++ 和 mpicxx 使用与 C++11 兼容的编译器。

我不知道 mpich 的确切命令。对于 opemmpi,您需要设置以下环境标志:

export OMPI_CC='gcc-mp-4.7'
export OMPI_CXX='g++-mp-4.7'

就我而言,我将openmpi 1.5.5与macports的gcc 4.7编译器一起使用。