没有问题,因为你不应该以任何方式篡改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.例如,打开MPI必须使用非默认选项进行编译,以获得完整的线程支持.
多线程应用程序应该使用MPI_Init_thread()而不是初始化MPI库,MPI_Init()并且使初始化调用的线程成为主线程 - 只有在支持的级别时才允许调用MPI的主线程MPI_THREAD_FUNNELED.一个给人MPI_Thread_init()的期望线程支持的水平和函数返回的支持,这可能是低于预期的水平.在后一种情况下,正确的和可移植的程序应该相应地起作用,并且切换到非线程操作或者用相应的错误消息中止到用户.
有关MPI如何与线程协同工作的更多信息,请参阅MPI标准v2.2.
| 归档时间: |
|
| 查看次数: |
5906 次 |
| 最近记录: |