我正在对一个大型的科学应用程序进行基准测试,发现在相同的输入条件下,它的运行速度有时会慢10%。经过多次搜索后,我发现只有当它运行在我的四核处理器的核心#2 (特别是运行在2.4GHz上的Intel GHz)时,它才会出现减速。这个应用程序是一个单线程的,大部分时间都花在CPU密集型的矩阵数学例程上。
现在我知道一个内核比其他内核慢,我可以通过将处理器关联设置为所有运行的相同核心来获得精确的基准测试结果。然而,我仍然想知道为什么一个核心会变慢。
我尝试了几个简单的测试用例来确定CPU的慢部分,但是测试用例运行的时间是相同的,甚至在慢内核#2上也是如此。只有复杂的应用程序显示了放缓。下面是我尝试过的测试用例:
的问题:为什么一个CPU内核比其他CPU内核慢,以及CPU的哪个部分导致了这种减速?
编辑:更多的测试显示了一些Heisenbug行为。当我显式设置处理器关联时,我的应用程序不会在内核#2上减速。但是,如果它选择在没有显式设置处理器关联的情况下在核#2上运行,那么应用程序运行速度会慢10%左右。这就解释了为什么我的简单测试用例没有显示出同样的减速,因为它们都显式地设置了处理器关联。因此,看起来有一些进程喜欢住在内核#2上,但是如果设置了处理器关联,它就会消失。
底线:如果您需要对多核机器上的单线程程序进行精确的基准测试,那么请确保设置处理器关联。
发布于 2009-05-13 19:03:29
您可能有选择附加到同一个处理器(CPU亲和)的应用程序。
操作系统通常希望在同一个处理器上运行,因为它们可以将所有数据缓存在同一个L1缓存中。如果您碰巧在操作系统所做的大量工作的同一核心上运行您的进程,您可能会体验到cpu性能下降的影响。
听起来有些进程想要坚持使用同一个cpu。我怀疑这是不是硬件问题。
它不一定一定是你的操作系统在做这项工作,其他后台守护进程也可以这样做。
发布于 2009-05-13 18:57:42
由于过热或省电的特点,大多数现代cpu的每个cpu核心都有单独的节流。你可以尝试关闭节能或改善冷却。或者你的cpu不好。在我的i7上,我得到了在“传感器”中报告的8个核心的2到3度不同的核心温度。满载时仍有变化。
发布于 2009-05-15 17:52:30
另一种可能是进程在运行时从一个核心迁移到另一个核心。我建议将CPU关联设置为“慢速”核心,看看它是否同样快。
几年前,在多核时代之前,我为自己为“网络开发”买了一台双套接字的Athlon MP。突然,我的Plone/Zope/Python服务器慢下来了。谷歌搜索发现CPython解释器有一个全局解释器锁,但是Python线程由OS线程支持。OS线程在CPU中分布均匀,但每次只有一个CPU可以获得锁,因此所有其他的进程不得不等待。
设置Zope与任何CPU的CPU亲缘关系可以解决这个问题。
https://stackoverflow.com/questions/859747
复制相似问题