【问题标题】:Multithreading - are the multi-core processors really doing parallel processing?多线程——多核处理器真的在做并行处理吗?
【发布时间】:2014-06-03 21:21:29
【问题描述】:

现代多核处理器真的在做并行处理吗?
例如,英特尔的核心 i7 处理器。其中一些有#of Cores: 4#of Threads: 8(取自英特尔的规格页面)。如果我要编写一个有多个执行线程的程序(比如 Java 或 C),它们会真的同时处理吗?我的导师说“多核处理器并非总是如此”,但没有提供太多细节。

为什么英特尔必须同时指定#of Cores 和#of Threads?线程不只是描述程序相关抽象的术语,与实际硬件的“核心”不同吗? (“每个线程都在不同的内核上运行”)。

【问题讨论】:

  • 您对硬件线程 (SMT) 和软件线程感到困惑。
  • 您的问题标题的答案是“是”。扩展的答案并不完全是编程,而且过于宽泛,因为它需要涵盖所有并行编程和硬件。
  • 英特尔拥有他们所谓的“超线程”,它允许每个内核同时运行多个线程。这就是为什么他们说 4 核/8 线程。您最多可以同时执行 8 个线程,但使用 4 个内核的资源。
  • @Adam 你的意思是每个核心运行 2 个线程吗?

标签: multithreading


【解决方案1】:

是的,现代多核处理器确实在执行适当的任务并提供并行处理,前提是软件编写得当。我亲自测试了具有可配置线程数的多线程软件,并观察了吞吐量与线程数成正比的增长,直到该数等于内核数:在四核处理器上,一个线程完成了一定数量的一项任务时间,四个线程在相同的时间内完成了四个任务,吞吐量翻了两番。除了核心数量之外,额外的线程没有进一步增加,实际上略有下降:8 个线程上的 8 个任务所花费的时间是 4 个线程上的 4 个任务完成时间的两倍多。使用四个线程并让它们分别处理两个任务会更快。

但是,这可能就是您的教授所指的,仅仅拥有多个线程并不能保证您将利用多个内核。例如,线程可能会受到对共享资源的争用的限制——例如,它们都需要访问的一块内存。他们还可能争用共享的 I/O 资源,例如磁盘访问或网络访问。在某些情况下,一次运行多个线程可能不会改善情况,实际上可能会降低总吞吐量。

最后,由于英特尔的“超线程”架构,“线程数”和“内核数”数字不同,据说它允许每个内核一次运行两个线程。根据我的经验,超线程在现实世界中并不是很有用:例如,在我上面描述的测试中,内核是超线程 Intel 内核,但是当我运行的线程数等于物理线程数时,仍然会出现峰值吞吐量核心,并在我运行与英特尔声称的线程容量相等的线程数时下降。我发现最好注意核心数,忽略英特尔的“线程数”声明。

【讨论】:

  • “超线程”是对高效上下文切换的硬件支持,对于高优先级非计算密集型线程需要中断低优先级线程的工作负载最为有利。这使得图形用户界面更具响应性。
  • @OllieJones 所以超线程实际上不是多线程执行,而是多线程上下文?这是有道理的,并且与我所看到的一致,因为我的应用程序是一个没有用处的应用程序。感谢您的信息。
猜你喜欢
  • 2021-11-02
  • 2015-12-29
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多