【发布时间】:2015-01-16 04:00:50
【问题描述】:
亲爱的,我试图通过谷歌搜索找到答案,但我无法找到答案。
我在 MPI Fotran 应用程序中使用 fftw,我需要逐个计算张量组件的 3D 数组的前向和后向变换,并且在傅立叶空间中计算一些复杂的张量。 为了使 ffftw 使用的数组有用并且不花费大量时间将数据从一个数组移动到另一个数组,我想到的选择是声明一个 5d 维数组:即
use, intrinsic :: iso_c_binding
call MPI_INIT( mpi_err )
call MPI_COMM_RANK( MPI_COMM_WORLD, mpi_rank, mpi_err )
call MPI_COMM_SIZE( MPI_COMM_WORLD, mpi_size, mpi_err )
integer(C_INTPTR_T), parameter :: FFTDIM=3 !fft dimension
integer(C_INTPTR_T) :: fft_L !x direction
integer(C_INTPTR_T) :: fft_M !y direction
integer(C_INTPTR_T) :: fft_N !z direction
complex(C_DOUBLE_COMPLEX), pointer :: fft_in(:,:,:,:,:), fft_out(:,:,:,:,:)
type(C_PTR) :: fft_plan_fwd, fft_plan_bkw, fft_datapointer
integer(C_INTPTR_T) :: fft_alloc_local, fft_local_n0, fft_local_0_start
include 'mpif.h'
include 'fftw3-mpi.f03'
call fftw_mpi_init
fft_L=problem_dim(1)
fft_M=problem_dim(2)
fft_N=problem_dim(3)
! CALCULATE LOCAL SIZE OF FFT VARIABLE FOR EACH COMPOENNT
fft_alloc_local = fftw_mpi_local_size_3d(fft_N,fft_M,fft_L, MPI_COMM_WORLD, &
fft_local_n0, fft_local_0_start)
! allocate data pointer
fft_datapointer = fftw_alloc_complex(9*int(fft_alloc_local,C_SIZE_T))
! link pointers to the same array
call c_f_pointer(fft_datapointer, fft_in, [ FFTDIM, FFTDIM, fft_L, fft_M, fft_local_n0])
call c_f_pointer(fft_datapointer, fft_out, [ FFTDIM, FFTDIM, fft_L, fft_M, fft_local_n0])
! create plans
fft_plan_fwd = fftw_MPI_plan_dft_3d(fft_N, fft_M, fft_L, & !dimension
fft_in(1,1,:,:,:), fft_out(1,1,:,:,:), & !inpu, output
MPI_COMM_WORLD, FFTW_FORWARD, FFTW_MEASURE)
fft_plan_bkw = fftw_MPI_plan_dft_3d(fft_N, fft_M, fft_L, & !dimension
fft_in(1,1,:,:,:), fft_out(1,1,:,:,:), & !inpu, output
MPI_COMM_WORLD, FFTW_BACKWARD, FFTW_MEASURE)
现在如果使用这种代码和平和处理器的数量是 2 (2,4,8...) 的倍数,一切正常,但如果我使用例如 6,应用程序将给出错误。我该如何解决这个问题? 你有什么更好的策略,而不是分配一个 5d 数组而不移动到很多数据??
提前致谢
安德烈亚
【问题讨论】:
-
对不起,我是新人,也许我做错了什么(我刚刚证明了 4 个空格)并且代码没有“漂亮”出来。
-
@AndreaRovinelli 没关系,我根本没有得到第一条评论。顺便说一句,如果您使用 Fortran 2003,我推荐
use mpi而不是include 'mpif.h'。 -
Stackoverflow 使用 Google prettify 进行代码语法高亮。它不支持 Fortran。就是这样。
-
@AndreaRovinelli 你应该指定你得到的错误以及你的代码在这种情况下的样子。
标签: multidimensional-array fortran mpi fftw