gpt4 book ai didi

multithreading - 如何在 4 核 CPU : 4 threads or 50 threads? 上更快地进行相同的计算

转载 作者:行者123 更新时间:2023-12-04 10:55:43 28 4
gpt4 key购买 nike

让我们假设我们有固定数量的计算工作,没有阻塞、 sleep 、I/O 等待。工作可以很好地并行化——它由 100M 小而独立的计算任务组成。

什么是 4 核 CPU 的速度更快 - 运行 4 个线程或......比方说 50?为什么第二个变种应该是 slover 以及多少 slover?

正如我所假设的:当您在 4 核 CPU 上运行 4 个重线程而没有其他消耗 CPU 的进程/线程时,调度程序可以根本不在内核之间移动线程;在这种情况下没有理由这样做。 Core0(主 CPU)将负责执行硬件定时器每秒 250 次的中断处理程序(Linux 基本配置)和其他硬件中断处理程序,但其他内核可能不会有任何担心。

上下文切换的成本是多少?为不同的上下文存储和恢复 CPU 寄存器的时间? CPU 内部的缓存、管道和各种代码预测的东西呢?我们可以说每次切换上下文时,都会伤害 CPU 中的缓存、管道和一些代码解码设施吗?因此,与串行执行相比,在单个内核上执行的线程越多,它们一起执行的工作就越少?

关于多线程环境中的缓存和另一个硬件优化的问题现在对我来说是一个有趣的问题。

最佳答案

正如@Baile 在评论中提到的,这是高度特定于应用程序、系统和环境的。

因此,我不会采取强硬的方法来为每个核心提及 1 个线程。 (或在超线程情况下为 2 个线程/核心)

作为一名经验丰富的共享内存程序员,我从我的经验中看到,最佳线程数(对于 4 核机器)的范围可以从 1 到 64+。

现在我将列举可能导致这个范围的情况:

最佳线程 < 核心数

在某些非常细粒度的并行任务(例如小型 FFT)中,线程的开销是主要的性能因素。在某些情况下,并行化根本没有帮助。在某些情况下,您可以通过 2 个线程获得加速,但在 4 个线程时会向后扩展。

另一个问题是资源争用。即使您有一个高度并行化的任务,可以轻松地跨 4 个内核/线程拆分,您也可能会受到内存带宽和缓存效应的限制。通常,您会发现 2 个线程与 4 个线程一样快。 (就好像非常大的 FFT 经常出现这种情况一样)

最佳线程数 = 内核数量

这是最佳情况。无需在这里解释 - 每个核心一个线程。大多数非内存或 I/O 限制的令人尴尬的并行应用程序都适合这里。

最佳线程数 > 核心数

这就是它变得有趣的地方……非常有趣。你听说过负载不平衡吗?过度分解和窃取工作怎么样?

许多可并行化的应用程序是不规则的——这意味着任务不会分成大小相等的子任务。因此,如果您最终可能将一个大型任务拆分为 4 个不相等的大小,请将它们分配给 4 个线程并在 4 个内核上运行它们......结果?并行性能很差,因为 1 个线程碰巧比其他线程获得了 10 倍的工作量。

这里的一个常见解决方案是将任务过度分解为许多子任务。您可以为它们中的每一个创建线程(所以现在您可以获得线程 >> 核心)。或者您可以使用某种具有固定线程数的任务调度程序。并非所有任务都适合这两种任务,因此,对于 4 核机器,将任务过度分解为 8 或 16 个线程的方法通常会提供最佳结果。

虽然产生更多线程可以带来更好的负载平衡,但开销也会增加。所以通常在某处有一个最佳点。我已经看到 4 个内核上高达 64 个线程。但如前所述,它是高度特定于应用程序的。你需要试验。

编辑:扩展答案以更直接地回答问题...

What is the cost of context switching? The time for store and restore CPU registers for different context?



这非常依赖于环境 - 并且有些难以直接测量。简答: 很贵 This might be a good read.

What about caches, pipelines and various code-prediction things inside CPU? Can we say that each time we switch context, we hurt caches, pipelines and some code-decoding facilities in CPU?



简答: 当您切换上下文时,您可能会刷新管道并弄乱所有预测器。与缓存相同。新线程很可能会用新数据替换缓存。

不过有一个问题。在线程共享相同数据的某些应用程序中,一个线程可能会为另一个传入线程或共享相同缓存的不同内核上的另一个线程潜在地“加热”缓存。 (虽然很少见,但我以前在我的一台 NUMA 机器上见过这种情况 - 超线性加速:16 核上 17.6 倍!?!?!)

So more threads executing on a single core, less work they can do together in comparison to their serial execution?



取决于,取决于...除了超线程之外,肯定会有开销。但是我读过一篇论文,其中有人使用第二个线程来预取主线程......是的,这很疯狂......

关于multithreading - 如何在 4 核 CPU : 4 threads or 50 threads? 上更快地进行相同的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9183476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com