使用MPI_Type_vector为MPI_Scatter创建一个3维Fortran数组

时间:2018-04-29 17:00:24

标签: arrays fortran mpi

我有一个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,因为我假设由于Fortran存储数组列主要,因此深度元素将是矩阵的整个切片彼此远离。我的问题是我是否使用MPI_Type_vector错误,或者我是否错误地了解Fortran如何存储多维数组。

0 个答案:

没有答案