C++中OpenMPI的成本

use*_*157 5 c++ performance mpi openmpi

我有以下程序C++程序,它不使用通信,并且在所有内核上完成相同的相同工作,我知道这根本不使用并行处理:

unsigned n = 130000000;
std::vector<double>vec1(n,1.0);
std::vector<double>vec2(n,1.0);
double precision :: t1,t2,dt;
t1 = MPI_Wtime();
for (unsigned i = 0; i < n; i++) 
{
  // Do something so it's not a trivial loop
  vec1[i] = vec2[i]+i;
}
t2 = MPI_Wtime();
dt = t2-t1;
Run Code Online (Sandbox Code Playgroud)

我在一个带有两个Intel®Xeon®处理器E5-2690 v3的节点上运行这个程序,所以我有24个核心.这是一个专用节点,没有其他人在使用它.由于没有通信,并且每个处理器正在执行相同数量的(相同)工作,因此在多个处理器上运行它应该给出相同的时间.但是,我得到以下时间(所有核心的平均时间):

1核心:0.237

2芯:0.240

4核:0.241

8核:0.261

16核:0.454

什么可能导致时间的增加?特别适用于16个核心.我已经运行了callgrind,我在所有内核上获得了大致相同数量的数据/指令未命中(未命中的百分比相同).

我在一个带有两个Intel®Xeon®处理器E5-2628L v2的节点上重复了相同的测试(共有16个内核),我观察到执行时间的增加.这与MPI实现有关吗?

gsa*_*ras 2

怀疑您的程序应该使用一些公共资源,因此当它们的数量增加时,就会出现延迟,以便释放资源以便其他进程可以使用它。

您会看到,您可能有 24 个核心,但这并不意味着您的所有系统都允许每个核心同时执行所有操作。正如评论中提到的,内存访问可能会导致延迟(由于流量),磁盘也是如此。

还要考虑互连网络,它也会受到许多访问的影响。总之,请注意这些硬件延迟足以压垮处理时间。


一般注意事项:记住程序的效率是如何定义的:

E = S/p,其中 S 是加速比,p 是节点/进程/线程的数量

现在考虑可扩展性。通常程序的可扩展性很弱,即您必须以相同的速率增加问题和p的大小。通过仅增加p的数量,同时保持问题的大小(n在您的情况下)恒定,同时保持效率恒定,会产生一个高度可扩展的程序。

  • 可能就是这样。我不太了解 RAM 访问,但我知道所有内核共享相同的 RAM。我不知道对这个内存的访问是否可以并发完成。 (2认同)