MPI矩阵按块输出

时间:2017-11-12 21:06:30

标签: c matrix parallel-processing mpi

我按块分割矩阵并使用Fox算法将其相乘。

如果将结果矩阵打印到不同进程中的块,而不将这些块发送回等级为0的进程,如何将结果矩阵打印到屏幕?

例如。
乘法后我得到了:

Block A:
83  64
112 76

Block B:
118 44
152 34

Block C:
54 68
67 56

Block D:
89  85
114 68

Entire matrix should look like:
83  64 118 44
112 76 152 34
54  68 89  85
67  56 114 68

到目前为止,我已做过:
发送包含一行的两个块并将其打印到屏幕。但是,是否可以打印整个结果矩阵而不发送多个块来处理0?

// Function for gathering the result matrix
// pCBlock - one block containing part of entire result matrix
// Size - matrix dimension
// BlockSize - block dimension
void ResultCollection(double* pCblock, int Size,
                  int BlockSize) {
double * pResultRow = new double[Size*BlockSize];
for (int i = 0; i<BlockSize; i++) {
    MPI_Gather(&pCblock[i*BlockSize], BlockSize, MPI_DOUBLE,
               &pResultRow[i*Size], BlockSize, MPI_DOUBLE, 0, RowComm);
}
//print two matrix rows from two blocks
delete[] pResultRow;
}    

这无济于事 (Ordering Output in MPI
因为对于矩阵输出,我需要打印的不是整个块A,而是B,而不是C,而不是D, 而是
来自A的一行(在流程0中),来自B的一行(来自流程1),
来自A的一行(在流程0中),来自B的一行(来自流程1),
来自C的一行(来自流程2),来自D的一行(来自流程3)
等等。

Example matrix and blocks

enter image description here

1 个答案:

答案 0 :(得分:0)

如何打印...
而不将这些块发送回等级为0的进程?

嗯,是时候意识到了,
除非排名 0 的过程具有某种透视性,否则它将永远无法打印任何结果,这些结果是在分散的,分布式的群体中远程计算的 - 过程

同样,它很容易测试,
如果您仍然不相信已经发布的内容,那么MPI分发的代码从未被承诺对任何异步远程打印字符流的主要不协调传送将如何集中订购特别订购有任何弱/强保证到一个常见的串行输出 - 系统stdout - 最后放到屏幕上。

即使您使用“可寻址的ANSI编码屏幕”进行大量播放,这样的设计工作也不会产生任何普遍适用的代码,并且在ANSI编码输出中注入“绝对”地址的技巧会无法实现和操作,以便在屏幕上正确地绘制结果。

否。最好不要尝试这些想法。

您真正的MPI基础架构顾问/管理员肯定会帮助您并向您展示适当的工具,以便智能地收集结果并相应地对其进行后处理。