首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个示例代码(f90、MPI、派生类型)会导致无效的读/写(val差制或dmalloc)?

为什么这个示例代码(f90、MPI、派生类型)会导致无效的读/写(val差制或dmalloc)?
EN

Stack Overflow用户
提问于 2015-09-01 15:39:16
回答 2查看 209关注 0票数 2

这是被定罪的代码(这与我问的另一个问题,here有关):

代码语言:javascript
复制
program foo

  use mpi

  implicit none

  type double_st
     sequence
     real(kind(0.d0)) :: x,y,z
     integer :: acc
  end type double_st

  integer, parameter :: n=8

  INTEGER :: MPI_CADNA_DST

  integer :: nproc, iprank
  INTEGER :: IERR, STAT(MPI_STATUS_SIZE)
  INTEGER :: MPI_CADNA_DST_TMP
  INTEGER ::&
       COUNT=4,&
       BLOCKLENGTHS(4)=(/1,1,1,1/),&
       TYPES(4)=(/MPI_DOUBLE_PRECISION,&
       MPI_DOUBLE_PRECISION,&
       MPI_DOUBLE_PRECISION,&
       MPI_INTEGER/)
  INTEGER(KIND=MPI_ADDRESS_KIND) :: DISPLS(4), LB, EXTENT
  TYPE(DOUBLE_ST) :: DST
  INTEGER :: I

  type(double_st), allocatable :: bufs(:), bufr(:)

  allocate(bufs(n), bufr(n))

  CALL MPI_INIT(IERR)
  CALL MPI_COMM_SIZE(MPI_COMM_WORLD, NPROC, IERR)
  CALL MPI_COMM_RANK(MPI_COMM_WORLD, IPRANK, IERR)

  CALL MPI_GET_ADDRESS(DST%X,   DISPLS(1))
  CALL MPI_GET_ADDRESS(DST%Y,   DISPLS(2))
  CALL MPI_GET_ADDRESS(DST%Z,   DISPLS(3))
  CALL MPI_GET_ADDRESS(DST%ACC, DISPLS(4))
  DO I=4,1,-1
     DISPLS(I)=DISPLS(I)-DISPLS(1)
  ENDDO
  CALL MPI_TYPE_CREATE_STRUCT(4,BLOCKLENGTHS,DISPLS,TYPES, MPI_CADNA_DST_TMP,IERR)
  CALL MPI_TYPE_COMMIT(MPI_CADNA_DST_TMP,IERR)

  CALL MPI_TYPE_GET_EXTENT(MPI_CADNA_DST_TMP, LB, EXTENT, IERR)
  CALL MPI_TYPE_CREATE_RESIZED(MPI_CADNA_DST_TMP, LB, EXTENT, MPI_CADNA_DST, IERR)
  CALL MPI_TYPE_COMMIT(MPI_CADNA_DST,IERR)

  bufs(:)%x=iprank
  bufs(:)%y=iprank
  bufs(:)%z=iprank
  bufs(:)%acc=iprank
  call mpi_send(bufs(1), n, mpi_cadna_dst, 1-iprank, 0, mpi_comm_world, ierr)
  call mpi_recv(bufr(1), n, mpi_cadna_dst, 1-iprank, 0, mpi_comm_world, stat, ierr)


  deallocate(bufs, bufr)

end program foo

使用intelMPI,Version4.0或5.0编译,在发送时,我会出现无效的阅读/写入错误。对于openMPI,这个最小的例子还不太清楚,但我在从中提取它的大代码中遇到了类似的问题。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-02 10:20:31

看来sequence的使用才是罪魁祸首。由于您的数据不是以相同的方式对齐的,因此强制使用sequence关键字进行线性填充会生成一些未对齐的访问,可能是在编写数组时。移除它就行了。

票数 1
EN

Stack Overflow用户

发布于 2015-09-02 11:46:17

我认为他使用了带有序列的派生类型定义(编写代码的人).SEQUENCE使派生类型的组件存储在类型定义中列出的相同序列中。如果指定了序列,那么组件定义中指定的所有派生类型都必须是序列types.You,应该告诉我们更多关于编译的信息,您也在Linux或Windows上吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32335712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档