我是现代Fortran的新手,我正在尝试使用FFTW3和mpi编写一个冗长的程序,并使用转置输出。在调试我的(爆炸)程序的过程中,我注意到变换的输出从程序执行到下一个程序略有不同。我写了一个小测试程序,在我的平台上再现了变化,如下所示。对于64x64或128x128阵列,“问题”不会出现,但对于512x512阵列则不会出现。变化似乎在最后几位,并不是每次都发生。 (我必须反复运行该程序才能看到它。)这是否表明堆损坏?我找不到valgrind的任何东西。我搜索了stackoverflow和谷歌搜索,但无法弄清楚出了什么问题。我是否错误地使用指针?这只是错误吗?
我使用默认的双精度从源编译fftw3。
我正在使用mpifort -o fickledigits fickledigits.F90 -L/usr/local/lib/openmpi -lfftw3_mpi -lfftw3 -lm
program fickledigits
use, intrinsic :: iso_c_binding
use mpi
implicit none
include 'fftw3-mpi.f03'
!--------------------------------------------------------------------
integer(kind=4) :: np,id,ierr
integer(kind=4) :: i,j,it
integer(C_INTPTR_T), parameter :: L=512,M=L,LL=L/2+1
integer(C_INTPTR_T) :: alloc_local,local_LL,local_M
integer(C_INTPTR_T) :: local_kj_offset,local_i_offset
real(C_DOUBLE), pointer :: in(:,:)
complex(C_DOUBLE_COMPLEX), pointer :: out(:,:)
type(C_PTR) :: data,plan_r2c,plan_c2r
complex(C_DOUBLE_COMPLEX), target, allocatable :: qq(:,:)
!--------------------------------------------------------------------
call MPI_Init ( ierr )
call MPI_Comm_size ( MPI_COMM_WORLD, np, ierr )
call MPI_Comm_rank ( MPI_COMM_WORLD, id, ierr )
call fftw_mpi_init()
alloc_local = fftw_mpi_local_size_2d_transposed(LL,M,MPI_COMM_WORLD,&
local_LL,local_kj_offset,local_M,local_i_offset)
data = fftw_alloc_complex(alloc_local)
call c_f_pointer(data,out,[M,local_LL])
call c_f_pointer(data,in,[2*LL,local_M])
plan_r2c = fftw_mpi_plan_dft_r2c_2d(L,M,in,out,MPI_COMM_WORLD,&
ior(FFTW_MEASURE,FFTW_MPI_TRANSPOSED_OUT))
plan_c2r = fftw_mpi_plan_dft_c2r_2d(L,M,out,in,MPI_COMM_WORLD,&
ior(FFTW_MEASURE,FFTW_MPI_TRANSPOSED_IN))
allocate(qq(M,local_LL))
do i=1,local_LL
do j=1,M
qq(j,i)=dcmplx(j,i)
enddo
enddo
out=>qq
call fftw_mpi_execute_dft_c2r(plan_c2r,out,in)
print*, 'in(10,10)=', in(10,10)
call fftw_destroy_plan(plan_r2c)
call fftw_destroy_plan(plan_c2r)
call fftw_free(data)
deallocate(qq)
call MPI_FINALIZE(ierr)
end program