我正在学习 Fortran 中的 BCASTing 数据类型,并且有一个代码可以从终端获取两个值并将它们显示在每个进程上。对于整数/整数和整数/实数类型的组合 value1/value2 ,这是有效的,但是对于整数/实数*8 的组合,它会失败。
代码是:
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)
可以通过更改相应的声明和旧类型来检查整数/整数和整数/实数是否正常工作。整数/实数*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 https://stackoverflow.com/questions/22709015/mpi-derived-type-send具有类似问题的线程表明使用 MPI_TYPE_EXTENT 是不正确的,因为可能存在未考虑的额外填充。不幸的是我无法解决这个问题,希望这里有人能启发我。
提前谢谢