I am learning Fortran's BCASTing data types and have code that takes two values from the terminal and displays them in each process. For a combination of value1 / value2 of type integer / integer and integer / real, this works, but for a combination of integer / real * 8 this fails.
Code:
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)
You can verify that the integer / integer and integer / real work fine by modifying the corresponding declaration and oldtype. The integer / real * 8 combination fails, for example. inputs -1 2.0:
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 thread with a similar problem assumes that the use of MPI_TYPE_EXTENT is incorrect, as an additional add-on may be added that is not taken into account. Unfortunately, I could not solve the problem and I hope that someone here can enlighten me.
thanks in advance