常见问题

如何理解BPU内存Cache?

本小节中,我们提供了内存管理函数 hbUCPMallocCachedhbUCPMalloc 来分配DDR读写内存。 其中 hbUCPMallocCached 表示分配可以被cache的内存,并配套了 hbUCPMemFlush 函数来对Cache进行刷新。

Cache机制是由计算平台的内存架构来决定的,详细参考如下图所示。CPU与主存之间存在的Cache会缓存数据,而BPU/DSP/JPU/VPU/PYRAMID/STITCH/GDC等其他后端硬件与主存之间则没有cache。此时若错误使用Cache将会直接影响最终数据读写的准确性和效率。

runtime_dev_faq
  • 当CPU写完数据后,需要主动将Cache中的数据flush到memory中,否则其他硬件访问同一块内存空间时可能会读取到之前的旧数据。

  • 而当其他后端硬件写完数据后,CPU在访问之前也需要主动将Cache中的数据invalidate掉,否则CPU可能会优先读取到之前缓存在cache中的旧数据。

  • 在模型连续推理过程中,模型输出建议申请带Cache的内存,以加速CPU反复读写的效率,而模型输入如果不需要经过CPU读,可以申请非Cache的内存。

理解BPU内存中的物理地址和虚拟地址?

在J6计算平台架构中,所有硬件的DDR内存共享,通过 hbUCPMallocCachedhbUCPMalloc 接口可以申请到一段物理空间连续的内存,其函数返回值被包装在 hbUCPSysMem 数据结构体中, phyAddrvirAddr 两个字段分别对应其内存空间的物理地址和虚拟地址。由于这段内存空间是连续的,所以物理地址和虚拟地址都可以通过首地址进行表示和读写。 但是在实际使用过程中,建议优先使用虚拟地址,非必须场景请勿直接使用物理地址。