我正在学习Fortran中的BCAST数据类型,有一段代码从终端获取两个值并在每个进程上显示它们。对于类型为integer/integer和integer/real的组合value1/value2,这种方法可行,但对于integer/real*8的组合则失败。
代码如下:
可以通过更改相应的声明和oldtype来检查整数/整数和整数/实数是否正常工作。整数/实数*8的组合失败,例如输入-1 2.0会生成以下结果:
代码如下:
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
这个 类似问题的帖子表明使用 MPI_TYPE_EXTENT 不正确,因为可能存在未计算的额外填充。不幸的是,我还没有能够解决问题,希望这里有人能给我指点迷津。
提前感谢。