在我的 linux 中安装 gcc 和 mpich 库后,我可以使用编译器编译我的代码mpicxx
。只需升级 gcc 编译器就可以将 c++11 与 mpi 库一起使用吗?
3 回答
据我所知,没有问题,因为您不应该以任何方式篡改 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
.
除非观察到一些强烈的代码生成更改(例如不同的数据对齐或不同的 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
. 例如,必须使用非默认选项编译 Open MPI 以获得完整的线程支持。
多线程应用程序应该使用 in 来初始化 MPI 库MPI_Init_thread()
,MPI_Init()
并且进行初始化调用的线程成为主线程- 相同的主线程只允许在支持的级别为 时调用 MPI MPI_THREAD_FUNNELED
。一个给出MPI_Thread_init()
所需的线程支持级别,该函数返回可能低于所需的支持级别。在后一种情况下,正确和可移植的程序应该相应地采取行动,或者切换到非线程操作,或者中止向用户发送相应的错误消息。
有关 MPI 如何与线程一起工作的更多信息,请参见MPI Standard v2.2。
将 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 编译器。