Tag: smp

什么限制了这个简单的OpenMP程序的扩展?

我试图了解48核系统上的并行化限制(4xAMD Opteron 6348,2.8 Ghz,每个CPU 12个核心)。 我写了这个微小的OpenMP代码来测试加速,我认为这是最好的情况(任务是令人尴尬的并行): // Compile with: gcc scaling.c -std=c99 -fopenmp -O3 #include #include int main(){ const uint64_t umin=1; const uint64_t umax=10000000000LL; double sum=0.; #pragma omp parallel for reduction(+:sum) for(uint64_t u=umin; u<umax; u++) sum+=1./u/u; printf("%e\n", sum); } 我惊讶地发现缩放是高度非线性的。 使用48个线程运行代码需要大约2.9s,使用36个线程运行3.1s,使用24个线程运行3.7s,使用12个线程运行4.9s,使用1个线程运行代码需要57s。 不幸的是,我不得不说计算机上运行一个进程使用100%的一个核心,因此可能会影响它。 这不是我的过程,所以我无法结束它来测试差异,但不知何故,我怀疑这是在19到20倍的加速和理想的48倍加速之间的区别。 为了确保它不是OpenMP问题,我同时运行了两个程序副本,每个程序有24个线程(一个用umin = 1,umax = 5000000000,另一个用umin = 5000000000,umax = 10000000000)。 在这种情况下,程序的两个副本在2.9s之后完成,因此它与使用单个程序实例运行48个线程完全相同。 用这个简单的程序阻止线性缩放的是什么?