并行计算效率 - 内核数或 MPI 进程数?

Parallel computing efficiency - Number of cores or MPI processes?

我正在 2 + 2(超线程)内核机器上测试并行程序。并行化是通过 MPI 例程实现的。

在评估并行代码的效率时,我必须将速度除以内核数还是速度除以 MPI 进程数?

有人能帮帮我吗?

两者在某些情况下都有意义,因此这取决于您要衡量的内容。

例如,可以尝试 运行 将程序与 1、2、3 和 4 个 MPI 进程结合使用,并测量每个 运行 的加速比。然后可以将测量结果绘制成图表,其中 y 轴为加速,x 轴为 MPI 进程数,以说明算法的可扩展性(或不可扩展性......)(假设仅使用例如两个 MPI 进程与 运行 在只有两个内核的充分利用的计算机上运行算法是一样的。

效率也是如此

但这种推理只有在 MPI 进程数小于或等于您拥有的物理内核数时才有效。例如,如果您尝试在您的 4 核机器上使用 5 个 MPI 进程,您可能不会获得与在 5 核机器上相同的加速,因此这可能无法衡量您想要的东西——至少不是计算限制问题。

效率也是如此。

因此,如果您的 MPI 进程多于物理内核,那么只有在讨论物理内核数量方面的加速和效率(至少据我所知)时才有意义。例如,在上面的 4 核机器示例上继续 5 个 MPI 进程:假设与 4 个 MPI 进程相比,使用 5 个 MPI 进程(例如,因为 MPI 进程有时会阻塞 IO)(例如,因为 MPI 进程有时会阻塞 IO)(仅)在一定程度上提高了加速,那么相对于 MPI 进程数量的效率会下降,但相对于物理内核数量的效率会上升。因此,在那种情况下,使用 5 个 MPI 进程会优于 4 个,即使相对于 MPI 进程数量的效率会更低(与使用 4 个 MPI 进程相比)。

当然,和往常一样,如果能提供更多关于您正在尝试做的事情的信息,回答起来会更容易。

据我了解,您的问题出在公式中: 效率(p) = time_parallel(p) / p 。 "p" 这里是你执行它的 MPI 进程数。正如 cic 所提到的,程序员有责任拥有足够的内核来匹配 MPI 进程的数量。重复一遍,如果您只有 2 个内核并且 运行 有 5 个 MPI 进程,那么您的效率结果是错误的。同样,如果您有一台 8 核机器并且 运行 您的代码有 2 个 MPI 处理您的 "p" = 2

我认为正确的答案是 p 始终是 processor/cores 的数量,因为效率描述了代码的性能如何趋向于理想值。所以效率的一般公式是

E=your_performance/best_performance

最佳速度(理想情况)是processors/cores页数。