块输出的 MPI 矩阵

Posted

技术标签:

【中文标题】块输出的 MPI 矩阵【英文标题】:MPI matrix output by blocks 【发布时间】:2018-04-25 12:34:40 【问题描述】:

我已经将矩阵按块划分并使用 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

【问题讨论】:

Ordering Output in MPI 的可能重复项。这个问题听起来可能有点不同,但答案很好地解释了为什么您的问题的答案基本上只是 【参考方案1】:

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

嗯,是时候意识到了, 除非等级为 0 的进程配备了某种千里眼,否则它将永远无法漂亮地打印任何结果,这些结果是在一群分散的分布式进程中远程计算的。

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

即使您经常使用“可寻址 ANSI 编码的屏幕”,这种设计努力也不会产生任何通用的工作代码,并且将“绝对”寻址注入 ANSI 编码输出的技巧会执行和操作都非常糟糕,以便在屏幕上正确绘制结果。


没有。最好不要尝试这些想法。

您的实际 MPI 基础架构顾问/管理员肯定会帮助您,并向您展示用于智能收集结果并相应地对它们进行后处理的适当工具。

【讨论】:

以上是关于块输出的 MPI 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 MPI 散布不同大小的矩阵块

带有 MPI_Type_struct 的 MPI_Scatterv 子矩阵

利用MPI实现Cannon算法并行矩阵乘法

利用MPI实现Cannon算法并行矩阵乘法

利用MPI实现Cannon算法并行矩阵乘法

使用 MPI_Send 和 MPI_Recv 未正确接收矩阵