我正在对一个大型科学应用程序进行基准测试,发现在输入相同的情况下,有时它的运行速度会慢 10%。经过大量搜索,我发现只有当它在我的四核 CPU 的第 2 核上运行时(特别是运行在 2.4 GHz 的 Intel Q6600)上才会出现速度减慢的情况。该应用程序是单线程的,大部分时间都花在 CPU 密集型矩阵数学例程上。

现在我知道一个核心比其他核心慢,我可以通过将所有运行的处理器亲和力设置为同一核心来获得准确的基准测试结果。不过,我还是想知道为什么一个核心比较慢。

我尝试了几个简单的测试用例来确定 CPU 的慢速部分,但测试用例的运行时间相同,即使在慢速核心 #2 上也是如此。只有复杂的应用程序表现出速度减慢。以下是我尝试过的测试用例:

  • 浮点乘法和加法:

    accumulator = accumulator*1.000001 + 0.0001;
    
  • 三角函数:

    accumulator = sin(accumulator);
    accumulator = cos(accumulator);
    
  • 整数加法:

    accumulator = accumulator + 1;
    
  • 尝试使 L2 缓存未命中时进行内存复制:

    int stride = 4*1024*1024 + 37;  // L2 cache size + small prime number
    for(long iter=0; iter<iterations; ++iter) {
        for(int offset=0; offset<stride; ++offset) {
            for(i=offset; i<array_size; i += stride) {
                array1[i] = array2[i];
            }
        }
    }
    

问题: 为什么一个 CPU 核心会比其他核心慢,CPU 的哪一部分导致了这种速度减慢?

编辑: 更多测试表明一些 海森巴格 行为。当我显式设置处理器亲和力时,我的应用程序不会在核心 #2 上减慢速度。但是,如果它选择在没有显式设置处理器关联的情况下在 2 号核心上运行,则应用程序的运行速度会慢 10% 左右。这解释了为什么我的简单测试用例没有显示出相同的速度下降,因为它们都显式设置了处理器关联性。因此,看起来有些进程喜欢驻留在核心 #2 上,但如果设置了处理器亲和力,它就会停止运行。

底线: 如果您需要在多核计算机上对单线程程序进行准确的基准测试,请确保设置处理器关联性。

有帮助吗?

解决方案

您可能有选择连接到同一处理器(CPU 亲和性)的应用程序。

操作系统通常希望在同一处理器上运行,因为它们可以将所有数据缓存在同一 L1 缓存上。如果您碰巧在操作系统执行大量工作的同一个内核上运行进程,您可能会遇到 CPU 性能下降的影响。

听起来有些进程想要坚持使用同一个CPU。我怀疑是硬件问题

不一定是你的操作系统在做这项工作,其他一些后台守护进程也可能在做这件事。

其他提示

由于过热或节能功能,大多数现代 CPU 都会对每个 CPU 核心进行单独的节流。您可以尝试关闭省电或改善散热。或者你的cpu坏了。在我的 i7 上,我在“传感器”中报告的 8 个核心的核心温度相差大约 2-3 度。满载时仍然存在变化。

另一种可能性是进程在运行时从一个核心迁移到另一个核心。我建议将 CPU 亲和力设置为“慢速”核心,看看它是否同样快。

几年前,在多核时代到来之前,我给自己买了一台双路 Athlon MP 用于“网络开发”。突然间,我的 Plone/Zope/Python Web 服务器速度慢得像爬行一样。谷歌搜索发现 CPython 解释器具有全局解释器锁,但 Python 线程由操作系统线程支持。OS线程均匀分布在CPU之间,但一次只有一个CPU可以获取锁,因此所有其他CPU都可以获取锁。 进程必须等待.

将 Zope 的 CPU 亲和力设置为任何 CPU 即可解决该问题。

我在我的 Haswel 笔记本电脑上观察到类似的情况。系统很安静,没有 X 运行,只有终端。用不同的方式执行相同的代码 numactl --physcpubin 选项在除一个内核之外的所有内核上给出完全相同的结果。我将核心频率更改为 Turbo,更改为其他值,但没有任何帮助。所有核心都以预期的速度运行,除了一个总是比其他核心运行得慢。这种效果在重启后仍然存在。

我重新启动了计算机并在 BIOS 中关闭了超线程。当它重新上线时,一切又好了。然后我打开了超线程,到目前为止一切都很好。

太奇怪了。不知道那会是什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top