Ich lerne über BCASTing Datentypen in Fortran und habe einen Code, der zwei Werte vom Terminal nimmt und sie bei jedem Prozess anzeigt. Für die Kombination value1/value2 vom Typ integer/integer und integer/real funktioniert das, für die Kombination integer/real * 8 jedoch nicht.abgeleitete Datentypen mit MPI
Der Code ist:
use mpi
implicit none
integer :: ierror, pid, ncpu, root = 0
integer :: counts, newtype, extent
integer, dimension(2) :: oldtypes, blockcounts, offsets
type value
integer :: value1 = 0
real*8 :: value2
end type
type (value) input
call MPI_INIT(ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, pid, ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, ncpu, ierror)
! setup of 1 MPI_INTEGER field: value1
offsets(1) = 0
oldtypes(1) = MPI_INTEGER
blockcounts(1) = 1
! setup of 1 MPI_REAL8 field: value2
call MPI_TYPE_EXTENT(MPI_INTEGER, extent, ierror) !determine offset of MPI_INTEGER
offsets(2) = blockcounts(1)*extent !offset is 1 MPI_INTEGER extents
oldtypes(2) = MPI_REAL8
blockcounts(2) = 1
! define struct type and commit
counts = 2 !for MPI_INTEGER + MPI_REAL8
call MPI_TYPE_STRUCT(counts, blockcounts, offsets, &
oldtypes, newtype, ierror)
call MPI_TYPE_COMMIT(newtype, ierror)
do while (input%value1 >= 0)
if (pid == root) then
read(*,*) input
write(*,*) 'input was: ', input
end if
call MPI_BCAST(input, 1, newtype, &
root, MPI_COMM_WORLD, ierror)
write(*,*), 'process ', pid, 'received: ', input
end do
call MPI_TYPE_FREE(newtype, ierror)
call MPI_FINALIZE(ierror)
Es kann überprüft werden, dass integer/integer und integer/real funktionieren, indem Sie die entsprechende Erklärung zu ändern und oldtype. Die Kombination integer/real * 8 schlägt z.B. Eingänge -1 2.0 Erzeugungs:
input was: -1 2.0000000000000000
process 0 received: -1 2.0000000000000000
process 1 received: -1 0.0000000000000000
process 2 received: -1 0.0000000000000000
process 3 received: -1 0.0000000000000000
This Faden mit einem ähnlichen Problem legen nahe, dass MPI_TYPE_EXTENT Verwendung, da es nicht korrekt ist eine zusätzliche Polsterung sein könnte, die nicht berücksichtigt wird. Leider konnte ich das Problem nicht beheben und hoffe, dass mich jemand hier aufklären kann.
thx im Voraus
+1 große Antwort und Beispiel. – casey
+1 danke für die Klärung. Ich habe schon mit MPI_GET_ADDRESS herumgespielt, aber es hat noch nicht funktioniert. Dein Beispiel hat wunderbar funktioniert! – nluigi