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

如何用C语言编写程序来测量缓存的速度?,c,caching,C,Caching,编写一个程序,并尝试比较(如果可以的话,测量)从主存和缓存访问数据的时间 如果你能做到这一点,那么如何测量每一级缓存的速度呢?你需要提出一种启发式方法,强制100%(或非常接近)的缓存未命中(希望你有一个缓存失效操作码?)和100%的缓存命中率。万岁,这适用于1级缓存。现在,如何对级别2和级别3执行相同的操作 说真的,如果没有连接到CPU和内存的特殊硬件和跟踪,可能没有一种方法可以100%可靠地实现这一点,但我会这样做: 在内存中的一个位置写入“一串”内容-足以确保它始终命中一级缓存并记录时间(

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


如果你能做到这一点,那么如何测量每一级缓存的速度呢?

你需要提出一种启发式方法,强制100%(或非常接近)的缓存未命中(希望你有一个缓存失效操作码?)和100%的缓存命中率。万岁,这适用于1级缓存。现在,如何对级别2和级别3执行相同的操作

说真的,如果没有连接到CPU和内存的特殊硬件和跟踪,可能没有一种方法可以100%可靠地实现这一点,但我会这样做:

在内存中的一个位置写入“一串”内容-足以确保它始终命中一级缓存并记录时间(这会影响缓存,所以请小心)。您应该在没有分支的情况下执行这组写入操作,以尝试消除分支预测的不一致性。那是最好的时间。现在,每隔一段时间,将缓存线的数据写入RAM中已知位置末尾的一个随机遥远位置,并记录新的时间。希望这需要更长的时间。继续记录不同的时间,希望你能看到一些倾向于分组的计时。这些组中的每一个都“可以”显示L2、L3和内存访问计时的计时。问题是还有太多其他的东西挡着路。操作系统可能会切换你的上下文并破坏你的缓存。一个中断可能会出现,并通过你的计时关闭。会有很多东西会把这些价值抛诸脑后。但是,希望你能从数据中得到足够的信号,看看它是否有效

在一个更简单的嵌入式系统上,如果操作系统(如果有的话)不会妨碍您的话,这可能会更容易做到。

看一下:

Cachegrind模拟程序如何与计算机的缓存交互 层次结构和(可选)分支预测器。它模拟一台机器 具有独立的一级指令和数据缓存(I1和D1), 由统一的二级缓存(L2)支持。这完全符合标准 许多现代机器的配置

看看这些有趣的问题,它们之间有某种关联:


  • 这通常需要对缓存的“几何体”及其其他方面有所了解。除了用户对系统的简单访问和依赖于实现的事情之外,对系统进行一些控制也很有帮助,例如比通过标准C
    clock
    机制提供的更好的定时

    以下是一个初步方法:

    • 编写一个例程,该例程获取指向内存的指针、长度和重复次数,并以连续顺序重复读取所有内存
    • 编写一个例程,该例程获取指向内存的指针、长度和重复次数,并以连续顺序重复写入所有内存
    • 上述例程可能必须将其指针转换为
      volatile
      ,以防止编译器优化否则无效的访问
    • 分配大量内存
    • 调用上面的每个例程,获取每次调用之前和之后的当前时间,并使用各种长度调用以查看不同长度的时间
    当您这样做时,通常会看到较小长度的高速(每秒读取/写入的字节数)和较长长度的低速。当超过不同级别缓存的大小时,速度会降低。因此,您很可能会在使用上述技术收集的数据中看到一级缓存和二级缓存的大小

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

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

    这是否可行?缓存不在您的控制之下,您无法知道何时从何处加载数据。(好的,也许您可以跟踪缓存未命中,但我猜跟踪开销会混淆结果。)也许使用寄存器和mmap?但这似乎非常主观(除此之外,计算机上还运行其他进程)。听起来像是应该在硬件层面上做的事情;否则,就我所见,其他线程/进程/操作系统的东西将成为阻碍,如果我用C定义一个大数组,当我访问该数组中的一个元素时,该元素周围的数据似乎存储在缓存中。因此,如果我从头到尾访问数组,它将比随机访问(访问每个元素一次)更快——这是真的,但我不知道这是缓存或其他方式的结果。也许你应该相信你可以从缓存中检索元素,非常快…Google for cache benchmarking将产生无数点击量,包括一些备受尊敬的缓存基准测试程序。啊,如果模拟的质量好,那么模拟可能是一个更好的选择