我正在对一个大型科学应用程序进行基准测试,发现在相同输入的情况下它有时会慢10%.经过大量搜索,我发现只有在我的四核CPU核心#2(特别是运行在2.4 GHz的Intel Q6600)上运行时才会出现减速.该应用程序是单线程的,大部分时间都用在CPU密集型矩阵数学例程中.
现在我知道一个核心比其他核心慢,我可以通过将处理器亲和力设置为所有运行的相同核心来获得准确的基准测试结果.但是,我仍然想知道为什么一个核心更慢.
我尝试了几个简单的测试用例来确定CPU的缓慢部分,但测试用例运行的时间相同,即使在慢速核心#2上也是如此.只有复杂的应用程序显示减速.以下是我尝试过的测试用例:
浮点乘法和加法:
accumulator = accumulator*1.000001 + 0.0001;
Run Code Online (Sandbox Code Playgroud)三角函数:
accumulator = sin(accumulator);
accumulator = cos(accumulator);
Run Code Online (Sandbox Code Playgroud)整数加法:
accumulator = accumulator + 1;
Run Code Online (Sandbox Code Playgroud)尝试使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];
}
}
}
Run Code Online (Sandbox Code Playgroud)问题:为什么一个CPU内核比其他内核慢,哪个CPU部分导致这种减速?
编辑:更多测试显示了一些Heisenbug行为.当我明确设置处理器亲和性时,我的应用程序不会减慢核心#2的速度.但是,如果它选择在没有明确设置处理器关联的情况下在核心#2上运行,那么应用程序运行速度会慢大约10%.这就解释了为什么我的简单测试用例没有显示相同的减速,因为它们都明确设置了处理器亲和性.因此,看起来有些进程喜欢在核心#2上生存,但如果设置了处理器亲和性,它就会失控.
结论:如果您需要在多核计算机上获得单线程程序的准确基准,请确保设置处理器关联.