【问题标题】:Using more software threads than CPUs = oversubscribing?使用比 CPU 更多的软件线程 = 超额订阅?
【发布时间】:2019-08-27 22:09:15
【问题描述】:

lscpu 的输出给出(包括部分输出):

CPU(s):                12
On-line CPU(s) list:   0-11
Thread(s) per core:    1
Core(s) per socket:    6
Socket(s):             2
NUMA node(s):          2

我只是想确认一下我的理解是正确的:

(1) 我有 12 个 CPU/内核。这个数字也是我拥有的硬件线程数。

(2) 如果 (1) 为真,例如,我运行的代码使用了超过 12 个 SOFTWARE 线程,这将导致超额订阅。假设我使用 13 个软件线程,这是否意味着我的 1 个软件线程不能与其他 12 个软件线程同时运行?

【问题讨论】:

  • 是的。当您有 12 个可用内核时使用 13 个线程将保证并非所有内核都可以同时运行。他们怎么可能?如果所有内核都在使用,额外的线程会在什么情况下同时运行?
  • 不,每个核心 2 个线程不会为您提供 24 个 CPU。您仍然有 12 个 CPU,每个 CPU 运行 2 个线程。在 CPU 上运行两个线程不会神奇地导致 CPU 数量成倍增加。它为您提供在 12 个内核上运行的 24 个线程,其中每个内核在其正在执行的线程之间进行上下文切换。它仍然是一个核心。我目前的机器上有 12 个内核,根据 Windows 任务管理器,这 12 个内核正在执行 3156 个线程,但我仍然只有 12 个内核。
  • 那篇文章指的是特定的东西。来自帖子:CPU 是您在运行 htop 时看到的 (这些不等同于物理 CPU) 我不知道您在编写 时是什么意思硬件线程;线程通常在软件中实现并在硬件(CPU 内核)上执行。我的笔记本电脑中有一个 Xeon 处理器,每个内核有 6 个物理内核 x 2 个逻辑处理器,这意味着我的机器上实际上有 12 个内核 (CPU)。 Windows 表示这 12 个内核正在执行超过 3000 个线程,这显然意味着它们并非全部同时运行。
  • 你不明白它的好处吗?当我的操作系统(Windows 10 64 位)在 12 个逻辑 CPU 上执行 3000 多个线程(正在做的事情)时,看到的好处如何?如果它被限制为每个 CPU 一个线程并且一次只能做 12 件事情,你认为会发生什么?滚动、屏幕更新、在您的网络浏览器中同时加载多个选项卡、文件下载等都是不可能的。想想运行一个游戏,如果它必须在单线程上运行,它会如何运作。想想这个站点,每个 CPU 只有一个线程。它一次可以支持多少用户?
  • 我从来没有说过关于硬件线程的事情。你继续使用这个词。我以前从未听说过。线程在软件中实现,并在 CPU 内核上执行。如果每个内核使用多个线程,则涉及上下文切换(CPU 必须为一个线程保存信息,切换到另一个(加载任何上下文信息),执行该线程,保存上下文,然后切换回第一个线程。如果你有 12 个内核,它们都可以同时运行(每个内核一个)。如果你有 13 个,一个内核必须执行两个线程,正如我刚刚描述的那样。我所说的只是看看而已。

标签: multithreading parallel-processing gpu core


【解决方案1】:

我认为存在一些术语混淆。我认为您的意思是并行性,因为并发性不是并行性(它是一个更广泛的概念),这意味着系统可以同时执行多个任务的多任务处理。这可以通过纯并行、抢占式多任务或协作多任务来实现,但它们都只是并发的形式。从逻辑上讲,多线程执行可以表示为具有任意顺序的细粒度活动的单线程序列,无论我们在单个内核或单个线程中执行所有任务,这仍然会带来并发问题。因此,您系统上的所有 13 个或更多线程(具有 12 个硬件线程)将同时运行,但只有 12 个将并行运行。

附带说明,硬件线程或逻辑 CPU 不是逻辑软件线程,而是 CPU 内核可以通过 Hyper-Threading 同时执行的执行流的数量,因此它们也提供并行性,但有一些限制(但在您的情况下每个核心都有一个逻辑 CPU,所以没有超线程)。

【讨论】:

  • 我不知道两者之间有区别。我想我指的是并行性。在我给出的示例中,我猜这意味着 13 个线程同时运行,12 个并行运行?
  • 另外,你知道是不是很多人用并发来表示并行?我觉得我看到很多帖子都使用“并发”这个词,而正确的词可能是“并行”,
  • 刚刚在 quora quora.com/… 上看到了这个问题。根据第一个答案,看来我上面评论的答案是肯定的。
  • @lamanon,并行是并发的一种形式,这就是为什么您可能已经看到以这种方式提到它的原因。至于您的第一条评论,是的,这就是我在上面的答案中强调的内容。
  • 进程有或没有共享内存的事实不会影响它们的并发性。每个计算过程都有时间的起点和终点。如果流程在其执行的任何时期都有时间线交叉点,则称它们同时运行(即使此交叉点是通过时间切片或任何其他技术“人工”模拟的)。
猜你喜欢
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多