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实现有关吗?
我怀疑您的程序应该使用一些公共资源,因此当它们的数量增加时,就会出现延迟,以便释放资源以便其他进程可以使用它。
您会看到,您可能有 24 个核心,但这并不意味着您的所有系统都允许每个核心同时执行所有操作。正如评论中提到的,内存访问可能会导致延迟(由于流量),磁盘也是如此。
还要考虑互连网络,它也会受到许多访问的影响。总之,请注意这些硬件延迟足以压垮处理时间。
一般注意事项:记住程序的效率是如何定义的:
E = S/p,其中 S 是加速比,p 是节点/进程/线程的数量
现在考虑可扩展性。通常程序的可扩展性很弱,即您必须以相同的速率增加问题和p的大小。通过仅增加p的数量,同时保持问题的大小(n在您的情况下)恒定,同时保持效率恒定,会产生一个高度可扩展的程序。