C++11 和 MPI 库的兼容性
compatibility of c++11 and MPI library
在我的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编译器一起使用。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- MPI突然停止了对多个核心的操作
- 设置 Visual Studio for MPI: 找不到标识符错误
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 重载 MPI 中的运算符 ()
- 提升序列化 1:73 的向后兼容性问题
- MPI:检查是否有任何进程已终止
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 使用 pybind11 共享 MPI 通信器
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- Visual Studio 19-17 库兼容性根据 GL 标志
- 在具有 MPI 的超立方体中广播
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 使用 MPI 的 C++ 中的并行 for 循环
- 如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?
- C++ ABI 兼容性问题/张量流
- C++11 和 MPI 库的兼容性