微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Linux X86_64 中测试 Intel HyperThreading 的性能

如何解决如何在 Linux X86_64 中测试 Intel HyperThreading 的性能

我正在尝试弄清楚英特尔 HT 在 Linux X86_64 中的性能影响。
是否有众所周知的工具或现成的代码来进行此测试?
如果没有,我的测试计划如下,
场景一:
线程1:高优先级,运行在CoreN Thread0,休眠1秒。
线程2:中优先级,在CoreN Thread0中运行,增加一个整数计数器。

线程 3 和 4 与线程 1 和 2 相同,但会在 CoreN 线程 1 中运行。
1 秒后,线程 1 和 3 将分别打印线程 2 和 4 增加的计数器。

场景 2:
然后将线程3和4移动到不同的核心,运行1秒再次检查计数器。

期望场景 2 中整数加法的性能优于场景 1。

我的测试计划对检查英特尔 HT 性能影响是否合理?

解决方法

如果您的工作负载本质上是固定数量的线程,而不是物理内核的数量,那么您的测试方式可能是有意义的。因此,您需要将竞争同一内核(上下文切换)的 2 个线程与共享同一物理内核的逻辑内核的两个线程进行比较。

这不正常,大多数多线程工作负载可以将自己划分为可变数量的线程,因此您可以选择与您的内核匹配的线程数量。


通常您会使用 N 个线程执行类似 x265 的操作,其中 N 是您拥有的物理内核数。 (就像 ffmpeg -preset slow -c:v libx265 -x265-params pools=4 表示一个 NUMA 池的 4 核)。理想情况下,在启动时禁用 HT,或者让每个 HT 对的一个内核脱机,因此 Linux 永远不会将两个线程调度到同一个物理内核上。

然后使用 2N 个线程,让所有逻辑核心保持忙碌,因此看看扩展到更多线程是否有助于或损害您的工作负载的吞吐量。 (隐藏停顿与通过竞争缓存占用空间/内存带宽来创建更多停顿。)

在我的测试中,没有打扰离线内核,在带有双通道 DDR4-2666、1080p x265 编码的 i7-6700k Skylake 上,只需 pools=4 vs. pools=8 -preset 慢pools=8 与 pools=4 相比,速度提高了约 20%。

但是 8 个线程使用显着更多的内存带宽(根据 intel_gpu_top -l 显示集成的内存控制器读/写带宽),并且使交互使用明显更加缓慢。 (或者是因为对 L3 缓存的额外竞争,或者是因为没有空闲的逻辑内核来调度任务,或者两者兼而有之。)


或者,如果您想要基准测试以长时间相互运行两个简单的循环(而不是像 x265 或 BLAS SGEMM 这样的真实程序的指令组合,或者 {{ 1}} 编译或其他),那么是的,您可以编写简单的循环并在 make -j8 下运行它们,以查看现实是否与您从具有前端与后端的代码中预测的内容相匹配(尤其是不同的特定端口)与延迟瓶颈。

请参阅 https://stackoverflow.com/tags/x86/info,尤其是 https://agner.org/optimize/ - Agner 的微架构指南有相当详细的信息,说明 CPU 内核的不同部分如何在超线程之间共享。 (例如,ROB 和存储缓冲区是静态分区的,缓存和执行单元竞争性地共享,前端交替,除非一个线程停止。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。