请考虑以下事项:
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
)。这种设计本身就存在缺陷吗?
答案 0 :(得分:0)
SAVE
应该没问题(最好与allocatable结合使用),如果你没有遇到其他问题,这需要Fortran通过copy-in copy-out传递数组,它必须通过引用来完成(不要尝试使用非阻塞MPI发送非连续数据)。
如果例程中有save
个变量,如果组合MPI / OpenMP,也不要尝试从更多线程运行它。