Ich habe eine Aufgabe, in der ich mehrere Datentypen zusammen haben werde; Zeichen, mehrere ganze Zahlen und ein doppelter Genauigkeitswert, die eine Lösung für ein Problem darstellen.Ein Problem mit MPI_GATHER/MPI_GATHERV in F90 mit abgeleiteten Datentypen
Im Moment habe ich ein "Spielzeug" F90-Programm, das MPI mit Zufallszahlen und eine erfundene Zeichenfolge für jeden Prozessor verwendet. Ich möchte einen Datentyp haben, der das Zeichen und die Zufallszahl mit doppelter Genauigkeit enthält.
Ich werde MPI_REDUCE verwenden, um den Minimalwert für die doppelten Genauigkeitswerte zu erhalten. Ich werde den Datentyp für jeden Prozess über die Funktion MPI_GATHERV zum Stamm (Rang = 0) zusammenführen lassen.
Mein Ziel ist es, den Mindestwert aus den zufälligen Werten auf den Datentyp abzustimmen. Das wäre die endgültige Antwort. Ich habe bis jetzt alle möglichen Ideen ausprobiert, aber ohne Erfolg. Ich lande mit "forrtl: schwere SIGSEGV, Segmentierung Fehler aufgetreten".
Nun habe ich auch einige der anderen Beiträge angeschaut. Zum Beispiel kann ich die Anweisung "use mpif.h" für dieses spezielle System nicht verwenden.
Aber, endlich, hier ist der Code:
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
Vielen Dank für jede Hilfe. Mit freundlichen Grüßen Erin
Nur eine Gesundheitsprüfung, Ihr tatsächlicher Code wiederholt nicht den mittleren Block 3 Mal als die Version, die Sie hier gepostet haben, richtig? Ich denke nicht, dass das ein Problem verursachen würde, aber das ist definitiv seltsam. – Gilles