C ++ 11和MPI库的兼容性

在我的linux中安装gcc和mpich库之后,我可以使用mpicxx编译器编译我的代码。 是否有可能只使用gcc编译器使用mpi库的c + + 11?

一般情况下,用新版本更改编译器应该工作,除非观察到一些强大的代码生成更改(例如不同的数据对齐或不同的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_THERAD_SINGLE大多数MPI实现支持开箱即用的MPI_THREAD_FUNNELED ,最多只支持MPI_THERAD_SINGLE 。 打开MPI例如必须编译一个非默认选项才能获得完整的线程支持。

多线程应用程序应该使用MPI_Init_thread()而不是MPI_Init_thread()来初始化MPI库,并且使初始化调用的线程成为主线程 – 当支持的级别为MPI_THREAD_FUNNELED时,只允许调用MPI的主线程是完全相同的。 一个给MPI_Thread_init() 所需的线程支持级别,并且该函数返回可能低于期望值的支持级别。 在后一种情况下,正确的和可移植的程序应该相应地起作用,并且要么切换到非线程操作,要么将相应的错误消息中止到用户。

有关MPI如何与线程一起工作的更多信息可以在MPI Standard 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' 

在我的情况下,我使用openport 1.5.5与来自macports的gcc 4.7编译器。