现代多核处理器真的在进行并行处理吗?
比如,以英特尔的核心i7处理器为例。其中一些有#of Cores: 4
和#of Threads: 8
(取自英特尔的规格页面)。如果我编写一个具有多个执行线程的程序(比如Java或C),它们是否会同时处理真正?我的导师说“多核处理器的情况并非总是如此”,但没有提供太多细节。
为什么英特尔必须同时指定#of Core和#of Threads?线程只是一个描述程序相关抽象的术语,而不像实际硬件的“核心”吗? (“每个线程都在不同的核心上运行”)。
答案 0 :(得分:3)
是的,现代多核处理器实际上是在适当的任务上进行并行处理,并且只要正确编写软件就可以使用它。我亲自测试了具有可配置数量的线程的多线程软件,并观察了吞吐量增加与线程数量成比例,直到该数量等于核心数量:在四核处理器上,一个线程完成了一定数量的任务时间,四个线程在相同的时间内完成了四个任务,吞吐量翻了两番。使用超出核心数量的其他线程,没有进一步增加,实际上略有减少:八个线程上的八个任务所花费的时间比四个线程上的四个任务完成的时间多两倍。只使用四个线程并让它们连续处理两个任务就更快了。
然而,这可能是您的教授所指的,只是拥有多个线程并不能保证您将利用多个核心。例如,线程可能受到共享资源上的争用的限制 - 例如,他们都需要访问的一块内存。他们还可能争夺共享I / O资源,如磁盘访问或网络访问。在某些情况下,一次运行多个线程可能无法改善,实际上可能会降低总吞吐量。
最后,“线程数”和“核心数”数字是不同的,因为英特尔的“超线程”架构,据说允许每个核心一次运行两个线程。根据我的经验,超线程在现实世界中并不是很有用:例如,在我上面描述的测试中,内核是超线程的英特尔内核,但是当我运行多个线程等于物理数量时仍然出现峰值吞吐量核心,当我运行一些线程等于英特尔声称的线程容量时丢弃。我发现最好注意核心数量并忽略英特尔的“线程数”声明。