重新打开 意外的性能监控单元数据缓存未命中计数 器讨论。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
重新打开 意外的性能监控单元数据缓存未命中计数 器讨论。
尊敬的 Franck:
我今天做了很多测试(使用我自己的代码而不是 memset(..))) 并看到类似的结果:
bye write、byte read:1MB
2. 32位字的写入和读取
来自 EMIF 地址的//写入字节
void str_Bytes (uint32_t addr、uint32_t numBytes){
asm ("\tadd r1、r0、r1");
asm ("\tmov R2、#0");
asm ("copy_loop:");
asm ("\tstrb R2、[r0]、#1");
asm ("\tadd R2、R2、#1");
asm ("\ccmp r0、r1");
asm ("\tblt copy_loop");
}
//从 EMIF 地址读取字节
void LDR_bytes (uint32_t addr、uint32_t numBytes){
asm ("\t 添加 r1、r0、r1");
asm ("copy_loop1:");
asm ("\t ldrb r3、[r0]、#1");
asm ("\t CMP r0、r1");
asm ("\t blt copy_loop1");
}
读写时的数据缓存缺失值远小于预期值。 我不知道 PMU 是如何对事件进行计数的。
您好 Franck、
这就是我们从 ARM 获得的有关缓存未命中的信息:
PMU 事件正在计数大量的写入指令、一个相似的、稍小的缓存行 强制执行数量、但是只有很少的缓存行故障。
我怀疑产生这些数字的原因只是处理器内核只需要生成少量的线性故障。
当处理器内核写入完整的高速缓存时、首先处理器内核将根据第一个写入指令触发单个外部线性文件。 随后的写入指令将填充存储缓冲区、并且在换行器从外部存储器返回之前、写入指令很可能会写入到整个缓存行空间。 这意味着不再需要此换行器数据、并且可以在从内存系统返回时将其丢弃。 同时、指令将开始写入下一个 cacheline 位置、并再次触发 linefill。 如果外部存储器访问时间足够长、那么 Cortex-R5内核最终将具有最大数量的未完成线性故障、并且在其中一个未完成线性故障完成之前、它将无法再发布。 发生这种情况时、写入指令可以在发出新的换行符之前继续填充存储缓冲区。 如果写入指令可以填充完整的缓存线、则可以将其添加到缓存线位置、而无需触发外部线性文件、因此缓存位置会更新、而无需线性文件访问。
这就是我怀疑在这个测试中发生的情况、Cortex-R5不需要发出大量的线性存取、因为存储指令在填充高速缓存位置而无需发出线性存取。