【问题标题】:2D FFTW with MPI is too slow带有 MPI 的 2D FFTW 太慢了
【发布时间】:2019-05-08 18:43:26
【问题描述】:

我想用 MPI 做 2D FFTW。我只是按照上一篇帖子How to do a fftw3 MPI "transposed" 2D transform if possible at all?的答案中显示的代码。

但是,性能真的很差。事实上,使用 2 个处理器的执行速度比使用 1 个处理器的要慢。 它有什么问题?

program trashingfftw
  use, intrinsic :: iso_c_binding
  use MPI

  implicit none
  include 'fftw3-mpi.f03'

  integer(C_INTPTR_T), parameter :: L = 256
  integer(C_INTPTR_T), parameter :: M = 256

  type(C_PTR) :: plan, ctgt, csrc

  complex(C_DOUBLE_COMPLEX), pointer :: src(:,:)
  real(8), pointer :: tgt(:,:)

  integer(C_INTPTR_T) :: alloc_local, local_M, &
                         & local_L,local_offset1,local_offset2

  integer :: ierr,id


  call mpi_init(ierr)

  call mpi_comm_rank(MPI_COMM_WORLD,id,ierr)

  call fftw_mpi_init()


  alloc_local = fftw_mpi_local_size_2d(M,L/2+1, MPI_COMM_WORLD, &
       local_M, local_offset1)

  csrc = fftw_alloc_complex(alloc_local)
  call c_f_pointer(csrc, src, [L/2,local_M])


  alloc_local = fftw_mpi_local_size_2d(2*(L/2+1),M, MPI_COMM_WORLD, &
       &                               local_L, local_offset2)

  ctgt = fftw_alloc_real(alloc_local)
  call c_f_pointer(ctgt, tgt, [M,local_L])

  plan =  fftw_mpi_plan_dft_c2r_2d(M,L,src,tgt, MPI_COMM_WORLD, & 
       ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_OUT))

  call fftw_mpi_execute_dft_c2r(plan, src, tgt)

  call mpi_finalize(ierr)


end program trashingfftw

【问题讨论】:

  • 对不起 --- 我加了。
  • 请注意,创建计划通常需要比 FFT 本身更长的时间,特别是如果您使用 FFTW_MEASURE 或更高版本。理想情况下,您应该只创建一次计划,然后使用同一计划运行多个 FFT。对于基准测试,您应该只测量 FFT 时间,而不是计划创建时间。
  • 谢谢!有效!至少 32 个内核的扩展性很好。
  • 太棒了 - 我会将评论转换为答案,以造福未来的读者。

标签: fortran mpi fft fftw


【解决方案1】:

请注意,创建计划通常需要比 FFT 本身更长的时间,尤其是在您使用 FFTW_MEASURE 或更高版本时。

理想情况下,您应该只创建一次计划,然后使用同一计划运行多个 FFT。

对于基准测试,您应该只测量 FFT 时间,而不是计划创建时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多