我是一年级博士生。学生(研究助理)。我正在尝试提高缓存和 DRAM 之间的传输速率。为此,我计划集成一种良好的压缩技术(或其他一些技术)来减少数据大小(不是现在的主要任务)。但是,我找不到或不知道任何工具可以为我提供缓存行或块格式的缓存数据。我想分析缓存数据来了解零和一的比率。
我只使用 Intel Pintool 来收集一些痕迹,但它的工作方式在我看来,如果我修改 C++ 代码以包含缓存模拟器(我自己的),它不会给出正确的结果。
所以我想做的是从缓存中收集缓存块数据,可能是在空闲时间,也可能是在某些应用程序运行时。如果有人在相同的背景下工作过,或者知道可以给我结果的工具或可以给我相同结果的某种方式,我将不胜感激。我使用的是 Linux 操作系统。
提前致谢!
真正的 x86 硬件不允许您查询哪些缓存线是热门的,或读取缓存内容+元数据。 读取缓存的唯一方法是从缓存的虚拟地址加载命中缓存的负载。 AFAIK,这也不是其他 ISA 中存在的功能。 (自从您提到 Intel Pin 以来,我假设 x86。)
您可能想在 GEM5 这样的模拟器中运行实验,因此您可以在模拟器中(在被模拟的客户计算机之外)添加仪器/数据收集。 GEM5 可能具有类似于实际现代 CPU 的逐出/替换/分配策略和硬件预取器行为的配置。
回复:您的压缩想法,我想您应该拥有元数据,以便发出不可压缩数据的信号,因此在最坏的情况下(随机性等高熵数据,或者已经压缩或加密的数据),一个 64 字节缓存线仍然可以缓存对应64字节内存。 但是,是的,对于可压缩行,也许每行有两个标签以允许 2:1 压缩? 程序使用小型 32 位或 64 位整数的情况并不罕见,因此信息内容相当低,简单的快速压缩方案在某些情况下可以很好地工作。 (就像 RLE,或者寻找可表示为 i16 或 u16 的每个 32 位块,具有并行编码/解码的 Varint,如
pdep
/pext
硬件,或者指针情况下的公共前缀......我当然你有自己的想法,我只是听到这个想法后觉得很有趣。)
我猜你最希望在 L2 和 L3 缓存中进行压缩,因为 L1d 需要以字节粒度(或至少字 RMW)读取甚至更新,并且需要低延迟和多端口。