我将矩阵按 block 划分并使用 Fox 算法将其相乘。
当结果矩阵由不同进程中的 block 存储时,如何将结果矩阵打印到屏幕上,而不将这些 block 发送回等级为 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
到目前为止我做了:
发送包含一行的两个 block 并将其打印到屏幕。但是是否可以在不发送多个 block 到进程 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 )
因为对于矩阵输出,我需要打印的不是整个 block A
,B
,C
,D
,
而是
来自 A
的一行(在进程 0 中),来自 B
的一行(来自进程 1),
来自 A
的一行(在进程 0 中),来自 B
的一行(来自进程 1),
C
一行(来自进程 2),D
一行(来自进程 3)
等等
最佳答案
如何在不将这些 block 发送回等级为 0 的进程的情况下打印 ...
?
好吧,是时候意识到了,
除非等级为 0
的进程配备了某种千里眼,否则它永远无法漂亮地打印任何结果,这些结果是在一群分散的远程计算中, 分布式进程。
同样,也很容易测试,
如果您仍然不相信已经发布的内容,那么从未 promise 过 MPI 分布式代码对任何异步远程打印字符流的主要不协调交付如何集中获得特别订购有任何弱/强保证转换成一个通用的串行输出——系统 stdout
——并最终显示在屏幕上。
即使您经常使用“可寻址 ANSI 编码屏幕”,这种设计努力也不会产生任何通用工作代码,并且将“绝对”寻址注入(inject) ANSI 编码输出的技巧会执着地执行和操作以便在屏幕上正确绘制结果。
没有。最好不要尝试这两种想法。
您实际的 MPI 基础设施顾问/管理员一定会帮助您并向您展示适当的工具来智能收集结果并相应地进行后处理。
关于c - 按 block 输出的 MPI 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253975/