2011-03-18 31 views
0

嗨 我试图用这样要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表示赞赏。 在此先感谢

+0

选择代码片段,然后按{}按钮以正确格式化代码。 – suszterpatt 2011-03-18 10:59:57

回答

0

我假设您的自定义类型包含1个实数,因为它没有指定。你首先构造一个连续类型的10个变量,即MPI_METVARS代表10个连续的实数。现在,我不知道这是否真的是问题所在,因为您发布的代码可能不完整,但现在看起来是您构造了10个MPI_METVARS类型的子阵列,这意味着您实际上有100个新类型的连续实数和newtype2。

处理该结构的“正确”方式是使用MPI_TYPE_CREATE_STRUCT为其创建类型,该类型应该是您的MPI_METVARS类型。

因此,请为您的自定义类型提供正确的代码并检查新类型的大小。

+0

谢谢我想这是我的问题的答案。 – user665903 2011-03-30 11:42:06

+0

嗨,再次这是关于并行IO的实现。 – user665903 2011-05-02 13:42:03