我有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个核心100%)。
我很困惑为什么4核处理速度比8快。
i7-8550U有4个核心和8个线程。
有什么不同?引用How-To Geek:
超线程是英特尔首次尝试将并行计算引入消费者PC。它在2002年Pentium 4 HT的台式机CPU上首次亮相。当时的Pentium 4只有一个CPU内核,因此它实际上一次只能执行一项任务 - 即使它能够在任务之间快速切换这似乎是多任务处理。超线程试图弥补这一点。
具有超线程的单个物理CPU核心显示为操作系统的两个逻辑CPU。 CPU仍然是一个CPU,所以它有点作弊。虽然操作系统为每个核心看到两个CPU,但实际的CPU硬件只有每个核心的一组执行资源。 CPU假装它拥有比它更多的内核,它使用自己的逻辑来加速程序执行。换句话说,操作系统被欺骗为每个实际CPU核心看到两个CPU。
超线程允许两个逻辑CPU核心共享物理执行资源。这可以加快速度 - 如果一个虚拟CPU停止并等待,另一个虚拟CPU可以借用其执行资源。超线程可以帮助您加快系统速度,但它远不及实际的额外内核。
通过将作业分成更多核心而不是可用 - 你需要付出很大的代价。