如果我想使用64位接口,我可以为ifort指定-i8
编译器标志,或为gfortran指定-fdefault-integer-8
。
在MPI中,MPI_INTEGER定义为固定的32位整数:https://www.ibm.com/support/knowledgecenter/SSFK3V_2.3.0/com.ibm.cluster.pe.v2r3.pe400.doc/am106_pmd.htm
如果我有一个简单的电话,例如:
MPI_Bcast(buffer, count, MPI_DATATYPE, root, MPI_COMM_WORLD, ierr)
如何通过MPI_DATATYPE
使其达到默认值?即设置MPI_INTEGER8
时-i8
或MPI_INTEGER4
设置为MPI_DATATYPE
我正在考虑通过常量来做,但我不知道integer(4)
的类型是什么。是MPI_COMM_WORLD
就像program main
use mpi
integer(4) :: sz
integer(4) :: ierr
call MPI_Init(ierr)
call MPI_Type_size(MPI_INTEGER4, sz, ierr)
write (* ,* ) "4 = ", sz
call MPI_Type_size(MPI_INTEGER8, sz, ierr)
write (* ,* ) "8 = ", sz
call MPI_Type_size(MPI_INTEGER, sz, ierr)
write (* ,* ) "? = ", sz
call MPI_Finalize(ierr)
end program main
一样吗?
编辑:我刚刚意识到,不同的MPI实现表现不同:
> $ ./bla.x
4 = 4
8 = 8
? = 4
IntelMPI:
> $ ./bla.x
4 = 4
8 = 8
? = 8
的openmpi:
Rw
答案 0 :(得分:2)
"在MPI中,MPI_INTEGER被定义为固定的32位整数"它不是。这只适用于您链接到的特定MPI库。如果您链接真正的MPI答案,请链接到官方MPI规范。
如果要使用特殊标志来彻底更改默认行为,则必须编译MPI库以了解该标志。实施可能支持也可能不支持这种改变,但理论上应该是可能的。
网上有一些教程可以显示某些MPI实现的编译。使用您的搜索引擎查找http://diracprogram.org/doc/release-12/installation/int64/mpi.html http://linuxtoolkit.blogspot.cz/2013/08/building-openmpi-libraries-for-64-bit.html和其他人的链接。
如果你希望在不关心编译器今天决定使用的默认整数的情况下进行移植,并且需要使MPI库与之同步,只需使用具有一些固定存储大小的整数变量,如worker.walletloadbalancer.balance_workers=wallet,2
和{{ 1}}。那些常量常量在integer(int32)
模块中定义。
或者不要使用/更改这些丑陋的标志,以便确保MPI库具有与编译器默认设置相同的设置。