我的并行程序是使用c ++和OpenMPI实现的。当我测试它时,我发现如果我使用更多cpus它会花费更多时间。怎么会发生这种情况?
我的代码结构如下:
BEGIN
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()
END
我对此感到困惑。
答案 0 :(得分:2)
扩展评论,而非回答:
@ 111111评论说,除非工作量足够大,否则并行化实际上会减慢计算速度,这是正确的。由于您只发布了代码大纲,我们无法明确地将其诊断为您问题的根源,但跳转到这不是一个不合理的结论。
通常,在任何情况下都不能指望串行程序的并行版本更快。并行化有成本(有时称为并行开销&#39;)。例如,在您的代码中,广播和分散操作会导致这种开销,您只能在并行代码中执行它们,如果它们耗费时间,它们可以抵消(或更糟)在多个CPU上更快计算的好处。
我会继续猜测你对并行编程相对较新,并建议你应该研究关于代码和问题的这个问题,即并行化的成本和收益。 。你绝对应该致力于开发一个良好的理解,一个由实验数据支持的理解,当你增加工作规模和增加处理器数量时,你的程序性能如何扩展。
修改强>
还有一个小问题:确保使用正确的例程来计划程序。我建议你使用mph_wtime()
。我见过天真的程序员使用对utime
之类的东西的调用,并最终将所有N个处理器使用的时间加在一起;您应该感兴趣的是从开始到结束(或2个兴趣点之间)的挂钟时间。
答案 1 :(得分:1)
如果没有关于环境和正在运行的实际代码的更多信息,很难知道,但请注意MPI::Gather()
和MPI::Bcast()
是阻止调用。该过程必须等待所有进程达到这一点。
如果一个CPU速度极慢 - 等待它到达Bcast()
,将减慢总时间。
答案 2 :(得分:1)
对于您的程序,并行运行的代码声明性能http://en.wikipedia.org/wiki/Amdahl's_law。许多其他参数会影响性能,例如您的计算机体系结构,例如,如果您使用共享内存系统,则内存很重要,你的代码如果文件很大就会降低性能,在这种情况下你必须使用派生数据类型进行通信,网络速度对于分布式系统来说很重要,....