Изменить локально выделенную память MPI в программе - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть массив 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

1 Ответ

0 голосов
/ 26 ноября 2018

Нет, вы не можете легко изменить выделенный размер массива Fortran (MPI здесь не играет никакой роли).То, что вы можете сделать, это использовать другой массив для буфера приема, освободить массив и выделить его с новым размером или выделить его с достаточно большим размером в первую очередь.Различные варианты будут уместны в разных ситуациях.Не видя ваш код, я бы пошел на первый, но последний не может быть исключен.

Обратите внимание, что FFTW3 имеет встроенные параллельные (разложение 1D MPI, которое вы используете) преобразования, включая многомерные преобразования.

...