我的代码与 OpenMP 并行,是否因为并发内存访问而变得如此缓慢?

问题描述 投票:0回答:1

我有一些代码,其中一个(通常是大)数组的内容被添加到另一个相同大小的数组的内容中:

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。

我的问题:

  • 你认为这确实是并行化作用不大的原因吗?
  • 我可以做些什么来从并行化中获得更多好处吗?
c++ parallel-processing openmp cpu hardware
1个回答
0
投票

你的假设大部分是正确的,你的计算通常是“内存限制”,也就是说,与从内存传输/到内存的数据量相比,计算量太少,瓶颈是CPU和CPU之间的传输速率。记忆。因此,使用更多核心并没有帮助。

在更新的 CPU 上,您可能会观察到更高的加速,因为近年来内存带宽的增长速度快于单核性能。

© www.soinside.com 2019 - 2024. All rights reserved.