0

こんにちは、このような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 を使用した構造があるため、この場合はそれを行う必要があります。それを行うためのより良い方法があるかどうかはわかりません。どんな種類のヘルプや提案も大歓迎です。前もって感謝します

4

1 に答える 1

0

指定されていないため、カスタムタイプには実数が1つ含まれていると想定しています。最初に、これらの変数の 10 個の連続型を作成します。つまり、MPI_METVARS は 10 個の連続する実数を表します。投稿したコードが不完全である可能性があるため、これが本当に問題であるかどうかはわかりませんが、現在の外観は、10 個の MPI_METVARS 型のサブ配列を作成することです。そしてnewtype2。

構造体を処理する「正しい」方法は、MPI_TYPE_CREATE_STRUCT を使用して構造体の型を作成することです。これは MPI_METVARS 型である必要があります。

そのため、カスタム タイプの正しいコードを提供し、newtype タイプのサイズを確認してください。

于 2011-03-20T19:19:37.453 に答える