我的电脑有一个四核 i7 处理器。我正在研究科学模拟的并行化。超线程如何影响并行性能?我知道我不应该使用超过 4 个工作流程来获得下降性能。但是我也应该禁用超线程吗?它对并行性能有影响吗?
4 回答
以我的经验,运行电磁建模和反演代码,答案是肯定的,你应该禁用超线程。但这不是其他人的轶事(甚至我的轶事都不能很好地回答的问题,尽管它们是迷人而真实的)。
你是学生,这绝对是一个值得你花时间得出自己结论的话题。涉及的因素太多,以至于我在平台上运行代码的经验对您来说几乎毫无价值。
在 Linux 下,如果 i7 上有 4 个繁忙线程,它会将每个线程放在不同的内核上。如果另一半核心空闲,性能应该是一样的。如果您正在运行另一个程序,那么使用超线程来运行额外的程序或上下文切换是否更好是有争议的。(我怀疑上下文切换越少越好)
一个常见的错误是假设如果你使用 8 个线程而不是 4 个线程,它会快一倍。它可能只是稍微快一点(在这种情况下它可能仍然值得)或稍微慢一点(在这种情况下将您的程序限制为 4 个线程)我发现了使用双倍线程数稍微快一点的例子。恕我直言,这只是测试它以找到最佳数量并使用那么多的问题。
我唯一能看到您需要关闭 HT 的情况是您无法控制应用程序的行为方式并且使用 4 个线程会更快。
你说:
我知道我不应该使用超过 4 个工作流程来获得下降性能。
这不一定是真的!这是我发现在启用了 HT 的 i7-3820 上运行的示例。我运行的所有代码都是 C++。考虑到我需要运行 8 个单独的程序(尽管相同)。我尝试了以下两种运行这些代码的方法:
- 一次只能同时运行 4 个单独的线程。当这 4 个完成后,运行接下来的 4 个线程(总共 4 x 2 = 8 个)。
- 同时运行所有 8 个单独的线程(8 x 1 = 8 个)。
正如您所看到的,这两个场景实现了相同的目标。但是,我发现运行时间是:
- 每组4 个线程1 小时;共 2 小时完成全部 8 个。
- 8 个线程的集合需要 1.5 小时。
您会发现,对于案例 #1,单个线程将更快地完成,但整体 #2 提供了更好的性能,因为您的所有工作都在更短的时间内完成。我发现启用 HT 后性能的典型提升约为 25%。
很明显,在某些情况下运行 8 个线程比 4 个更快。
HyperTreading 是 Intel 实现的同步多线程 (SMT)。一般来说,SMT 几乎总是有益的(这就是通常启用它的原因),除非您的应用程序受 CPU 限制。如果您确定您的应用程序受 CPU 限制,则禁用 SMT。否则(您的应用程序受 IO 限制或无法使内核完全饱和),请保持启用状态。