2012-03-20 74 views
1

我的并行程序是通过使用C++和OpenMPI实现的。当我测试它时,我发现如果我使用更多的cpus,它会花费更多的时间。这怎么会发生?MPI使用更多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

我很困惑这个问题。

+1

我对MPI了解不多,但我相当确定除非你的工作负荷很长,那么你会看到不好的结果。 – 111111 2012-03-20 19:00:32

回答

1

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

1

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

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

+0

你说得对。但有什么我可以做的,以提高性能。 – user1253764 2012-03-20 19:16:39

+0

这不一定是正确的。引用MPI标准“集体通信呼叫可能会或可能不会影响所有呼叫过程的同步。” (第5.1章,第2.2节) – Zulan 2012-03-21 10:21:42

2

扩展评论,不回答:

@ 111111的评论,除非工作量是足够大的,然后并行化实际上可以慢的计算是正确的。既然你只发布你的代码大纲,我们不能明确诊断这是你问题的根源,但这不是一个无理的结论。

通常,在任何情况下都不能期望串行程序的并行版本更快。并行化成本(有时称为“并行开销”)。例如,在你的代码中,广播和分散操作会导致这种开销,你只能用并行代码来做它们,如果它们很耗时,它们可以抵消(或者更坏)在多个CPU上更快计算的好处。

我打算继续前进,猜测你对并行编程相对陌生,并建议这个并行化的成本和收益问题是你应该研究代码和问题的一个问题。您绝对应该致力于开发一种良好的理解,通过实验得出的数据作为备份,说明在增加作业大小和增加处理器数量时,程序性能如何扩展。

编辑

一名次要的一点:请确保您使用的定时程序正确的程序。我建议你使用mph_wtime()。我已经看到很多天真的程序员使用诸如utime之类的调用,并最终将所有N个处理器使用的时间加起来;所有你应该感兴趣的是从开始到结束(或者两点之间)的挂钟时间。