用于c_f_pointer调用的fortran指针或可分配数组之间的区别

时间:2017-05-31 21:32:08

标签: arrays pointers fortran mpi

我目前正在使用mpi共享内存通信器。在我看过的例子中,他们使用C_F_POINTER(cptr,fptr,shape)调用分配共享内存并将其与指针相关联。但我最近注意到,如果不使用fortran指针而是使用可分配数组,那么一切正常。

下面的一些示例代码,我已经替换为将数组A(:,:)声明为可分配而不是指针。

唯一的区别似乎是现在我可以使用分配的(A)'调用

这有什么理由不起作用,还是我应该使用指针的原因?或者我应该注意的任何其他差异?我对Fortran指针没有多少经验我希望这段代码可以移植。

program mpishm
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER
use mpi

implicit none

integer, parameter :: dp = KIND(1.0d0)
integer, parameter :: N =  16000

integer :: rank,isize,ierr
integer :: shmcomm,shmrank,shm_size

integer :: win !window
integer(KIND=MPI_ADDRESS_KIND) :: winsize
integer :: disp_unit
type(C_PTR) :: baseptr
!real(dp), POINTER :: A(:,:)
real(dp), allocatable :: A(:,:)
integer :: arrayshape(2)

arrayshape=(/ N,N /)

call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,rank,ierr)
call mpi_comm_size(mpi_comm_world,isize,ierr)

call mpi_comm_split_type(mpi_comm_world,MPI_COMM_TYPE_SHARED,0,MPI_INFO_NULL,shmcomm,ierr)
call mpi_comm_rank(shmcomm,shmrank,ierr)
call mpi_comm_size(shmcomm,shm_size,ierr)

call mpi_Barrier(mpi_comm_world,ierr)

if(shmrank==0)then !allocate all memory on root
 winsize=8_MPI_ADDRESS_KIND*N*N
else
 winsize=0_MPI_ADDRESS_KIND
end if
call mpi_win_allocate_shared(winsize,1,MPI_INFO_NULL,shmcomm,baseptr,win,ierr)

if(shmrank/=0)then
  call MPI_Win_shared_query(win,0,winsize,disp_unit,baseptr,ierr)
end if

!associate Fortran pointer with shared memory

call C_F_POINTER(baseptr, A, arrayshape)

write(rank+6,*)'allocated A?',allocated(A),size(A,1),size(A,2)
write(rank+6,*)'allocated A?',size(A,1),size(A,2)


call mpi_comm_free(shmcomm,ierr)
call mpi_finalize(ierr)

end program mpishm

0 个答案:

没有答案