我正在努力更好地了解应该在n个内核上运行多少个线程。我知道这是一个复杂的问题,其答案取决于许多因素,例如共享状态有多少,以及每个线程的资源睡眠和等待时间。
为简化起见,假设我们有2个内核,只有一个进程可以将其工作划分为没有共享状态的线程。假设每个线程只是在计算后执行计算,没有休眠,也没有等待资源。在这种情况下,理想的线程数是2吗?
让我们稍微复杂一点,并说线程必须做某种磁盘I / O.这如何改变我们的答案?在这种情况下,我认为我们可以有超过2个核心。
或者假设他们没有睡觉或等待资源,而是有一些他们都有权访问的内存需要同步。这如何改变我们的答案?我认为在这种情况下,我们实际上可能更喜欢1个线程而不是2,这取决于需要多少同步。
答案 0 :(得分:2)
在一般事项中,这是一个难以回答的问题。这实际上取决于具体情况。要记住的是,进行上下文切换需要花费成本 - 如果你只进行计算,那么在一个核心上运行2个线程将是浪费(因为你不会真正获得任何东西 - 只会在上下文切换中丢失)。另一方面,如果您正在等待资源并且同时可以继续进行其他计算,那么让线程等待这些资源不会使整个执行滞后。
答案 1 :(得分:2)
说到IO,你不会考虑每个核心的线程。您考虑每个物理设备的线程。每个设备都有不同的最佳DOP(磁盘= 1,SSD至少4,网络更高)。
对于CPU绑定工作,最佳数量为1(每个核心)。
在混合情况或情况比较复杂的情况下,不能给出一般答案。系统可以以令人惊讶的方式运行(例如在负载下崩溃!)。这里的方法是测试不同的DOP并使用最好的。一般来说,只有一个最优,而1和无穷大的表现要差得多。所以你只需要找到单个最大值就可以了。