c++ - 是不是一个进程可以给自己发送数据?使用 MPICH2

标签 c++ mpi pipeline mpich

我有一个上三角矩阵和结果 vector b。 我的程序需要求解线性系统:

Ax = b

使用管道方法。 其中一个限制是进程的数量小于进程的数量 方程式(假设它可以是从 2 到 numberOfEquations-1)。

我现在没有代码,我正在考虑伪代码..

我的想法是其中一个过程将创建随机上三角矩阵 (A) vector b。 假设这是随机矩阵:

1  2  3   4   5   6
0  1  7   8   9   10
0  0  1   12  13  14
0  0  0   1   16  17
0  0  0   0   1   18
0  0  0   0   0   1

vector b 是 [10 5 8 9 10 5] 而且我的流程数量少于方程式的数量(可以说是 2 个流程)

所以我认为某些过程将从矩阵发送到每个过程线,并从 vector b 发送相关数字。

所以矩阵的最后一行和 vector b中的最后一个数字将被发送到 process[numProcs-1](这里我指的是最后一个进程(进程 1)) 然后他计算 X 并将结果发送到进程 0。

现在进程 0 需要计算矩阵的第 5 行,我卡在这里了.. 我有进程 1 计算的 X,但是进程如何发送给自己 矩阵的下一行和 vector b 中需要计算的相关数字?

这可能吗?我觉得发给“自己”不对

最佳答案

是的,MPI 允许进程向自身发送数据,但是在使用阻塞操作时必须格外小心可能出现的死锁。在这种情况下,通常将非阻塞发送与阻塞接收配对,反之亦然,或者使用像 MPI_Sendrecv 这样的调用。向自己发送消息通常以消息简单地从源缓冲区内存复制到目标缓冲区而告终,不涉及网络或其他重型机器。

不,与 self 交流不一定是坏事。最明显的好处是它使代码更加对称,因为它删除/减少了处理 self 交互所需的特殊逻辑。发送给自己/从自己接收也发生在大多数集体通信调用中。例如,MPI_Scatter 也将部分数据发送到根进程。为了防止某些发送给自己的情况不必要地复制数据并降低性能,MPI 允许大多数与通信相关的集合使用就地模式 (MPI_IN_PLACE)。

关于c++ - 是不是一个进程可以给自己发送数据?使用 MPICH2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784573/

相关文章:

java - 为什么使用MPJ Express的程序会出现异常?

linux - 在 Linux 中使用 mpirun 时出现错误 “ssh: Name or service not known”

c - MPI_Waitsome 失败

python - 包括 Scaling 和 PCA 作为 GridSearchCV 的参数

c++ - Google Mock 中的双重免费

c++ - 为什么 getline() 函数在这里不读取任何内容?

c++ - 怎么可能使用 qt 的私有(private) api,即(private/qquicktextnode_p.h)?

c++ - C/C++ Hex char* 到字节数组

bash - 将左侧故障通知管道的右侧?

oracle - 如何使用 plsql 返回多列