测量 ARM Cortex-A15 的缓存访问时间/周期
Measure cache access time/cycles for the ARM Cortex-A15
所以我测量了访问ARM Cortex-A15的L2缓存的周期。我通过分配一个字节和
- 使地址无效
- 阅读 PMCCNTR 登记册
- 使用 LDR 访问分配字节的内存位置
- 再次读取 PMCCNTR 寄存器
- 从第二个测量值中减去第一个测量 值
访问大约有 ~240 个周期,非缓存访问有 ~350 个周期。我还使用了ISB,DMB和DSB。这些数字对您来说听起来准确吗?我似乎找不到官方资源进行比较。也许你可以为我指出正确的方向。
您不是在用您的方法测量延迟,而是在测量开销。
测量延迟的标准方法是使用指针追踪测试,初始化指针链以获得依赖访问,并控制它们的位置,以便它们适合(或不适合)指定大小的缓存。 其余过程相同,只是您不使任何内容无效。
像这样的东西(用于说明,未经测试)
// prepare a chain of N pointers in a buffer
// Assume unsigned int has the same size as a pointer
unsigned int Buffer[N] ;
// chain them, here in a simple direct fashion.
// You can also use a randomized sequence if you work in main memory
for (i=1; i<N; i++) { Buffer[i] = (unsigned int) &(Buffer[i-1]) ; }
// close the chain
Buffer[0] = (unsigned int) &(Buffer[N-1]) ;
// measure M accesses
Start = PMCCNTR() ;
p = &(Buffer[0]) ;
for (i=M; i>0; i--) {
p = *p;
}
Stop = PMCCNTR();
由于测量开销和随机干扰,测量单个访问会受到不准确性的影响。您应该测量大量访问的时间,以获得能够更好地反映所需内容的摊销延迟。要测量平均访问时间,您还需要确保这些访问不是并行运行的(这将测量吞吐量,而不是延迟),因此添加一些虚假依赖项,例如将以前访问的字节的内容添加到下一个地址(在将所有这些字节初始化为零之后)。
另外,您没有说您是如何使地址无效的,但我猜您也将其从 L2 中扔了出来,实际上只是在测量内存延迟。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- time_t的时钟周期和获取时间问题
- 查询时间/周期是针对所有内核/线程的序列化请求还是并行请求?
- 如何以尽可能低的时间复杂度检测网格中的周期
- 一段时间后,C++应用程序占用100%的cpu周期
- 测量 ARM Cortex-A15 的缓存访问时间/周期
- 就时间复杂度而言,在另一个字符串中找到最小周期字符串是否可以更快
- C++得到一个标准::时间::d的周期
- 在linux中,与动态调用相关的时钟周期中程序的意外执行时间
- 如何在 visual c++ 中以 ns、ps 或 clk 周期为单位测量执行时间
- 接受std::chrono::任何表示/周期的持续时间