c - 使用Intel的PIN工具来计算程序中缓存命中/未命中的次数

标签 c caching memory instrumentation intel-pin

我一直在尝试编写一个 pintool 来检测给定程序中的缓存命中和未命中情况。 我发现有INS_IsMemoryRead/Write等调用来判断指令是否是LD/ST。

  • 有没有办法确定指令是否命中或未命中缓存?
  • 如果是这样,是否还可以获得从缓存/内存中获取数据所花费的周期数?

最佳答案

这两件事都不可能做到。

pin自带的缓存工具“Memory”是一个非常简单的缓存功能模拟器。换句话说,通过使用缓存工具,我们可以根据缓存组织(例如大小、路数、缓存级别)查看/模拟应用程序可能有多少缓存未命中。通过编写一些简单的代码,就可以报告发生缓存未命中的指令,然后将这些指令映射回源代码。然而,即使缓存模拟器配置为与真实系统具有相同的缓存组织,缓存模拟的命中/未命中结果也可能与真实计算机系统不同或对应。

此外,缓存工具的另一个限制是它是单线程的。您不能将其用于多线程应用程序。

此外,不可能获得任何计时信息,例如处理缓存未命中所需的周期数。这非常依赖于体系结构,我不知道有什么工具可以从真实系统提供此信息。相反,人们使用 CPU 时序模拟器。 CPU 时序模拟器示例为 Gem5 http://www.gem5.org/和基于 PtlSim 的 Marss http://marss86.org/ .

关于c - 使用Intel的PIN工具来计算程序中缓存命中/未命中的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127802/

相关文章:

c++ - 使用动态参数 boost 内存池

c - C中的内存映射文件

c - 为什么 sizeof unsigned char array[10] 是 10

asp.net - SqlCacheDependency 是否使用轮询或查询通知?

c - 使用 strcat 时如何防止 char 数组被 for 循环覆盖

.net - dotnet System.Web.Caching.Cache 与 System.Runtime.Caching.MemoryCache

sql-server-2005 - 从SQL表缓存计数的最佳方法?

security - 明确从内存中删除敏感数据?

c - 假设我们有一个非常大的结构在分配时占用巨大的内存空间

c - Sscanf 没有给我一个值