8

我正在对一个大型科学应用程序进行基准测试,发现在相同的输入下它有时会慢 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 的哪一部分导致了速度变慢?

编辑:更多测试显示了一些Heisenbug行为。当我明确设置处理器关联时,我的应用程序不会在核心 #2 上减慢速度。但是,如果它选择在没有明确设置处理器亲和性的情况下在核心 #2 上运行,则应用程序的运行速度会慢约 10%。这就解释了为什么我的简单测试用例没有表现出同样的减速,因为它们都明确地设置了处理器亲和性。因此,看起来有一些进程喜欢在核心#2 上运行,但如果设置了处理器亲和性,它就会不受干扰。

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

4

4 回答 4

8

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

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

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

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

于 2009-05-13T19:03:29.217 回答
2

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

于 2009-05-13T18:57:42.957 回答
1

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

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

将 Zope 的 CPU 亲和性设置为任何 CPU 都可以解决问题。

于 2009-05-15T17:52:30.047 回答
0

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

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

离奇。不知道那可能是什么。

于 2014-11-28T09:40:47.627 回答