【发布时间】:2015-10-14 22:18:07
【问题描述】:
我有一个分布在 4 个节点上的矩阵,我希望每个节点都发送它的矩阵部分,并且一次一个地接收来自其他节点的矩阵的每个其他部分。块矩阵具有不同的维度。
我尝试编写一些代码,但没有按预期工作。
/* send my part of the matrix */
for (int i = 0; i < numtasks; i++){
if (i == taskid) continue;
MPI_Isend(matrix_block, size, MPI_INT, i, 0,
MPI_COMM_WORLD, &rNull);
}
/* receive everyone's part of the matrix */
for (int i = 0; i < numtasks; i++){
if (i == taskid) continue;
MPI_Irecv(brec, lenghts_recv[i], MPI_INT, i, 0,
MPI_COMM_WORLD, &request[i]);
}
for (int i = 0; i < numtasks - 1; i++){
int index;
MPI_Waitany(numtasks-1, request, &index, &status);
}
我以为每个节点都会首先发送它拥有的块,然后它会接收其他节点发送给他的块,但显然它是错误的。
此外,像 MPI_Alltoall 这样的解决方案在我的情况下不起作用,因为它应该是巨大的矩阵并且它不适合一个节点。
您能否建议我一种方法来执行所有操作,但一次只使用一个矩阵的一部分?
【问题讨论】: