我在linux上执行我的C ++代码。在我的代码中,有一个结构的大型2D数组。该阵列是随机访问的。我必须找到访问该2D阵列时发生的缓存未命中数。除了valgrind之外是否有任何其他解决方案(因为它需要花费太多时间来计算结果),这可以帮助我找到缓存未命中和缓存此数组的未命中率。
答案 0 :(得分:0)
通常,您的程序不仅访问2D数组,因此内存访问包括其他变量。它可能会产生一些影响,或多或少。
如果阵列访问是密集的(或封装的),也许您可以使用简单的模拟器来评估未命中率。
否则,您可能需要一些工具。我建议Pin,一个动态二进制检测工具,其原理类似于valgrind,而我认为开销是可以接受的,但你必须编写分析代码。
或者更好的选择是来自intel的性能分析工具Vtune,尝试缓存分析。不过,你需要一些时间来学习它。
答案 1 :(得分:0)
模拟缓存风险由于微小差异(在替换策略,协议等中)不会再现完全相同的行为。
更好的选择是分析代码 - 最简单的linux分析工具可能是perf。这里有一个相当不错的教程 - https://perf.wiki.kernel.org/index.php/Tutorial
另见 - Are there any way to profile cache miss in linux kernel?,它包含一个用于检查缓存性能的特定示例统计信息列表