2D FFTW с MPI слишком медленный - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу сделать 2D FFTW с MPI.Я только что следовал коду, показанному в ответе предыдущего поста Как сделать двумерное преобразование fftw3 MPI, если возможно, вообще? .

Однако производительность действительно плохая.Фактически, выполнение с 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

1 Ответ

0 голосов
/ 07 декабря 2018

Обратите внимание, что создание плана обычно занимает гораздо больше времени, чем само БПФ, особенно если вы используете FFTW_MEASURE или выше.

В идеале вам следует просто создать план один раз, а затем запустить несколько БПФ, используя этот же план.

Для бенчмаркинга вы должны просто измерить время БПФ, а не время создания плана

...