У меня есть массив M x N 'A', который должен быть распределен по процессорам 'np' с использованием MPI во втором измерении (т. Е. N - это рассеянное направление).Каждому процессору будет первоначально выделено M x N / np памяти с помощью fftw_mpi_local_size_2D (я использовал эту функцию из mpi, потому что SIMD эффективен в соответствии с руководством fftw3).
инициализация: alloc_local = fftw_mpi_local_size_2d (M, N, MPI_COM_local_n, local_n_offset) pointer1 = fftw_alloc_real (alloc_local) вызов c_f_pointer (указатель1, A [M, local_n]) *
В этот момент у каждого процессора есть плита A, которая равна M x local_n = (N / np)size.
При выполнении преобразования Фурье: A (x, y) -> A (x, ky), здесь y - вертикально вниз (не разделенная ось MPI) в массиве A. В пространстве Фурье Iдолжно хранить M + 2 x local_n количества элементов (для 1d реального массива длины M, M в пространстве Фурье имеет M + 2 элемента, если мы используем этот модуль из FFTW3 dfftw_execute_dft_r2c,).
Эти пространства ФурьеОперации, которые я мог бы выполнять в фиктивных матрицах в каждом процессоре независимо.
Есть одна операция, в которой мне нужно последовательно преобразовывать y Фурье и x Фурье.Чтобы распараллелить операции во всем фурье-пространстве, я хочу собрать мои у преобразованные по Фурье массивы, размер которых (M + 2) xlocal_n, больше массива M + 2 x N и рассеять их снова после транспонирования, чтобы направление y было разделеноодин.т.е. (N x M + 2) ---- scatter ---> (N x (M + 2) / np), но каждому процессору изначально было выделено только M x адресов local_n.
Если у меня естьM = N, тогда у меня все еще есть (N x local_n + (2 / np)).Я мог бы решить эту проблему, увеличив выделенную память для 1 процессора.
Я не хочу начинать с (N + 2, N) и (N + 2, local_n), потому что это увеличит потребность в памяти длямного массивов и вышеупомянутая гимнастика должна быть сделана только один раз за итерацию.
![A schematic explaining the steps above. Might be replacement for text](https://i.stack.imgur.com/AEZbD.jpg)