我有一些代码,其中一个(通常是大)数组的内容被添加到另一个相同大小的数组的内容中:
for (long i = 0; i < len; i++)
data1[i] += data2[i];
看起来应该可以使用 OpenMP 轻松并行化:
#pragma omp parallel for
for (long i = 0; i < len; i++)
data1[i] += data2[i];
但是,即使我有 8 个核心 + 8 个超线程,加速率也是最小的(也许 10%)。我尝试对此进行一些微调:
#pragma omp parallel for schedule(dynamic, 1000)
...但没有效果。我看到所有核心和超线程都在同时工作,但只有 10% 或 15%。
其他功能,例如找到数组中的最小值(这样您只需读取内存,而不是写入内存),通过并行化,运行速度可以轻松提高 5 倍。
这让我产生了这样的假设:也许并行化并没有多大帮助,因为写入内存很慢并且不能由不同的核心同时完成。那有意义吗?我有相当旧的硬件:一台 HP Z600 工作站 (2010),配有两个 Xeon E5540 CPU,每个 4 核 + 4 个超线程,并具有 8 MB 缓存。内存为 1066 MHz DDR3。
我的问题:
你的假设大部分是正确的,你的计算通常是“内存限制”,也就是说,与从内存传输/到内存的数据量相比,计算量太少,瓶颈是CPU和CPU之间的传输速率。记忆。因此,使用更多核心并没有帮助。
在更新的 CPU 上,您可能会观察到更高的加速,因为近年来内存带宽的增长速度快于单核性能。