【发布时间】:2023-03-28 08:35:01
【问题描述】:
我已经阅读了我发现的所有相关问题,但我仍然找不到解决问题的方法,我有一个带有双 for 循环的函数,是我的瓶颈程序。
代码是用 MPI 设计的:
- 有一个大矩阵,我分散在 p 个进程中。
- 现在每个进程都有一个子矩阵。
- 每个进程都在循环调用
update()。 - 当循环终止时,主进程收集结果。
现在我想通过利用 update() 的双 for 循环来使用 OpenMp 来增强我的 MPI 代码以加快执行速度。
void update (int pSqrt, int id, int subN, float** gridPtr, float ** gridNextPtr)
{
int i = 1, j = 1, end_i = subN - 1, end_j = subN - 1;
if ( id / pSqrt == 0) {
i = 2;
end_i = subN - 1;
} else if ( id / pSqrt == (pSqrt - 1) ) {
i = 1;
end_i = subN - 2;
}
#pragma omp parallel for
for ( ; i < end_i; ++i) {
if (id % pSqrt == 0) {
j = 2;
end_j = subN - 1;
} else if ((id + 1) % pSqrt == 0) {
j = 1;
end_j = subN - 2;
}
#pragma omp parallel for
for ( ; j < end_j; ++j) {
gridNextPtr[i][j] = gridPtr[i][j] +
parms.cx * (gridPtr[i+1][j] +
gridPtr[i-1][j] -
2.0 * gridPtr[i][j]) +
parms.cy * (gridPtr[i][j+1] +
gridPtr[i][j-1] -
2.0 * gridPtr[i][j]);
}
}
}
我在 2 台计算机上运行此程序,每台计算机都有 2 个 CPU。我正在使用 4 个进程。但是,无论有无 OpenMp,我都看不到任何加速。请问有什么想法吗?我正在使用-O1 优化标志进行编译。
【问题讨论】:
-
@HighPerformanceMark 不,不是。我在第一个 for 循环之前就有了它,但在我研究了相关问题之后,我决定把它移到那里。但是,我在执行时间上没有看到任何变化。
-
好的,然后@HighPerformanceMark 我可能已经解释了我读错的答案,所以我将
#pragma移到了for 循环上方。但是,无论有没有它,它仍然给我同样的时间。 -
我更新了我的问题@HighPerformanceMark。现在好点了吗?
-
我不确定你在说什么@HighPerformanceMark。丢弃与 MPI 相关的所有内容?但我想说的是,MPI+OpenMp 并不比 MPI 版本快(如我所料)?
-
对于少量内核,混合并行程序不比纯 MPI 快是很正常的。对于纯 MPI 已经存在问题的大量节点,您应该寻找不同的缩放比例。
标签: c parallel-processing mpi openmp distributed-computing