如何决定是否使用超线程?

时间:2015-11-06 20:18:25

标签: c++ c multithreading performance hyperthreading

超线程可能会损害某些应用程序的性能,因此不应使用它。从Microsoft网站(https://msdn.microsoft.com/en-us/library/cc615012%28BTS.10%29.aspx):

  

对于BizTalk Server,关闭超线程是至关重要的   电脑。超线程使服务器看起来更多   处理器/处理器核心比它实际上;然而   超线程处理器通常提供20%到30%的   物理处理器/处理器核心的性能。当BizTalk   服务器计算处理器的数量以调整其自我调整   算法;超线程处理器导致这些调整   是倾斜的,这对整体表现有害。

Process Lasso程序允许禁用某些进程的超线程:

  

您可以使用Process Lasso(免费)等程序来设置默认CPU   关键过程的亲和力,使他们的线程永远不会得到   分配给逻辑核心。我们将此功能称为HyperThreaded Core   回避。

我有一些较旧的程序可以执行大量的数学计算。如果他们可以使用4,那么看到他们使用一个核心是令人沮丧的。我想重写它们以使用许多线程。它们使用大型连续内存块,因此缓存未命中数量最少。我的问题如下:

  • 如何决定是否在您的应用程序中使用超线程? (必要时提供一些技术细节的一般指导)
  • 是否需要进行实验才能做出最终决定?
  • 如果不合适,如何在应用程序中避免超线程? (c ++和c中的例子)

2 个答案:

答案 0 :(得分:2)

基本上,它归结为配置执行CPU工作负载的并发线程数。操作系统知道超线程,并将线程分配给物理内核,直到它用完为止,并且只有当线程数多于物理内核时,它才会开始将工作分配给逻辑内核。

要确定最佳线程数是物理内核还是逻辑内核数,测量实际任务的性能是最佳方法。综合基准​​可以教你一些超线程如何工作,但不会告诉你什么是最适合你的特定指令。

控制线程数的确切方法取决于您使用的多线程构造 - 如果您自己创建线程,很明显,但是线程池和自动并行框架(如OpenMP)也提供了调整线程数的方法。

答案 1 :(得分:2)

我不知道Process Lasso的工作原理是什么"禁用HyperThreading"。对于那个特定的应用程序,你可以做的最好的事情是将DLL注入到系统的每个进程中,用一些只能猜测的东西调用SetProcessAffinityMask,禁用所有其他核心,希望操作系统避免调度超线程逻辑核心。

猜测和希望,Windows API中没有任何内容可以做到这一点。这回答了你的第三个要点。

您可以禁用HyperThreading作为BIOS级别(通常)。

我无法评论Microsoft为BizTalk禁用HT的建议your linked article,因为我无法找到本文的日期。唯一有趣的一点是关于"为逻辑处理器分配中断亲和力......",对我而言是新的。该文中关于HT的唯一其他建议相当薄弱。

更重要的是:当你应该关注多线程时,我不知道你为什么要问HyperThreading。如果您担心多个线程竞争相同的共享资源......那么请勿在您的应用中使用线程。

一个幽默的旁观:同一家公司还销售一款名为SmartTrim的产品,让人想起在90年代流行的RAM-doublers