进程在一个线程上运行速度会比在一个核心上运行速度慢吗

进程在一个线程上运行速度会比在一个核心上运行速度慢吗

现在很多 CPU 都配备 2/4 核和 4/8 线程。

还有一些 CPU 有 4 核和 4 线程。

这是否意味着,由于无与伦比的进程仅使用了一半的核心,因此在相同时钟周期的 CPU 上运行速度在 8/4 CPU 上会比在 4/4 CPU 上慢?

是否有一种编程方式(比如说操作系统级别)可以将 CPU 设置为每个核心仅 1 个线程?

答案1

这是否意味着,由于非并行进程仅使用了一半的核心,因此在相同时钟周期的 4 核 8 线程 CPU 上运行速度会比在 4 核 4 线程 CPU 上运行速度慢?

在某种程度上,是,但也不是。

如果我在 8 核(8 线程)CPU 上运行 8 个不独立的单线程程序,那么每个核心将运行一个线程,并且这些程序将以最大速度运行(例如,始终分配时间,忽略也需要一些 CPU 时间的操作系统等)。

如果我在 4 核(4 线程)CPU 上运行 8 个独立的单线程程序,那么平均每个核将运行其中两个。程序运行速度将减半。

到目前为止没有什么意外。

现在有了 4 核(8 线程)CPU,操作系统认为有 8 个内核。它会像第一种情况一样对它们进行线程处理。但事实并非如此;一半的内核不是作为常规内核构建的。通常只有部分功能是重复的,如果运气不好,其中一个线程会停滞。它不会比 4c/4t CPU 快。

然而,如果你非常幸运(例如 ALU 加倍并且你交替从内存中获取信息并进行添加)那么两者都可以全速运行。

一般,这将导致速度提高 30%。


更复杂的是:如果您的程序使用大型数据集,那么运行超过 4 个数据集可能会导致缓存命中次数减少。最后一个可能会真正减慢速度。


是否有一种编程方式(比如说操作系统级别)可以将 CPU 设置为每个核心仅 1 个线程?

是的,轮到超级踩踏了。

您可以在固件(例如 BIOS 或 UEFI)中或从操作系统中执行此操作。

例如,对于 8t 4 核 CPU,其中核心 0 1 2 3 是第一个核心,而 4 5 6 7 是可以使用的线程集:

echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online

据我所知,FreeBSD 也使用 syscontrol 做了同样的事情。对于 OSX 或 Windows,您需要谷歌搜索。

答案2

线程由软件控制(例如 Java VM),而核心是硬件。处理器内部可以有多个具有不同互连方案的核心。每个核心可以处理一个线程,但这取决于操作系统如何管理每个线程。

我推荐 Apress 的“微处理器专家之声”系列,了解有关处理器硬件的最新和最好的信息。

我推荐 Paul Butcher 关于线程并发的优秀著作,因为他还介绍了 GPU(七周七种并发模型)。

相关内容