2015-11-06 99 views
-2

超线程可能会伤害某些应用程序的性能,因此不应使用它。从微软的网站(https://msdn.microsoft.com/en-us/library/cc615012%28BTS.10%29.aspx):如何决定是否使用超线程?

至关重要超线程可对于BizTalk Server 电脑关闭。超线程使服务器似乎拥有比实际更多的处理器/处理器内核。然而,超线程处理器通常提供物理处理器/处理器内核的性能的20%到30%之间。当BizTalk 服务器计算处理器的数量来调整其自调谐算法 ;超线程处理器会导致对这些调整 倾斜,这对整体性能不利。

过程套索计划允许对一些过程禁用超线程:

您可以使用程序,如过程套索(免费)设置默认CPU 亲和力的关键过程,使自己的线程永远得不到 分配给逻辑核心。我们称之为HyperThreaded Core 避免。

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

  • 如何决定是否在您的应用程序中使用超线程? (如有必要,请提供一些具体技术细节的指导)
  • 是否需要进行实验以作出最终决定?
  • 如何避免超线程在您的应用程序,如果它不是有利的? (在C++和c中的例子)
+2

超线程(有点)是CPU内部的概念。您听起来更像是在讨论线程,而不是专门为超线程定制代码,因为超线程可以被认为是“假”核心。 – Olipro

+0

你是指多线程? – NathanOliver

+0

是的。超线程是一些CPU的技术性东西。多线程是编程并发执行代码的一种方式。在多线程环境(或多进程环境)中,它显然取决于所执行的处理类型,关于这些处理您不会提供详细信息。 – hexasoft

回答

2

我不知道Process Lasso的作品是“禁用超线程”。对于那个特定的应用程序,你可以做的最好的做法是将DLL注入到系统的每个进程中,调用SetProcessAffinityMask,其中只包含猜测,禁用其他每个核心,希望操作系统避免调度到超线程逻辑核心。

猜测和希望,没有什么在Windows API中可以做到这一点。这回答你的第三个要点。

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

我无法评论Microsoft为BizTalk禁用HT的建议,your linked article,因为我找不到本文的日期。唯一有趣的是关于“赋予逻辑处理器的中断关联......”,对我来说是新的。关于HT的文章中唯一的其他建议是相当薄弱的。

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

一个幽默撇开:同一家公司也出售一款名为SmartTrim的产品,让人想起在90年代流行的RAM-doublers

2

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

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

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

+1

实际上,如果您的程序运行在4C/8T CPU上有4个线程,会有2个线程分配给同一个物理内核的时间。这可能是因为OS随时处理几十个后台线程。只有显式亲和力控制可以防止这种情况尽管如此,答案很好。 –

+1

请参阅处理此问题的procs上的'numactl'。 – hexasoft

+0

@void_ptr:当然,但是因为你的线程是CPU绑定的,他们几乎都会坐在独立的物理内核上,后台线程偶尔会被调度到逻辑内核上,从你的线程中窃取资源。即使您在您的线程上分配亲和力,也会发生这种情况。 –

相关问题