嗨 我试图用这样要FORTRAN 90结构使用MPI_type_contiguous和MPI_Type_CREATE_Subarray
type some
u ! actual code will have 17 such scalars
end type some
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars
FORTRAN结构现在我的测试程序的目的是从一个处理器发送10号到另一个但出发这10个数字的点将是我的选择(例如,如果我有一个向量说20个数字不需要,我会采取前10个数字到下一个处理器,但可以说我的选择是从5到15)。因此,首先u使用mpi_type_contiguous这样
CALL MPI_TYPE_CONTIGUOUS(10,MPI_REAL,MPI_METVARS,ierr) ! declaring a derived datatype of the object to make it in to contiguous memory
CALL MPI_TYPE_COMMIT(MPI_METVARS,ierr)
我发送REC,并能获得第10号到另一处理器(我正在测试它的2个处理器)
if(rank.EQ.0)then
do k= 2,nz-1
metvars(k)%u = k
un(k)=k
enddo
endif
我用于第二部分发送此
现在 我用mpi_TYPE_CREATE_SUBARRAY所以 然后
array_size = (/20/)
array_subsize =(/10/)
array_start = (/5/)
CALL MPI_TYPE_CREATE_SUBARRAY(1,array_size,array_subsize,array_start,MPI_ORDER_FORTRAN,MPI_METVARS,newtype,ierr)
CALL MPI_TYPE_COMMIT(newtype,ierr)
array_size = (/20/)
array_subsize =(/10/)
array_start = (/0/)
CALL MPI_TYPE_CREATE_SUBARRAY(1,array_size,array_subsize,array_start,MPI_ORDER_FORTRAN,MPI_METVARS,newtype2,ierr)
CALL MPI_TYPE_COMMIT(newtype2,ierr)
if(rank .EQ. 0)then
CALL MPI_SEND(metvars,1,newtype,1,19,MPI_COMM_WORLD,ierr)
endif
if(rank .eq. 1)then
CALL MPI_RECV(newmetvars,1,newtype2,0,19,MPI_COMM_WORLD,MPI_STATUS_IGNORE,ierr)
endif
我不明白如何做到这一点。
我得到一个错误说
[flatm1001:14066] *** An error occurred in MPI_Recv
[flatm1001:14066] *** on communicator MPI_COMM_WORLD
[flatm1001:14066] *** MPI_ERR_TRUNCATE: message truncated
[flatm1001:14066] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
我在本地机器上使用了openmpi。我能够使用没有mpi_type_contiguous部分的子数组命令。但是,如果我将两者结合起来,因为在这种情况下,我需要这样做,因为我在真实代码中使用了fortran结构。我不知道是否有更好的方法来做到这一点。任何形式的帮助和suggestios表示赞赏。 在此先感谢
选择代码片段,然后按{}按钮以正确格式化代码。 – suszterpatt 2011-03-18 10:59:57