运行的第一个基准测试如何始终导致更低的延迟?

How does the first benchmark ran always results in lower latency?

提问人:avernus 提问时间:9/7/2023 更新时间:9/7/2023 访问量:44

问:

我有一个多线程应用程序,我试图通过更改哪些线程应绑定到哪些内核来提高性能。

首先,我有一些预处理步骤来找出所谓的理想线程到核心映射。

在此之后,我通过写入巨大的缓冲区来破坏数据缓存,这有效地驱逐了存储在缓存中的当前数据。然后,我运行基线基准测试。对于这个基准测试,如果有线程,线程将绑定到从 to 开始的核心,没有什么花哨的。我测量基准测试的经过时间。n0n - 1

除此之外,在运行第二个据称优化的基准测试之前,我再次破坏了数据缓存。我称之为“优化”,因为我将根据预处理对内核进行自定义线程绑定,我暂时不会详细介绍。我再次测量了“优化”基准测试的经过时间。

结果,“优化”基准测试被证明更慢。没关系,没问题。也许我的优化降低了性能。但随后我交换了基准运行顺序,并首先运行优化的运行顺序。然后优化版本变得更快。这里的模式是,无论我先运行哪个基准测试,它都会更快。我不知道这怎么可能。为什么会这样?

我没有在每个基准测试之前执行数据缓存回收步骤,而是尝试进行缓存预热,但相同的模式仍然存在。我还尝试让主线程在每个基准测试之间休眠,结果仍然相同。

每个基准测试的运行时间约为 2.5 秒,速度更快,导致执行延迟降低约 20%。我尝试运行此应用程序至少 20 次。

OS: CentOS-7
Server: Intel Cascade Lake with 56 cores, 2 sockets. 28 cores in each socket. 
I bound my threads to even numbered cores that are located in the same socket 
in order not to get QPI involved (there is interthread communication in this specific application).
Compiler g++11
Compiled with -O3.
性能 CPU-Architecture Intel Benchmarking Microbenchmark

评论


答: 暂无答案