こんにちは、このようなfortran構造を使用しようとしています
type some
u ! actual code will have 17 such scalars
end type some
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars
ここで、私のテスト プログラムの目的は、あるプロセッサから別のプロセッサに 10 個の数字を送信することですが、これらの 10 個の数字の開始点は私の選択です (たとえば、必要のない 20 個の数字のベクトルがある場合、最初の 10 個の数字を使用して次のプロセッサですが、私の選択は 5 から 15 です)。まず、このように 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)
send rec を実行し、最初の 10 個の数字を他のプロセッサに取得できました (2 つのプロセッサでテストしています)。
if(rank.EQ.0)then
do k= 2,nz-1
metvars(k)%u = k
un(k)=k
enddo
endif
これを送ります
2番目の部分では、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 部分がなくても subarray コマンドを使用できました。ただし、両方を組み合わせると、実際のコードに fortran を使用した構造があるため、この場合はそれを行う必要があります。それを行うためのより良い方法があるかどうかはわかりません。どんな種類のヘルプや提案も大歓迎です。前もって感謝します