fftw3 mpi和现代fortran的变量输出:堆损坏?圆满错误?

时间:2015-07-10 01:11:00

标签: pointers fortran mpi fftw heap-corruption

我是现代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

0 个答案:

没有答案