我试图找出英特尔HT在Linux中的性能影响。
是否有一个非常熟悉的工具或现成的代码来进行这种测试?
如果没有,我的测试计划如下,
设想1:
线程1:高优先级,在CoreN Thread0中运行,睡眠1秒。
线程2:中间优先级,在CoreN Thread0中运行,增加一个整数计数器。
线程3和4与1和2相同,但将在CoreN Thread1中运行。
1秒后,线程1和3将分别打印由线程2和线程4增加的计数器。
设想2:
然后将线程3和4移动到不同的核心,运行1秒再次检查计数器。
期望的是,在场景2中添加整数的性能优于场景1。
这是我的测试计划是否合理,以检查英特尔HT性能影响?
发布于 2021-01-19 20:02:20
如果您的工作负载本身就是一个固定数量的线程(这比物理内核的数量还要多),那么您的测试方法可能是有意义的。因此,您需要比较两个竞争同一核心的线程(上下文切换)和两个共享同一物理核心的逻辑核心的线程。
这是不正常的,大多数多线程工作负载可以将自己划分为不同数量的线程,因此您可以选择与内核匹配的多个线程。
通常,您会使用N个线程执行类似于x265的操作,其中N是您拥有的物理核的数量。(就像一个由4个核组成的NUMA池的ffmpeg -preset slow -c:v libx265 -x265-params pools=4 )。理想情况下,在引导时禁用HT,或者将每个HT对的一个内核脱机,这样Linux就不会将两个线程调度到同一个物理内核上。
然后使用2N线程,使所有逻辑核都处于忙碌状态,因此查看扩展到更多线程是否有助于或损害工作负载的吞吐量。(通过竞争缓存占用空间/内存带宽,隐藏档位与创建更多档位。)
在我的测试中,在没有打扰离线内核的情况下,只有pools=4和pools=8在i7-6700 k Skylake上使用双通道DDR4-2666,1080 p x265编码在-preset慢一些的情况下,以pools=8和pools=4的速度提高了大约20%。
但是8个线程使用更多的内存带宽(根据intel_gpu_top -l显示集成内存控制器的读/写带宽),并且使得交互使用更加缓慢。(要么是由于L3缓存的额外竞争,要么是因为没有免费的逻辑核心来调度任务,或者两者兼而有之。)
或者,如果您希望_micro_benchmark长时间彼此运行两个简单的循环(而不是像x265或BLAS或make -j8编译之类的实际程序的指令组合),那么您可以编写简单的循环并在perf stat下运行它们,以查看实际情况是否符合您从具有前端和后端(特别是不同特定端口)的代码中预测到的结果。
请参阅https://stackoverflow.com/tags/x86/info,特别是https://agner.org/optimize/ -Agner的微弓指南有相当详细的信息,说明如何在超级线程之间共享CPU核心的不同部分。(例如,ROB和存储缓冲区是静态分区的,缓存和执行单元是竞争性共享的,前端交替使用,除非一个线程被停止。)
https://stackoverflow.com/questions/65788455
复制相似问题