Multithreading 关闭“超线程读取”时的最佳线程数

Multithreading 关闭“超线程读取”时的最佳线程数,multithreading,context-switch,hyperthreading,cpu-cores,Multithreading,Context Switch,Hyperthreading,Cpu Cores,我有一个问题,我试图找到答案,但从我找到的所有信息中,我变得更加困惑-不幸的是,无法得到一个明确的答案 那么,假设我有一台关闭了超读功能的计算机 在我编写的程序中应该使用的最佳线程数是多少 我知道,如果我的程序不是100%受CPU限制的(处理IO),那么最佳线程数将是每个内核多于一个线程——因为我将有多个线程在等待,而拥有更多线程(不会因为上下文切换开销过多)对这类程序来说会更好 但是,如果我的程序是100%受CPU限制的-每个内核一个线程是最佳的? 我很困惑,因为有更多的线程,这意味着每个线程

我有一个问题,我试图找到答案,但从我找到的所有信息中,我变得更加困惑-不幸的是,无法得到一个明确的答案

那么,假设我有一台关闭了超读功能的计算机

在我编写的程序中应该使用的最佳线程数是多少

我知道,如果我的程序不是100%受CPU限制的(处理IO),那么最佳线程数将是每个内核多于一个线程——因为我将有多个线程在等待,而拥有更多线程(不会因为上下文切换开销过多)对这类程序来说会更好

但是,如果我的程序是100%受CPU限制的-每个内核一个线程是最佳的? 我很困惑,因为有更多的线程,这意味着每个线程可能获得更大的切片时间-这可以提高性能


谢谢

对于没有超线程的纯CPU负载,答案始终是每个核心1个线程

启用HT后,每个HT核心的线程数可能少于一个,因为线程争夺同一个缓存。但通常,即使在这里,每个HT核一个线程也是最好的

对于IO工作负载,它要复杂得多,但这不适用于这里

因为有更多的线程,这意味着每个线程可能获得更大的切片时间

我不确定我是否明白这个道理。操作系统将以循环方式大致向线程分发时间片。时间片为4-40ms,其大小不随线程数的变化而变化


理想情况下,当线程数完全正确时,就没有上下文切换。添加的线程越多,上下文切换就越多。

我没有明确的答案,但您可以始终对程序进行基准测试。如果不知道工作负载,就无法回答。如果所有线程都在运行,那么更多线程意味着更小的部分和更大的开销。好的,谢谢!关于大片段时间,这是对我的误解。你说如果HT是在每个核心1个线程上,通常是最好的?我希望它实际上是2个(当两个线程可以一起运行时)。否则,如果共享缓存问题太大,为什么要使用HT呢?如果您有4x2内核,则运行8个线程(通常)。共享缓存工作正常,只是它现在需要容纳两个线程的数据。这可能根本不会导致任何问题,也可能导致性能下降。我认为退化是一种罕见的边缘情况。当然,最安全的方法是尝试两种方法和基准测试。您甚至可以在客户机器上运行自动的5秒基准测试。