arrays - 将由所有进程传播的数组的不同部分放入单个最终数组中的更好方法,在 C 中使用 MPI
问题描述
我将此代码仅作为示例,以便您了解我在寻找什么:
double *f = malloc(sizeof(double) * nx * ny);
double *f2 = malloc(sizeof(double) * nx * ny);
for ( i = process * (nx/totalProcesses); i < (process + 1) * (nx/totalProcesses); i++ )
{
for ( j = 0; j < ny; j++ )
{
f2[i*ny + j] = j*i;
}
}
MPI_Allreduce( f2, f, nx*ny, MPI_DOUBLE, MPI_SUM, MPI_COMM);
是的,它有效,最后我在“f”中得到了正确的结果,这就是我想要的,但我想知道是否有更好或更直接的方法来实现同样的效果以提高效率。我用 allgather 进行了尝试,但无法获得正确的结果。
解决方案
但我想知道是否有更好或更直接的方法来实现相同的目的以提高效率。
不,在给定的上下文中,使用MPI 集体例程(理论上)总是比替代发送/接收更有效。尽管 MPI 标准没有强加它的良好实现,但是,它实现了 MPI 集体例程,如MPI_Allreduce
步骤log(p)
(具有p
进程数)。
但是请记住,MPI_Allreduce:
合并来自所有进程的值并将结果分发回所有进程。
因此,如果您确实需要所有流程中的结果,您可以使用MPI_Reduce:
将所有流程的值减少到单个值
推荐阅读
- django - 在生产 Django 部署中添加不可为空的字段
- javascript - 将 DIV 分配给 php 变量并在多个隐藏输入上循环
- javascript - 打开 mdDialog 时,它会向下滚动对话框而不是在顶部显示部分
- python - ValueError:无法为具有形状“(?,1)”的张量“TargetsData / Y:0”提供形状(10,)的值
- python - 如何在 Python 3.5 的 zip 存档中存储一个大的 numpy 数组?
- c# - ASPNET Core HttpPost [FromBody] 参数始终为空
- java - 计算 CountDownTimer 在 java 中启动后使用的时间?
- c# - MailKit:邮件客户端显示在移动时收到的消息并且不保留原始标志
- vba - 文件未保存到 VBA 中新建的文件夹中
- node.js - npm audit 卡在 ENOAUDIT 上