c - 按 block 输出的 MPI 矩阵

标签 c matrix parallel-processing mpi

我将矩阵按 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 ABCD,
而是
来自 A 的一行(在进程 0 中),来自 B 的一行(来自进程 1),
来自 A 的一行(在进程 0 中),来自 B 的一行(来自进程 1),
C 一行(来自进程 2),D 一行(来自进程 3)
等等

Example matrix and blocks

enter image description here

最佳答案

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

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

同样,也很容易测试,
如果您仍然不相信已经发布的内容,那么从未 promise 过 MPI 分布式代码对任何异步远程打印字符流的主要不协调交付如何集中获得特别订购有任何弱/强保证转换成一个通用的串行输出——系统 stdout——并最终显示在屏幕上。

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


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

您实际的 MPI 基础设施顾问/管理员一定会帮助您并向您展示适当的工具来智能收集结果并相应地进行后处理。

关于c - 按 block 输出的 MPI 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253975/

相关文章:

python - Numpy 矩阵乘法广播

go - Go中如何并行调用一个函数

c - 我如何使用指针来使用 malloc 存储多个字符串

c - avr-gcc 编译?有人能帮我吗

c++ - 添加额外的渲染调用时 GLFW 在关闭时挂起

r - 尝试运行并行操作时,terra 包返回错误

elasticsearch - Elasticsearch并行索引多个文件

c - 如何使用 win32 API 将标准输入重定向到 C 中的文件?

matrix - 行大小大于向量宽度时的 SIMD 转置

r - 将代表扩展到矩阵?