c ++ std :: async:4核上的速度比8核快

时间:2017-12-27 08:59:53

标签: multithreading c++11 asynchronous cpu-cores

我有16000个工作要做。

每份工作都是独立的。没有共享内存,没有进程间通信,没有锁或互斥锁。

我在ubuntu 16.06上。 C ++ 11。英特尔®酷睿™i7-8550U CPU @ 1.80GHz×8

我使用std :: async在核心之间拆分作业。

如果我将作业分成8个(每个核心2000个),则计算时间为145。 如果我将作业分成4个(每个核心4000个),则计算时间为60。

减少后的输出在两种情况下都相同。

如果我在计算过程中监视CPU(仅使用htop),事情会按预期发生(第一种情况下使用8个核心,100%使用,第二种情况下只使用4个核心)。

我很困惑为什么4核处理速度比8快。

1 个答案:

答案 0 :(得分:4)

i7-8550U有4个核心和8个线程。

有什么区别?引用How-To Geek

  

超线程是英特尔首次尝试实现并行   计算到消费者PC。它在桌面CPU上首次亮相   Pentium 4 HT早在2002年。当天的Pentium 4只有一个   单核CPU,因此它实际上只能执行一项任务   时间 - 即使它能够足够快地在任务之间切换   这似乎是多任务处理。超线程试图弥补   这一点。

     

具有超线程的单个物理CPU核心显示为两个逻辑   CPU到操作系统。 CPU仍然是一个CPU,所以它是一个   一点点作弊。虽然操作系统看到两个CPU   每个核心,实际的CPU硬件只有一组执行   每个核心的资源。 CPU假装它有比它更多的内核   是的,它使用自己的逻辑来加速程序执行。在   换句话说,操作系统被骗到看到两个CPU   每个实际的CPU核心。

     

超线程允许两个逻辑CPU核心共享物理   执行资源。这可以加快速度 - 如果是虚拟的话   CPU停滞等待,其他虚拟CPU可以借用它   执行资源。超线程可以帮助加快系统速度,   但它远没有实际的附加内核那么好。

通过将作业分成多于可用的核心 - 您将付出巨大的代价。