![进程在一个线程上运行速度会比在一个核心上运行速度慢吗](https://linux22.com/image/1453010/%E8%BF%9B%E7%A8%8B%E5%9C%A8%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E4%B8%8A%E8%BF%90%E8%A1%8C%E9%80%9F%E5%BA%A6%E4%BC%9A%E6%AF%94%E5%9C%A8%E4%B8%80%E4%B8%AA%E6%A0%B8%E5%BF%83%E4%B8%8A%E8%BF%90%E8%A1%8C%E9%80%9F%E5%BA%A6%E6%85%A2%E5%90%97.png)
现在很多 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(七周七种并发模型)。