0

我第一次玩 pthreads,在我的机器上运行时发现了一些奇怪的东西。

我有一个带有 2 个物理内核和 4 个虚拟内核的 Intel i5。

使用 2 个线程运行我的程序时,我的性能大约提高了一倍,但是使用 4 个线程运行时,我获得的性能与两个线程相同。为什么会这样?

2 个线程的结果:真实 0m9.335s 用户 0m18.233s sys 0m0.132s

4 个线程的结果:真实 0m9.427s 用户 0m34.130s sys 0m0.180s

编辑:代码是完全可并行化的,线程独立运行,没有任何共享资源。

4

4 回答 4

2

因为您实际上只有 2 个内核。超线程不会神奇地为您创建另外 2 个内核。超线程可以在 CPU 上运行 4 个线程,但不能同时运行。它仍然会在两个物理内核上分配线程,并在执行管道中来回切换线程。

您可能期望的性能提升是最好的 30%。

于 2013-01-19T23:14:14.680 回答
2

请记住,超线程基本上是一种将 CPU 上的备用执行单元重用于单独的执行线程的方法。您仍在使用两个核心的马力,它只是分成四种方式。

如果您的代码经过优化以充分利用大多数可用的 EU,那么一旦它在两个物理内核上运行,就没有多余的资源了,因此超线程内核不能做得更好。

于 2013-01-19T23:15:45.793 回答
1

使用多线程时的性能增益很难确定。当然,超线程在性能上也“少于一个额外的核心”。

除此之外,您可能会遇到内存吞吐量问题,或者您的代码正在争用锁等,因为您拥有更多锁 - 即使您自己的代码无锁并不意味着例如 I/O 或您调用的某些函数完全能够并行运行 - 有时存在“隐藏”共享资源。

但最有可能的是,您的处理器不能再快了。

于 2013-01-19T23:21:55.300 回答
1

这篇从超线程 (HT) 首次引入时开始的旧文章提供了很多关于其工作原理的详细信息(尽管我确信在过去 10 年中已经做出了许多改进)。http://www.intel.com/technology/itj/2002/volume06issue01/vol6iss1_hyper_threading_technology.pdf

每个逻辑处理器都维护着一套完整的架构状态。架构状态由寄存器组成,包括通用寄存器、控制寄存器、高级可编程中断控制器 (APIC) 寄存器和一些机器状态寄存器。从软件的角度来看,一旦架构状态被复制,处理器看起来就是两个处理器。存储架构状态的晶体管数量仅占总数的极小部分。

但是,下面这句话显示了 HT 可能在哪里出现瓶颈:

逻辑处理器几乎共享物理处理器上的所有其他资源,例如高速缓存、执行单元、分支预测器、控制逻辑和总线。

如果线程执行都保持一个或多个共享资源(例如执行单元或总线)100% 忙碌,那么超线程不会提高吞吐量。由于基准测试经常使用系统的某个方面(有意或无意),因此这些共享处理器资源中的一个最终会成为瓶颈并阻止 HT 显示出优势也就不足为奇了。

于 2013-01-21T20:13:32.743 回答