在MPI中共享数组的一部分

问题描述 投票:0回答:1

我在思考一个问题,需要共享一个数组,具体如下。

假设 int array[10] 并且有 3 processes 这样一来。

process 0 gets array[0:3] 3 is included.
process 1 gets array[3:6] 6 is included.
process 2 gets array[6:9] 9 is included.

然而我不知道如何在这样的进程之间分割这个数组。更具体地说,这个数组是为 Sparse Matrix in CSR format,而数组代表行。

如何在MPI CC++中解决这个问题。

c++ mpi sparse-matrix scatter
1个回答
3
投票

一个不符合标准的实现,使用 MPI_Scatterv:

int arr[10];
const int counts[] = {4, 4, 4};
const int displs[] = {0, 3, 6};

int recv_buff[4];
MPI_Scatterv(arr, counts, displs, MPI_INT, recv_buff, 
    4, MPI_INT, 0, MPI_COMM_WORLD);

displs 只是简单的偏移量,具体如下。

Original array arr[10]:
[ 0 1 2 3 4 5 6 7 8 9 ]
  ^ displs[0]
        ^ displs[1]
              ^ displs[2]

这不能保证有效,因为子数组 重叠:

数目、类型和位移的规格不应造成任何位置上的影响。root 要读一次以上。

由于 Gilles Gouaillardet 在评论中指出,为了避免重复,你可以调用 MPI_Scatterv 两次。

int arr[10];
const int counts1[] = {4, 0, 4};
const int counts2[] = {0, 4, 0};
const int displs[]  = {0, 3, 6};

int recv_buff[4];
MPI_Scatterv(arr, counts1, displs, MPI_INT, recv_buff, 
    counts1[rank], MPI_INT, 0, MPI_COMM_WORLD);
MPI_Scatterv(arr, counts2, displs, MPI_INT, recv_buff, 
    counts2[rank], MPI_INT, 0, MPI_COMM_WORLD);

或者,你可以用普通的 MPI_SendsMPI_Gets.

© www.soinside.com 2019 - 2024. All rights reserved.