我有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快。
答案 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可以借用它 执行资源。超线程可以帮助加快系统速度, 但它远没有实际的附加内核那么好。
通过将作业分成多于可用的核心 - 您将付出巨大的代价。