4

我试图更好地了解应该在 n 个内核上运行多少线程。我知道这是一个复杂的问题,其中的答案取决于许多因素,例如有多少共享状态,以及每个线程有多少睡眠和等待资源。

为简化起见,假设我们有 2 个内核和一个进程,可以将其工作划分为没有共享状态的线程。假设每个线程只是在计算后执行计算,没有睡眠,也没有等待资源。在这种情况下,理想的线程数是 2 吗?

让我们把事情复杂一点,说线程必须执行某种磁盘 I/O。这如何改变我们的答案?我认为在这种情况下我们可以拥有超过 2 个内核。

或者假设他们不做任何睡眠或等待资源,而是有一些他们都可以访问的内存需要同步。这如何改变我们的答案?我认为在这种情况下,我们实际上可能更喜欢 1 个线程而不是 2 个线程,具体取决于需要多少同步。

4

2 回答 2

2

这是一个在一般问题上很难回答的问题。这实际上取决于案件中的更多细节。要记住的是,进行上下文切换是有成本的——如果你只是在做计算,那么在一个内核上运行 2 个线程是很浪费的(因为你不会真正获得任何东西——只会在上下文切换中丢失)。另一方面,如果您正在等待资源并且同时可以继续进行其他计算,那么最好让线程等待这些资源,以免整个执行滞后。

于 2013-03-03T20:19:03.973 回答
2

当谈到 IO 时,您不会考虑每个内核的线程数。您考虑每个物理设备的线程数。每个单独的设备都有不同的最佳 DOP(磁盘 = 1,SSD 至少 4,网络要高得多)。

对于 CPU 密集型工作,最佳数量是 1(每个核心)。

在混合的情况下或比这更复杂的情况下,无法给出一般性的答案。系统可以以令人惊讶的方式运行(例如在负载下崩溃!)。这里的方法是测试不同的 DOP 并使用最好的。通常,只有一个最优值,而 1 和无穷大的性能要差得多。所以你只需要找到一个非常容易的最大值。

于 2013-03-03T20:30:21.117 回答