2011-03-18 2 views
0

안녕 나는 지금 내 테스트 프로그램의 목표는 시작에 불과 다른 하나 개의 프로세서에서 10 개 번호를 전송하는 것입니다이은 FORTRAN 90 구조

type some 
    u    ! actual code will have 17 such scalars 
end type some 
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars 

처럼 포트란 구조를 사용하려고를 MPI_type_contiguous 및 MPI_Type_CREATE_Subarray을 사용하려면 이 10 가지 숫자의 포인트가 나의 선택 일 것입니다 (예를 들어, 20 개의 숫자가 필요하지 않은 벡터를 가지고 있다면 첫 번째 10 개의 숫자를 다음 프로세서로 가져 가면서 5 번째에서 15 번째까지 선택할 수 있습니다). 그래서 일단 u는 내가 송신 녹화를 할이

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) 

처럼 mpi_type_contiguous 사용 (I 2 프로세서를 테스트입니다)

if(rank.EQ.0)then 
    do k= 2,nz-1 
    metvars(k)%u = k 
    un(k)=k 
    enddo 
endif 

내가 다른 프로세서로 처음 10 개 번호를 얻을 수 있었다 두 번째 부분은 지금 이것을

를 보내기 전 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 
,617,451 사용

이 작업을 수행하는 방법을 모르겠다.

나는

[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을 가진 구조를 가지고 있으므로이 작업을 수행해야합니다. 나도 그럴 수있는 더 좋은 방법이 있다면 몰라. 어떤 종류의 도움이나 건의 사항도 환영합니다. 미리 감사드립니다.

+0

코드 스 니펫을 선택하고 {} 버튼을 누르면 코드의 형식이 올바르게 지정됩니다. – suszterpatt

답변

0

사용자 지정 유형에 실제가 1 개 포함되어 있다고 가정합니다. 지정되지 않았습니다. 처음에는 이러한 변수 중 연속 변수 10 개를 구성합니다. 즉, MPI_METVARS는 10 개의 인접한 실수를 나타냅니다. 자, 여러분이 올린 코드가 불완전 할 수도 있기 때문에 이것이 정말로 문제인지는 모르겠지만, 이제는 10 개의 MPI_METVARS 유형의 하위 배열을 구성한다는 것을 알 수 있습니다. 즉, newtype에서 100 개의 연속적인 실수를 가짐을 의미합니다 및 newtype2.

구조체를 처리하는 '올바른'방법은 MPI_METVARS 유형 인 MPI_TYPE_CREATE_STRUCT를 사용하여 유형을 생성하는 것입니다.

그래서 pls는 사용자 정의 유형에 대한 올바른 코드를 제공하고 newtype 유형의 크기를 확인합니다.

+0

고맙습니다. 제 질문에 대한 답변입니다. – user665903

+0

안녕 다시 이것은 병렬 입출력의 구현에 관한 것입니다. – user665903