我是MPI的新程序员。我正在编写一个简单的程序,用矩阵乘以向量。我所做的是首先将矢量广播到所有节点,然后使用散射将矩阵的一堆行发送到每个节点。
我的问题是,数组中的行数不是可用节点数的倍数。因此,不同的节点最终具有不同的行数。目前我正在循环中使用点对点通信来执行此操作。但我更喜欢,如果我可以使用MPI_Scatter。但MPI_Scatter只向所有节点发送相同长度的数据。
无论如何,即使每个节点获得不同大小的数据块,我仍然可以使用分散来发送数据吗?
答案 0 :(得分:1)
MPI_Scatterv
就是针对这种情况而制作的。您既指定sendcounts的向量,也指定offset的向量。正确创建它们可能有点棘手,所以有一个例子:
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);