Fortran / MPI非阻塞发送非持久数据

时间:2012-12-11 15:07:03

标签: c fortran mpi

请考虑以下事项:

subroutine send_to_friend(a,b,c,request)
  implicit none
  include 'mpif.h'  !use mpi if you've built the mpif90 bindings...

  real a,b,c
  real buff(3)
  integer tag,dest,ierr,request

  tag = 50
  dest = 0

  buff(1) = a
  buff(2) = b
  buff(3) = c
  call MPI_Isend(buff,3,MPI_REAL,dest,tag,MPI_COMM_WORLD,request,ierr)
return
end subroutine send_to_friend

这可能不会起作用,因为buff将放在堆栈上(无论如何都会使用大多数现代编译器),但只要子例程退出,它就会被清除干净。分配数组也没有帮助,因为根据here(第10节),当你退出程序时,分配的数组会自动解除分配 - 在C中,这将是内存泄漏(也是坏的)。做这样的事情的正确方法是什么?我应该使用save属性声明数组吗? (C中的static)。这种设计本身就存在缺陷吗?

1 个答案:

答案 0 :(得分:0)

SAVE应该没问题(最好与allocatable结合使用),如果你没有遇到其他问题,这需要Fortran通过copy-in copy-out传递数组,它必须通过引用来完成(不要尝试使用非阻塞MPI发送非连续数据)。

如果例程中有save个变量,如果组合MPI / OpenMP,也不要尝试从更多线程运行它。