2017-04-26 24 views
0

我是MPI的新程序员。我正在写一个简单的程序来将矩阵乘以一个向量。我所做的是首先向所有节点广播矢量,然后使用散射将一串行矩阵发送到每个节点。分散可变长度数据

我的问题是,阵列中的行数不是可用节点数的倍数。所以不同的节点最终具有不同的行数。此刻,我正在使用循环中的点对点通信来执行此操作。但我更喜欢是否可以使用MPI_Scatter。但MPI_Scatter只向所有节点发送相同长度的数据。

即使当每个节点获得不同大小的数据块时,我是否仍然可以使用scatter来发送数据?

回答

1

MPI_Scatterv就是针对这种情况。您既指定了sendcounts矢量,又指定了偏移矢量。这可能有点棘手,所以有一个例子:

int remainder = rows % comm_size; 
int local_rows = (rows/comm_size) 
if (comm_rank < remainder) { 
    local_rows++; 
} 
int* sendcounts = NULL; 
int* displacements = NULL; 
double* data = NULL; 
if (comm_rank = root) { 
    data = ...; 
    sendcounts = malloc(sizeof(int) * comm_size); 
    displacements = malloc(sizeof(int) * comm_size); 
    int sum = 0; 
    for (int i = 0; i < comm_size; i++) { 
     sendcounts[i] = (rows/comm_size) * columns; 
     if (remainder > 0) { 
      sendcounts[i] += columns; 
      remainder--; 
     } 
     displacements[i] = sum; 
     sum += sendcounts[i]; 
    } 
} 
double* local_data = malloc(sizeof(*local_data) * local_rows * columns); 
MPI_Scatterv(data, sendcounts, displacements, MPI_DOUBLE, 
      local_data, local_rows * columns, MPI_DOUBLE, root, MPI_COMM_WORLD); 
+0

谢谢。正是我在找什么! – PPGoodMan