编写程序并尝试比较(测量,如果可以)从主存和缓存访问数据的时间。
如果你能做到这一点,那么如何衡量每个级别缓存的速度?
这通常需要一些关于缓存的“几何”及其它方面的知识。 除了简单的用户访问系统和依赖于实现的事情(例如比通过标准C clock
机制提供的更精细的时序)之外,对系统进行一些控制也是有帮助的。
这是一个初步的方法:
执行此操作时,通常会看到较小长度的较快速度(每秒读取/写入的字节数)以及较长的较慢速度。 当超过不同级别的高速缓存的大小时,将发生速度降低。 因此,您很可能会看到使用上述技术收集的数据中反映出L1和L2缓存的大小。
以下是一些方法不足的原因:
您需要提出一种启发式方法,强制100%(或非常接近)缓存未命中(希望您有缓存失效操作码?)和100%缓存命中。 Hooray,适用于1级缓存。 现在,如何对2级和3级做同样的事情?
严肃地说,如果没有连接到CPU和内存的特殊硬件和跟踪,可能没有办法100%可靠地完成这项工作,但这就是我要做的事情:
将一堆东西写入内存中的1个位置 – 足以让您确定它是否一致地命中L1缓存并记录时间(这会影响缓存,所以要小心)。 你应该在没有分支的情况下进行这组写操作,以试图摆脱分支预测的不一致性。 那是最好的时间。 现在,每隔一段时间,将一个缓存行的数据写入已知位置末尾的RAM中的随机远程位置并记录新时间。 希望这需要更长的时间。 在不同的时间继续进行此录制,希望您会看到几个倾向于分组的时间。 这些组中的每一个“都可以”显示L2,L3和存储器访问时序的时序。 问题是还有很多其他的东西妨碍了。 操作系统可以上下文切换你并搞砸你的缓存。 可能会出现中断并通过您的时间关闭。 会有很多东西可以抛弃这些价值。 但是,希望您在数据中获得足够的信号,看它是否有效。
这可能更容易在一个更简单的嵌入式系统上进行,其中操作系统(如果有的话)不会妨碍你。
看一下cachegrind-valgrind :
Cachegrind模拟程序与机器的缓存层次结构和(可选)分支预测器的交互方式。 它模拟具有独立的第一级指令和数据缓存(I1和D1)的机器,由统一的二级缓存(L2)支持。 这与许多现代机器的配置完全匹配。
看看他们以某种方式相关的好问题:
需要了解更多c/c++开发分享如何用C编写程序来测量缓存的速度?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如何用C编写程序来测量缓存的速度?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979594.html