【发布时间】:2020-03-15 22:29:43
【问题描述】:
我试图找出对 C++ 程序进行基准测试的最佳方法,并希望模拟与基准测试部分相关的数据存在于缓存中和冷时两种情况。
是否有一种可靠的方法可以在 x86-64 机器上强制执行好的和坏的缓存局部性,作为测试运行的准备形式,假设它所涉及的数据是已知的?
【问题讨论】:
-
您将在连续访问内存时获得良好的缓存命中率。如果您知道缓存大小,则可以在一个缓存行中访问尽可能多的元素。对于糟糕的缓存命中率,您可以只使用对内存的随机访问。这几乎肯定会每次都破坏缓存。还有很多事情需要考虑,但问题太宽泛,无法深入到每一个细节。
-
在运行前让缓存变热很容易:首先进行热身运行。无论如何,您都应该这样做以避免很多不良影响。例如Idiomatic way of performance evaluation? 描述了许多陷阱。循环一个不同的大数组通常会从缓存中驱逐大多数其他数据。
-
测试“缓存”场景的典型做法是运行一次测试函数并丢弃测量数据,然后开始实际测试。当然,这并不完美,因为函数本身可能会使自己的缓存无效。其次,要测试“冷”场景,请确保通过加载一堆数据来毒化缓存。这是极少数情况之一,您可能会发现
std::list很有用。 -
您尝试过 cachgrind 吗? valgrind.org/docs/manual/cg-manual.html
标签: c++ x86-64 benchmarking cpu-cache microbenchmark