【问题标题】:MPI use more cpus cost more timeMPI 使用更多 cpu 花费更多时间
【发布时间】:2012-04-05 07:04:53
【问题描述】:

我的并行程序是使用 c++ 和 OpenMPI 实现的。当我测试它时,我发现如果我使用更多的 cpus 会花费更多的时间。怎么会这样?

我的代码结构如下:

开始

MPI::Init

if (rank == 0)
{ Read files } 

MPI::Bcast
MPI::Scatter

for (i=0; i<N;i++)
{  
   do something here
   MPI::Gather
   if(rank ==0)
   { save result}
}

MPI::Finallize()

结束

我对此感到困惑。

【问题讨论】:

  • 我对 MPI 了解不多,但我相当肯定,除非你的工作量很长,否则你会看到不好的结果。

标签: c++ time mpi performance-testing


【解决方案1】:

对于您的程序,并行运行的代码量声明了性能http://en.wikipedia.org/wiki/Amdahl's_law。许多其他参数会影响性能,例如您的计算机体系结构,例如,如果您使用共享内存系统,您的内存很重要,在您的代码中如果文件很大,它会降低性能,在这种情况下,您必须使用派生数据类型进行通信,网络速度对于分布式系统很重要,....

【讨论】:

    【解决方案2】:

    如果没有关于环境和正在运行的实际代码的更多信息,很难知道,但请注意MPI::Gather()MPI::Bcast() 是阻塞调用。该进程必须等待所有进程到达这一点。

    如果一个 CPU 非常慢 - 等待它到达Bcast(),将减慢总时间。

    【讨论】:

    • 你是对的。但是我可以做些什么来提高性能。
    • 这不一定是真的。引用 MPI 标准“集体通信调用可能会或可能不会具有同步所有调用进程的效果。” (第 5.1 章,第 2.2 节)
    【解决方案3】:

    扩展评论,不回答:

    @111111 的评论,除非工作量足够大,否则并行化实际上会减慢计算速度,这是正确的。由于您只发布了代码大纲,我们无法明确诊断出这是您问题的根源,但这并不是一个不合理的结论。

    通常,您不能期望串行程序的并行版本在所有情况下都更快。并行化是有代价的(有时称为“并行开销”)。例如,在您的代码中,广播和分散操作会造成这种开销,您只能在并行代码中执行它们,如果它们很耗时,它们可能会抵消(或更糟)在多个 CPU 上进行更快计算的好处。

    我将继续猜测您对并行编程比较陌生,并建议您应该针对您的代码和问题研究这个问题,即并行化的成本和收益。您绝对应该致力于深入了解(以实验数据为后盾),了解当您增加作业规模和增加处理器数量时,您的程序的性能如何扩展。

    编辑

    还有一个小问题:确保您使用正确的例程来为您的程序计时。我建议你使用mph_wtime()。我见过天真的程序员使用诸如utime之类的调用并最终将所有N个处理器使用的时间加在一起;您应该只关心从开始到结束(或两个兴趣点之间)的挂钟时间。

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2022-09-30
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多