Использование MPI_Type_vector для MPI_Scatter трехмерного массива Фортрана - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть массив 200x100x3, где 200x100 представляет 2D-карту, а третье измерение - это 3 точки данных для этого местоположения. Я хотел бы использовать MPI_Scatter для отправки смежных частей этого массива 200x100 при сохранении третьего измерения. Под этим я подразумеваю, что хотел бы, чтобы процесс 0 имел первый фрагмент матрицы в виде 3-х массивов длины. Таким образом, первый элемент в данных ядра 0 после разброса должен быть верхним левым углом исходного массива, включая все 3 элемента из третьего измерения.

Из исследований я обнаружил, что для этого мне нужно использовать MPI_Type_vector. Моя лучшая попытка сделать это показана ниже:

!Every core allocate a buffer to receive data into
real(kind=kind(0.0d0)), allocatable, dimension(:,:) :: myVectors
allocate(myVectors(200*100/numCores, 3))


!Set up the vector type
call MPI_Type_vector(1, 3, 200*100, mpi_double_precision, mytype, ierr)
call MPI_Scatter(allVectors, 200*100/numCores, mytype, myVectors, &
                 200*100/numCores, mytype, master, MPI_Comm_world, ierr)

Приведенный выше код компилируется и работает нормально, однако, когда я распечатываю первый вектор allVectors (этот вектор должен полностью перейти к ядру 0 и стать его первым вектором myVectors), я вижу, что первый вектор ядра 0 содержит первый элемент в своем первом элементе, однако второй элемент фактически становится вторым элементом первого вектора ядра 1, а третий элемент фактически становится третьим элементом первого вектора ядра 2:

master core sends out: 0.999, 0.993, 0.992 (core 0 should get this whole vector as it's first vector)
core 0 received: 0.999, 1.000, 1.000 (these 1.00s are garbage values)
core 1 received: 1.000, 0.993, 1.000 (again the 1.00s are garbage)
core 2 received: 1.000, 1.000, 0.992 (still garbage 1.00s)
core 3 received: 1.000, 1.000, 1.000 (still garbage 1.00s)

Я выбрал шаг в MPI_Type_vector, равный 200 * 100, так как предполагал, что, поскольку Фортран хранит основные столбцы массивов, элементы глубины будут представлять собой целую часть матрицы друг от друга. Мои вопросы: правильно ли я использую MPI_Type_vector или неправильно в том, как Fortran хранит многомерные массивы.

...