この質問は、MPI_type_create_subarrayとMPI_Gatherの既存のスレッドに続きます。私の目的は、MPI_Type_Create_SubarrayとFortran 90のMPI_Gathervを使って、マスタープロセス(ランク= 0)上のすべてのスレーブプロセス(4つの番号)からより大きい配列のサブアレイを大規模な配列に集めることです。プロジェクト。以下は、私のサンプルコードです:しかしFortran用MPI_Gathervを使用
program main
implicit none
include "mpif.h"
integer :: ierr, myRank, nProcs
integer :: sendsubarray, recvsubarray, resizedrecvsubarray
integer, dimension(2) :: starts,sizes,subsizes
integer, dimension(:), allocatable :: counts, disps
integer, parameter :: nx_glb=10, ny_glb=10, nx=5, ny=5
integer, dimension(:,:), target, allocatable :: mat, matG
integer, pointer :: sendPtr(:,:), recvPtr(:,:)
integer :: i, j
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world, myRank, ierr)
call mpi_comm_size(mpi_comm_world, nProcs, ierr)
sizes(1)=nx+2; sizes(2)=ny+2
subsizes(1)=nx; subsizes(2)=ny
starts(1)=2; starts(2)=2
call mpi_type_create_subarray(2, sizes, subsizes, starts, mpi_order_fortran, &
mpi_integer, sendsubarray, ierr)
call mpi_type_commit(sendsubarray,ierr)
allocate(mat(1:nx+2,1:ny+2))
do j=1, ny+2
do i=1, nx+2
if(i.eq.1 .or. i.eq.nx+2 .or. j.eq.1 .or. j.eq.ny+2) then
mat(i,j)=1000
else
mat(i,j) = myRank
end if
end do
end do
sendPtr=>mat
if(myRank.eq.0) then
allocate(matG(nx_glb,ny_glb))
matG=1000
sizes(1)=nx_glb; sizes(2)=ny_glb
subsizes(1)=nx; subsizes(2)=ny
starts(1)=1; starts(2)=1
call mpi_type_create_subarray(2, sizes, subsizes, starts, mpi_order_fortran, &
mpi_integer, recvsubarray, ierr)
call mpi_type_commit(recvsubarray, ierr)
call mpi_type_create_resized(recvsubarray, 1, sizeof(i), resizedrecvsubarray, ierr)
call mpi_type_commit(resizedrecvsubarray,ierr)
recvPtr=>matG
end if
counts(1:4) = (/1, 1, 1, 1/)
disps(1:4) = (/0, 5, 50, 55/)
call mpi_gatherv(sendPtr,1,sendsubarray,recvPtr,counts,disps,resizedrecvsubarray, &
0,mpi_comm_world,ierr)
if(myRank.eq.0) then
do i=1, nx_glb
write(1000,*) (matG(i,j),j=1, ny_glb)
end do
end if
call mpi_finalize(ierr)
end program main
、forrtl: severe(174): SIGSEGV, segmentation fault occurred
にこのコードの結果を実行します。
私は、初期化や収集中に宣言されていない配列の変数/位置を指し示そうとしているようです。私は多くの方法でデバッグしようとしましたが、無駄でした。
事前に感謝します。
ありがとうございました。それは私のところでは本当に愚かでした。しかし、あなたが言及した変更を実装すると、私はFortranの** mpi_type_create_subarray **の 'starts'パラメータについて少し混乱します。私が望むように動作していないことが判明したのは、 'sendsbarray'では2、' recvsubarray'では1であり、1と0であると宣言したからです。また、 'resize'の下限値も0であると考えられます。CとFortranの違いは、C言語では0からF90では1から始まるため、理解できませんでした。ありがとう。 – Vijay
Ok;あなたの質問にはまだ答えていないようです。私は最初の壊滅的なエラーをはるかに超えて見ていませんでした。もう少し見てみましょう... –
ありがとうジョン。私は本当にそれを感謝します。 – Vijay