2011-01-22 67 views
15

如果你产卵多线程(或进程)同时,为更好产卵多达的物理处理器的数量或逻辑处理器的数量,假设任务CPU绑定?还是在两者之间做一些事情比较好?(比如3个主题)?双核超线程:我应该使用4个线程还是3或2?

性能是否取决于正在执行的指令种类(比如,非本地内存访问是否与缓存命中大不相同)?如果是这样,在哪些情况下利用超线程会更好?


更新:

我问的原因是,我记得读书的地方,如果你有尽可能多的任务,如虚拟处理器的数量,在同一个物理核心任务有时会挨饿一些CPU资源并防止彼此获得所需的尽可能多的资源,可能会降低性能。这就是为什么我想知道是否有像虚拟内核一样多的线程是一个好主意。

回答

5

的性能取决于各种各样的因素。大多数任务不是严格限制CPU的,因为即使所有数据都存储在内存中,它通常也不在处理器缓存中。我看过一些例子(如this one),其中内存访问模式可以显着改变给定“并行”进程的性能分布。

总之,对于所有情况都没有完美的数字。

+0

+1该链接非常丰富;谢谢! – Mehrdad 2011-01-22 23:51:28

2

我记得超线程技术可以提供高达30%的性能提升。一般来说,你最好把它们当作4个不同的核心。在一些特定的情况下,当然(例如,具有绑定到每个核心同样长期运行的任务),你可以把你的处理更要考虑到一些核心只是逻辑一约超线程本身

更多信息here

+0

+1有趣......我读HT其它Intel的文档,但是这一次的不同,有很多的详细信息;谢谢! – Mehrdad 2011-01-22 23:51:55

+0

链接现在404。 – user643011 2017-05-25 19:19:00

4

机会相当不错,你会看到一个性能提升,每个核心启用了超线程功能后运行2个线程。 似乎完全被CPU绑定的作业通常不是,并且HyperThreading可以从偶尔的中断或上下文切换中提取几个“额外”周期。另一方面,使用Turbo Boost的核心iX处理器,实际上你可能会更好地在每个内核中运行1个线程,以鼓励CPU自行超频。

在工作中,我们经常以全CPU的方式运行多核服务器,每次进行多种日计算。前一段时间,我们测量了有和没有HT的性能差异。我们发现平均而言,使用超线程技术并且同时运行两倍的作业,我们可以比不使用超线程技术快10%的速度完成相同数量的作业。

假设2 ×核心是一个很好的起点,但底线是:measure!

+0

+1感谢您指出Turbo Boost功能......我在自己的CPU上拥有它,但我从未想过如何影响部分等式。 – Mehrdad 2011-01-22 23:52:51

2

使用超线程上运行相同的核心两个线程,当两个线程也有类似的内存访问模式,但不相交的访问数据结构,将是非常大致相当于运行它们在每两个独立内核一半的缓存。如果内存访问模式使缓存的一半足以防止抖动,性能可能会很好。如果内存访问模式使得缓存减半导致抖动,则可能会有十倍的性能下降(意味着没有超线程的情况下会更好)。

另一方面,在某些情况下,超线程可能是一个巨大的胜利。如果许多线程都将使用无锁数据结构读取和写入相同的共享数据,并且所有线程必须看到数据的一致视图,则尝试在不相交的处理器上运行线程可能会导致抖动,因为一次只有一个处理器可能对任何给定的缓存行具有读写访问权限;在两个内核上运行这样的线程可能比每次仅运行一个线程需要更长的时间。但是,当一个数据被单个内核上的多个线程访问时,不需要这种缓存仲裁。在这些情况下,超线程可能是一个巨大的胜利。

不幸的是,我不知道有什么办法让调度程序有任何“提示”来暗示某些线程应尽可能共享一个内核,而其他线程应尽可能单独运行。

0

所有其他的答案已经给了很多优秀的信息。但是,还有一点要考虑的是SIMD单元在同一芯片上的逻辑内核之间共享。所以,如果你使用SSE代码运行线程,你是在所有4个逻辑核心上运行它们,还是只产生2个线程(假设你有两个芯片)?对于这种奇怪的情况,最好用你的应用程序进行配置。

1

对于,HT允许提升约10-30%,主要是使用额外虚拟内核的cpu绑定任务。尽管这些任务可能看起来像CPU一样,除非它们是定制的程序集,但它们通常会遭遇RAM和本地高速缓存之间的IO等待。这允许在另一个线程正在等待IO时,在启用物理HT的核心上运行的一个线程工作。这确实带来一个缺点,因为两个线程共享相同的缓存/总线,这将导致每个线程在等待IO时暂停两个线程。

在最后一种情况下,运行单个线程会降低最大同时理论处理能力(降低10-30%),有利于运行单线程,而不会缓慢缓存抖动,这在某些应用中可能非常重要。

选择使用哪个内核与选择运行多少个线程同样重要。如果每个线程的CPU大致持续时间大致相同,最好设置亲和力,以便使用大多数不同资源的线程可以找到不同的物理内核,并且使用公共资源的线程可以分组到相同的物理内核(不同的虚拟内核)可以从相同的缓存中使用通用资源,而无需额外的IO等待。

由于每个程序具有不同的CPU使用特性,缓存抖动可能是也可能不是主要的减速(通常是),因此无法确定理想的线程数量应该是多少,而不需要首先进行性能分析。最后要注意的是OS/Kernel也需要一些CPU和缓存空间。如果在CPU绑定线程上需要实时延迟,以避免共享缓存/ cpu资源,那么为操作系统保留单个(物理)内核通常是理想的选择。如果线程经常等待IO并且高速缓存抖动不成问题,或者如果运行专门为该应用程序设计的实时操作系统,则可以跳过这最后一步。

http://en.wikipedia.org/wiki/Thrashing_(computer_science) http://en.wikipedia.org/wiki/Processor_affinity

相关问题