如何决定是不是使用超线程? [关闭]
Posted
技术标签:
【中文标题】如何决定是不是使用超线程? [关闭]【英文标题】:How to decide whether to use hyperthreading or not? [closed]如何决定是否使用超线程? [关闭] 【发布时间】:2015-11-06 20:18:25 【问题描述】:超线程可能会损害某些应用程序的性能,因此不应使用它。来自微软网站 (https://msdn.microsoft.com/en-us/library/cc615012%28BTS.10%29.aspx):
关闭 BizTalk Server 的超线程至关重要 电脑。超线程使服务器看起来有更多 处理器/处理器内核比它实际做的;然而 超线程处理器通常提供 20% 到 30% 的 物理处理器/处理器内核的性能。当 BizTalk 服务器统计处理器的数量来调整它的自我调整 算法;超线程处理器导致这些调整 不利于整体性能。
Process Lasso 程序允许对某些进程禁用超线程:
您可以使用 Process Lasso(免费)等程序来设置默认 CPU 关键进程的亲和力,因此它们的线程永远不会得到 分配给逻辑核心。我们将此功能称为超线程核心 回避。
我有一些执行大量数学计算的旧程序。如果他们可以使用 4 个核心,看到他们使用一个核心令人沮丧。我想重写它们以使用多个线程。它们使用大的连续内存块,因此缓存未命中的数量最少。我的问题如下:
如何决定是否在您的应用程序中使用超线程? (必要时提供一些技术细节的一般指导) 是否归结为进行实验以做出最终决定? 如果没有优势,如何避免应用程序中的超线程? (c++ 和 c 中的示例)【问题讨论】:
超线程(在某种程度上)是 CPU 内部的概念。您听起来更像是在讨论一般的线程,而不是专门为超线程定制代码,因为超线程可以被认为是“假”核心。 你的意思是多线程吗? 是的。超线程是某些 CPU 的技术内容。多线程是一种编程并发执行代码的方式。在多线程上下文(或多进程上下文)中,它显然取决于所执行的处理类型,您没有提供详细信息。 我的意思是超线程。我在某处读到它并不总是好的,你可以避免它。但我不知道更多细节。 所以我不明白。您无法决定使用或不使用超线程,因为它被操作系统视为标准 CPU。作为系统管理员,您可以激活或不激活 HT,但作为程序员,您必须依靠可用的 CPU(实数或 HT 的)来决定(比如说)执行代码的线程数。 【参考方案1】:我不知道 Process Lasso 的工作原理是“禁用超线程”。对于那个特定的应用程序,你能做的最好的事情就是将 DLL 注入到系统的每个进程中,调用 SetProcessAffinityMask 并使用仅相当于猜测的内容,禁用所有其他内核,希望操作系统能够避免调度到超线程逻辑内核。
猜测和希望,Windows API 中没有任何东西可以肯定地做到这一点。这回答了您的第三个要点。
您可以禁用超线程作为 Bios 级别(通常)。
我无法评论 Microsoft 为 BizTalk 禁用 HT 的建议,your linked article,因为我找不到这篇文章的日期。唯一有趣的一点是关于“为逻辑处理器分配中断亲和性......”,对我来说是新的。那篇文章中关于 HT 的唯一其他建议相当薄弱。
更重要的是:我不知道您为什么要询问超线程,而您通常应该关注多线程。如果您担心多个线程争用相同的共享资源...那么请不要在您的应用中使用线程。
除了幽默之外:同一家公司还销售一款名为 SmartTrim 的产品,让人想起 90 年代流行的 RAM-doublers。
【讨论】:
【参考方案2】:基本上,它归结为配置执行 CPU 工作负载的并发线程数。操作系统知道超线程,并将线程分配给物理内核,直到它用完,并且只有当线程数多于物理内核时,它才会开始将工作分配给逻辑内核。
要确定最佳线程数是物理内核数还是逻辑内核数,测量实际任务的性能是最佳方法。综合基准可以让您了解超线程的工作原理,但不会告诉您什么最适合您的特定指令组合。
控制线程数的确切方法取决于您使用的多线程结构——如果您自己创建线程,这很明显,但线程池和 OpenMP 等自动并行框架也提供了调整线程数的方法。
【讨论】:
实际上,如果您的程序运行,例如4C/8T CPU上有4个线程,会有一段时间2个线程分配给同一个物理内核。这可能是因为操作系统始终处理几十个后台线程。只有明确的亲和性控制才能防止这种情况发生。不过答案很好。 请参阅numactl
处理此问题的 procs。
@void_ptr:当然可以,但是因为您的线程受 CPU 限制,它们几乎会位于单独的物理内核上,并且后台线程偶尔会被调度到逻辑内核上,从而从您的线程中窃取资源。即使您确实在线程上分配了亲和性,也会发生这种情况。
@BenVoigt - 不,“我的”CPU 密集型线程偶尔会被安排在同一个物理内核上。这具有可衡量的性能影响。
@void_ptr:“偶尔”,是的。有无关联分配都值得测试,但在大多数情况下,我怀疑这是否值得。以上是关于如何决定是不是使用超线程? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用标准 C++ 线程而不是 FLTK 超时来更新窗口?
启用超线程时如何在 GRAFANA 中获取 CPU 的聚合使用情况
C/C++/Assembly 以编程方式检测超线程在 Windows、Mac 和 Linux 上是不是处于活动状态 [重复]