超线程对低延迟开发有何影响

问题描述 投票:0回答:1

我读过一篇关于低延迟开发的文章,如下。

“我们总是避免(相对)较慢的语言功能,例如关键路径上的异常、内存分配和虚拟函数调用。I/O 在单独的线程上完成并通过消息队列触发。禁用超线程。我们准备尽可能多的内容提前布置尽可能多的数据,以最大限度地减少我们需要在关键路径上读取的缓存行数量”

我想知道为什么超线程在这件事上是一个缺点。

我在网上找不到任何相关的论点,并且总是认为“启用超线程后,现代 CPU 几乎不会变慢,因为操作系统在调度工作负载以释放内核方面相当有能力。”

cpu cpu-architecture low-latency hyperthreading
1个回答
0
投票

当另一个逻辑核心发生中断时,CPU 必须退出单线程活动模式。 (有一个 perf 事件

cpu_clk_unhalted.one_thread_active
计算 CPU 处于单线程模式的时间。)这需要一些时钟周期来至少部分耗尽 ROB(重新排序缓冲区),因为现代主流设计对其进行静态分区,并且一些其他资源。

ROB 在物理上是一个循环缓冲区,如果分区关心物理条目数组的分割位置,我不会感到惊讶,因此不一定只是让 ROB 耗尽一半容量的问题。 (这是我的猜测;也许按问题和退休进行的 ROB 索引中有足够的间接性,它们可以回绕到任意点。)

其他一些资源也是静态分区的,例如 L1iTLB(至少在 Sandybridge 中:https://www.realworldtech.com/sandy-bridge/3/)。因此,其他逻辑核心唤醒可能会驱逐一些 iTLB 条目并导致额外的延迟,可能是在该线程处于延迟关键的情况下。

存储缓冲区也是静态分区的,因此它也必须被耗尽,可能会等待缓存未命中存储完成其 RFO(读取所有权)并提交到 L1d 缓存。 (按照 x86 上的程序顺序,因为它具有强有序的内存模型。)


当然,当另一个线程处于活动状态时,运行速度会变慢,前端吞吐量只有一半,并且必须竞争一些无序的执行资源,或者只有其他线程的一半大小。仅在您想要低延迟的事情中间发生这种情况就会是一个问题。

L1d 和 L2 等缓存是竞争性共享的,因此该线程使用的数据可能会被其他逻辑核心随机逐出,即使只是唤醒运行计时器中断也是如此。

或者,如果系统负载很重,那么调度程序将开始在同一物理核心的两个逻辑核心上运行任务。

如果您从一开始就不想发生这种情况,只需禁用超线程即可。然后内核只需跟踪一半的核心数量。为一组您不想使用的核心复制所有每个 CPU 的内容是没有意义的。

另外,如果这是 Linux 或类似系统,则 RCU

run_on
必须依次为每个核心安排任务,以确保没有线程仍在等待访问您即将访问的内容的副本
free
。 IDK 如果
iso_cpus=4,5,6,7
可以使内核 0-3 的 SMT 兄弟不会发生这种情况,但同样,如果您不想使用这些内核,请首先让它们不存在。

您不必在 BIOS 中禁用 SMT,您只需使用

nosmt
启动即可让内核仅为每个物理核心启动一个逻辑核心。 (这就是文档听起来的意思;而不是没有检测到两个内核实际上是彼此的 SMT 兄弟这一事实,如果内核实际上完全不知道超线程,就会发生这种情况。)

SMT = 同时多线程,英特尔超线程的通用计算机架构术语。)

© www.soinside.com 2019 - 2024. All rights reserved.