我正在学习有关Fortran中的BCASTing数据类型,并有一个代码,它从终端获取两个值并在每个进程上显示它们。对于integer/integer和integer/real类型的组合value1/value2,这适用,但对于整数/实数* 8组合,则失败。派生的数据类型与MPI
的代码是:
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)
它可以检查通过改变相应的声明和OLDTYPE该整数/整数和整数/实做工精细。整数/实数* 8组合失败,例如,输入-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线程有类似的问题,建议使用MPI_TYPE_EXTENT是不正确的,因为可能有未考虑额外的填充。不幸的是,我还没有能够解决这个问题,希望这里有人能够启发我。
提前THX
+1很好的答案和例子。 – casey
+1谢谢澄清。我已经在玩MPI_GET_ADDRESS,但没有得到它的工作。你的例子非常漂亮! – nluigi