在我的linux中安装gcc和mpich库后,我可以使用mpicxx
编译器编译我的代码。是否可以将c ++ 11与mpi库一起使用,只需升级gcc编译器?
答案 0 :(得分:5)
据我所知,没有问题,因为你不应该以任何方式篡改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
在自己的计算机上查看。
答案 1 :(得分:5)
除非观察到一些强大的代码生成变化(例如,不同的数据对齐或不同的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必须使用非默认选项进行编译,以获得完整的线程支持。
多线程应用程序应该使用MPI_Init_thread()
而不是MPI_Init()
来初始化MPI库,并且进行初始化调用的线程将成为主线程 - 完全相同的 main线程仅在支持的级别为MPI_THREAD_FUNNELED
时才允许调用MPI。一个提供MPI_Thread_init()
所需的级别的线程支持,该函数返回支持的级别,该级别可能低于所需级别。在后一种情况下,正确和可移植的程序应该相应地行动,并切换到非线程操作或中止相应的错误消息给用户。
有关MPI如何与线程协同工作的更多信息,请参阅MPI Standard v2.2。
答案 2 :(得分: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编译器。