私はいくつかのデータ型を一緒に扱う作業をしています。文字、いくつかの整数、および倍精度値が含まれます。これらは、問題の解決方法を表します。派生データ型のF90でMPI_GATHER/MPI_GATHERVに問題がある
現時点では、私は "おもしろい" F90プログラムを持っています。これは、プロセッサごとに乱数と人為的な文字列を持つMPIを使用しています。文字と倍精度の乱数を一緒に持つデータ型が必要です。
MPI_REDUCEを使用して、倍精度値の最小値を取得します。 MPI_GATHERV関数を介してルート(ランク= 0)にまとめられた各プロセスのデータ型を取得します。
私の目標は、乱数値の最小値とデータ型を一致させることです。それは最終的な答えになります。私はこの時点まで、あらゆる種類のアイデアを試してみましたが、無駄です。私は "forrtl:severe SIGSEGV、セグメンテーションフォールトが発生しました"と終わります。
他の投稿もいくつか見てきました。たとえば、私はこの特定のシステムで "mpif.hを使用"ステートメントを使用することはできません。
しかし、最後に、ここでのコードは次のとおりです。
program fredtype
implicit none
include '/opt/apps/intel15/mvapich2/2.1/include/mpif.h'
integer rank,size,ierror,tag,status(MPI_STATUS_SIZE),i,np,irank
integer blocklen(2),type(2),num,rcount(4)
double precision :: x,aout
character(len=4) :: y
type, BIND(C) :: mytype
double precision :: x,aout,test
character :: y
end type mytype
type(mytype) :: foo,foobag(4)
integer(KIND=MPI_ADDRESS_KIND) :: disp(2),base
call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierror)
aout = 99999999999.99
call random_seed()
call random_number(x)
if(rank.eq.0)y="dogs"
if(rank.eq.1)y="cats"
if(rank.eq.2)y="tree"
if(rank.eq.3)y="woof"
print *,rank,x,y
call MPI_GET_ADDRESS(foo%x,disp(1),ierror)
call MPI_GET_ADDRESS(foo%y,disp(2),ierror)
base = disp(1)
call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierror)
aout = 99999999999.99
call random_seed()
call random_number(x)
if(rank.eq.0)y="dogs"
if(rank.eq.1)y="cats"
if(rank.eq.2)y="tree"
if(rank.eq.3)y="woof"
print *,rank,x,y
call MPI_GET_ADDRESS(foo%x,disp(1),ierror)
call MPI_GET_ADDRESS(foo%y,disp(2),ierror)
base = disp(1)
call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierror)
aout = 99999999999.99
call random_seed()
call random_number(x)
if(rank.eq.0)y="dogs"
if(rank.eq.1)y="cats"
if(rank.eq.2)y="tree"
if(rank.eq.3)y="woof"
print *,rank,x,y
call MPI_GET_ADDRESS(foo%x,disp(1),ierror)
call MPI_GET_ADDRESS(foo%y,disp(2),ierror)
base = disp(1)
disp(2) = disp(2) - base
blocklen(1) = 1
blocklen(2) = 1
type(1) = MPI_DOUBLE_PRECISION
type(2) = MPI_CHARACTER
call MPI_TYPE_CREATE_STRUCT(2,blocklen,disp,type,foo,ierror)
call MPI_TYPE_COMMIT(foo,ierror)
call MPI_REDUCE(x,aout,1,MPI_DOUBLE_PRECISION,MPI_MIN,0,MPI_COMM_WORLD,i\
error)
call MPI_GATHER(num,1,MPI_INT,rcount,1,MPI_INT,0,MPI_COMM_WORLD)
call MPI_GATHERV(foo,num,type,foobag,rcount,disp,type,0,MPI_COMM_WORLD)
if(rank.eq.0)then
print *,'fin ',aout
end if
end program fredtype
は、任意の助けてくれてありがとう。 よろしくお願い致します。 Erin
ちょうどサニティチェックでは、あなたの実際のコードはあなたがここに投稿したバージョンのミドルブロックを3回繰り返さないのですか?私はそれが問題を引き起こすとは思わないが、それは間違いなく間違っている。 – Gilles