我第一次玩pthreads并且在我的机器上运行时发现了一些奇怪的东西。
我的Intel i5有2个物理内核和4个虚拟内核。
当用2个线程运行我的程序时,我获得大约两倍的性能,但是当使用4个线程运行时,我获得与两个线程相同的性能。为什么会这样?
2个主题的结果: 真正的0m9.335s 用户0m18.233s sys 0m0.132s
4个主题的结果: 真正的0m9.427s 用户0m34.130s sys 0m0.180s
编辑:代码完全可并行化,线程独立运行,没有任何共享资源。
答案 0 :(得分:2)
因为你真的只有2个核心。 Hyper-threading不会神奇地为您创建2个核心。超线程可以在CPU上运行4个线程,但不能同时运行。它仍将在两个物理内核上分配线程,并在执行管道中来回切换线程。
您可能期望的性能提升为最佳30%。
答案 1 :(得分:2)
请记住,超线程基本上是一种在CPU上重用备用执行单元以实现单独执行的方法。你仍在使用两个核心的马力,它只是分为四种方式。
如果您的代码经过优化,以便充分利用大多数可用的EU,那么一旦在两个物理内核上运行,就没有剩余的资源,因此超线程内核无法做得更好。
答案 2 :(得分:1)
使用多线程时的性能提升非常难以确定。超线程在性能方面也“不到一个额外的核心”。
除此之外,您可能会遇到内存吞吐量问题,或者您的代码正在争夺锁或其他一些现在您拥有更多内容 - 即使您自己的代码是无锁的并不意味着例如我/ O或您调用的某些函数完全能够并行运行 - 有时会有“隐藏”的共享资源。
但最有可能的是,你的处理器不能再快了。
答案 3 :(得分:1)
HyperThreading(HT)首次推出时的这篇旧文章提供了很多有关其工作原理的详细信息(尽管我确信在过去10年中已经做了很多改进)。 http://www.intel.com/technology/itj/2002/volume06issue01/vol6iss1_hyper_threading_technology.pdf:
每个逻辑处理器都维护一组完整的体系结构状态。架构状态包括寄存器,包括通用寄存器,控制寄存器,高级可编程中断控制器(APIC)寄存器和一些机器状态寄存器。从软件的角度来看,一旦架构状态重复,处理器似乎是两个处理器。存储架构状态的晶体管数量是总数的极小部分。
然而,下面的句子显示了HT可能出现瓶颈的地方:
逻辑处理器几乎共享物理处理器上的所有其他资源,例如高速缓存,执行单元,分支预测器,控制逻辑和总线。
如果线程执行各自保持一个或多个共享资源(例如执行单元或总线)100%忙,那么超线程将不会提高吞吐量。由于基准测试经常运用系统的一个方面(有意或无意),因此这些共享处理器资源中的一个最终会成为瓶颈并阻止HT显示优势并不奇怪。