0

对于多核计算,一开始让我感到困惑的是,多核硬件的模型对真机过于抽象。

我在一台带有单个英特尔处理器的笔记本电脑上工作,包含4 个内核并支持超线程,这使得逻辑内核的数量为 8

假设我有一个Java程序实现了并发算法(据说Java会使用线程调度的OS规则,所以JVM不会影响调度),并且程序是纯CPU绑定的

我的观察:

  • 如果程序(进程)运行的线程数少于 8 个,则工作的并行度会随着线程数的增加而增加
  • 当总线程数大于 8 时,性能会变得复杂,但通常不会比运行 8 个线程有更多的改进;而对于某些特定的算法,它比运行8个线程更糟糕,即时间消耗大大增加。

我对此的了解: 据我所知,我运行的程序被操作系统视为用户进程,如果程序创建线程以尝试获得并行性,操作系统将尝试在可用内核中调度这些线程。同一内核上进程的任何线程都可以共享该内核上进程的总执行时间。

我的问题: 假设 CPU 只运行我的程序。即没有其他用户进程。

  • 如果 CPU 只有 1 个核心,则该进程将无法通过多线程获得并行性的好处,因为该进程的总执行时间不会改变。这是真的吗?

  • 如果有多个内核可用,操作系统将尝试在不同内核上均匀、公平地调度进程的线程,并且不同内核上的进程线程获得自己的(额外)执行时间,从而加快速度。这是真的吗?

  • 如果有 n 个线程和 m 个内核,其中 n>m,则某些内核可能会运行超过 1 个进程的线程,这甚至可能会因为同一内核上的线程之间的“上下文切换”而损害并行性的加速,并且以不同速度运行的进程线程的潜在副作用。这是真的?

非常感谢!

4

1 回答 1

2

如果 CPU 只有 1 个核心,则该进程将无法通过多线程获得并行性的好处,因为该进程的总执行时间不会改变。这是真的吗?

仅当您 100% 受 CPU 限制时。如果您有 I/O 等待,即使在单个内核上,多个线程也会有很大帮助。

如果有多个内核可用,操作系统将在不同内核上均匀、公平地调度进程的线程

这似乎取决于操作系统的自由裁量权。可能涉及各种配额和优先事项。

由于同一核心上的线程之间的“上下文切换”,甚至可能会损害并行性的加速

管理额外线程确实存在开销(不仅在调度级别,而且在您的应用程序内同步和通信),如果这些线程不能有效地利用空闲的 CPU 内核,那么实际上可以使用更少的线程提高性能。

于 2014-11-18T02:49:28.293 回答