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.

[参考译文] TMS570LC4357:意外的性能监控单元数据缓存未命中计数器?

Guru**** 2478505 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672522/tms570lc4357-unexpected-performance-monitoring-unit-data-cache-miss-counter

器件型号:TMS570LC4357

重新打开 意外的性能监控单元数据缓存未命中计数 器讨论。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Franck:

    很抱歉,我今天无法回答你的问题。 我将研究您的问题、并尽快向您提出我的意见。 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 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 是如何对事件进行计数的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    数据缓存缺失定义为:

    从普通可高速缓存存储器读取或写入导致2级存储器系统重新填充的每个数据都会生成此事件。 对缓存行的每次访问都会导致新的换行器。

    我会做更多的调查。 很抱歉。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、

    感谢您的测试、让本主题保持活跃、并让我随时公布您的其他调查。

    弗朗克。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的耐心和理解。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将继续打开此主题以供进一步调查
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Franck、

    这就是我们从 ARM 获得的有关缓存未命中的信息:

    PMU 事件正在计数大量的写入指令、一个相似的、稍小的缓存行 强制执行数量、但是只有很少的缓存行故障。

    我怀疑产生这些数字的原因只是处理器内核只需要生成少量的线性故障。  

    当处理器内核写入完整的高速缓存时、首先处理器内核将根据第一个写入指令触发单个外部线性文件。  随后的写入指令将填充存储缓冲区、并且在换行器从外部存储器返回之前、写入指令很可能会写入到整个缓存行空间。  这意味着不再需要此换行器数据、并且可以在从内存系统返回时将其丢弃。  同时、指令将开始写入下一个 cacheline 位置、并再次触发 linefill。  如果外部存储器访问时间足够长、那么 Cortex-R5内核最终将具有最大数量的未完成线性故障、并且在其中一个未完成线性故障完成之前、它将无法再发布。  发生这种情况时、写入指令可以在发出新的换行符之前继续填充存储缓冲区。  如果写入指令可以填充完整的缓存线、则可以将其添加到缓存线位置、而无需触发外部线性文件、因此缓存位置会更新、而无需线性文件访问。

    这就是我怀疑在这个测试中发生的情况、Cortex-R5不需要发出大量的线性存取、因为存储指令在填充高速缓存位置而无需发出线性存取。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    感谢您的澄清、这在我的测试以 完全线性的方式填充高速缓存行时是完全有意义的。

    从性能的角度来看、这种优化实际上表现为缓存命中、因为线路被标记为脏、而无需支付外部存储 器访问的代价。

    再次感谢您的支持。

    此致、

    弗朗克。