如何用C编写程序来测量缓存的速度?

Say*_*iss 8 c caching

编写程序并尝试比较(测量,如果可以)从主存和高速缓存访​​问数据的时间.

如果你能做到,那么如何衡量每级缓存的速度?

Mic*_*gan 5

您需要提出一种启发式方法,强制100%(或非常接近)缓存未命中(希望您有缓存失效操作码?)和100%缓存命中.Hooray,适用于1级缓存.现在,如何对2级和3级做同样的事情?

严肃地说,如果没有连接到CPU和内存的特殊硬件和跟踪,可能没有办法100%可靠地完成这项工作,但这就是我要做的事情:

将一堆"东西"写入内存中的1个位置 - 足以让您确定它是一致地命中L1缓存并记录时间(这会影响缓存,所以要小心).你应该在没有分支的情况下进行这组写操作,以试图摆脱分支预测的不一致性.那是最好的时间.现在,每隔一段时间,将缓存行的数据写入已知位置末尾的RAM中的随机远程位置并记录新时间.希望这需要更长的时间.在不同时间继续进行此录制,希望您会看到几个倾向于分组的时间.这些组中的每一个"都可以"显示L2,L3和存储器访问时序的时序.问题是还有很多其他的东西妨碍了.操作系统可以上下文切换你并搞砸你的缓存.中断可能会出现并通过你的时间关闭.会有很多东西可以抛弃这些价值.但是,希望您在数据中获得足够的信号以查看它是否有效.

这可能更容易在一个更简单的嵌入式系统上进行,其中操作系统(如果有的话)不会妨碍你.


Eri*_*hil 3

这通常需要对缓存的 \xe2\x80\x9cgeometry\xe2\x80\x9d 及其其他方面有一些了解。除了简单的用户访问之外,对系统进行一些控制也很有帮助,以及依赖于实现的东西,例如比通过标准 Cclock机制提供的更精细的计时。

\n\n

这是一个初步的方法:

\n\n
    \n
  • 编写一个例程,获取指向内存的指针、长度和重复次数,并按连续顺序重复读取所有内存。
  • \n
  • 编写一个例程,获取指向内存的指针、长度和重复次数,并按连续顺序重复写入所有内存。
  • \n
  • 上述例程可能必须将其指针转换为 ,volatile以防止编译器优化掉否则无效的访问。
  • \n
  • 分配大量内存。
  • \n
  • 调用上面的每个例程,获取每次调用前后的当前时间,并以多种长度调用来查看不同长度的时间。
  • \n
\n\n

执行此操作时,您通常会看到小长度的速度较快(每秒读/写的字节数),而较长长度的速度较慢。当超出不同级别缓存的大小时,速度将会下降。因此,您很可能会看到使用上述技术收集的数据反映了 L1 和 L2 缓存的大小。

\n\n

以下是该方法不充分的一些原因:

\n\n
    \n
  • 它不控制用于读取或写入缓存的指令。C 编译器可以很好地生成加载字和存储字指令,但许多现代处理器具有一次可以加载和存储 16 个字节的指令,并且使用这些指令进行读写可能比使用四字节字指令更快。
  • \n
  • 顺序访问时缓存的行为与随机访问时的行为不同。大多数缓存都会尝试跟踪数据的使用时间,以便将最近使用的数据保留在缓存中,而其他数据则被丢弃。实际程序的访问部分通常与上述连续操作不同。
  • \n
  • 特别是,对内存的连续写入可能能够填充整个缓存行,因此不需要从内存中读取任何内容,而仅将一个字写入特定位置的实际使用模式可能必须通过读取来实现来自内存的缓存行并合并到已更改的字节中。
  • \n
  • 来自系统上其他进程的竞争将干扰缓存中的内容和测量。
  • \n
\n