启用超线程后,仿真运行时间翻倍

4 投票
4 回答
3846 浏览
提问于 2025-04-17 07:53

我在用Python、Numpy和Cython写一个模拟程序。因为我需要对很多次模拟的结果进行平均,所以我使用了多进程模块来批量运行这些模拟。

在办公室,我有一台配备了超线程技术的i7-920工作站。在家里,我有一台没有超线程的i5-560。我本以为在办公室可以每批运行两倍的模拟实例,这样就能把运行时间缩短一半。没想到,每个模拟实例的运行时间反而比我在家里的工作站还要长。比如说,在家里同时运行3个模拟实例大约需要8分钟,而在办公室同时运行6个实例却要花大约15分钟。我用'cat /proc/cpuinfo'命令确认了'兄弟核心'是8,'CPU核心'是4,所以超线程是开启的。

我不知道有没有什么“总运行时间守恒”的规律(虽然从科学的角度来看,这可能很有趣 :)),希望这里有人能帮我解开这个谜团。

4 个回答

1

其他人基本上已经给你提供了问题的见解,我只是想补充一下,分享这篇文章,它详细解释了超线程技术是怎么运作的,以及它对多线程程序性能的影响:http://software.intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

5

超线程技术在某些工作负载下可能会有好处,但对于需要大量数字计算的任务来说就不太适合。如果你想进行一些复杂的数学运算,最好把超线程关掉。

超线程的好处在于它可以让任务之间“免费切换”,也就是在不同的任务之间快速切换,但CPU的执行单元是有限的。

在这种情况下,超线程可能会让事情变得更糟,因为操作系统无法知道哪些进程是在不同的核心上运行(这样可以充分发挥性能),而哪些是在同一个核心上,只是使用了不同的“超线程”。

其实,我敢打赌Linux内核可以提供一种方法,让你更精细地控制这一点,但Python的多进程模块只会启动额外的进程,使用默认的资源分配。

总之:如果可以的话,关掉超线程——这样你至少可以充分利用4个核心的性能。

3

可能是因为有6个计算量很大的进程,但只有4个真正的处理器核心,这样在切换上下文时会产生更多的开销。如果这些进程争抢CPU资源,它们可能会不太有效地使用CPU的缓存。

如果你只启用4个核心而不是6个,会有什么结果呢?

撰写回答