我正在尝试估算多线程应用程序所需的工作量。对于真实的 CPU/核心来说,这是一个相当简单的任务,因为我可以从 proc 中获取 CPU 时间,这将估算出应用程序占用了多少 CPU。
但是启用 HT 的处理器呢?时间是如何计算的?如果线程只是在 HT 竞争的情况下等待处理器管道释放 - 它是否算作在 CPU 上花费的时间?或者如果线程可以利用 10% 的 HT 优势,它将计入实际 CPU 运行时间的 10%?
答案1
抱歉,但这很不确定。
如果启用了 HT,则每个核心有两个逻辑处理器。如果禁用它,则只有一个。(这让我们可以讨论调度程序的工作原理,而不必不断限定“CPU”的含义。)无论哪种方式,操作系统都会将逻辑处理器视为处理器,并且除了一些调度优化尝试*之外,操作系统不会通过、为了或由于超线程而做任何其他事情。
从 LP 上下文切换到线程到切换到其他线程,LP 被视为由该线程 100% 使用。操作系统无法知道 LP 中的线程是使用了 10% 的核心,还是 90% 的核心,或者由于其他 LP 中的线程正在执行某项操作而完全停止。操作系统只是认为它正在运行。
HT 也不执行任何类似线程优先级的操作。因此,如果两个线程试图在一个内核的两个 LP 中运行,并且其中一个线程在操作系统中被设置为比另一个线程更高的优先级,内核对此无能为力 - 它根本无法知道。内核将把这两个线程视为具有相同的优先级,并相应地分配微架构资源。
*优化:现代操作系统知道 LP 与内核的关系,并会尝试在每个内核中只使用一个 LP,直到超过核心数线程想要运行;就缓存投资而言,一个核心的两个 LP 被认为是等价的;等等。