안녕 나는 지금 내 테스트 프로그램의 목표는 시작에 불과 다른 하나 개의 프로세서에서 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을 가진 구조를 가지고 있으므로이 작업을 수행해야합니다. 나도 그럴 수있는 더 좋은 방법이 있다면 몰라. 어떤 종류의 도움이나 건의 사항도 환영합니다. 미리 감사드립니다.
코드 스 니펫을 선택하고 {} 버튼을 누르면 코드의 형식이 올바르게 지정됩니다. – suszterpatt