CANN/asc-devkit系统缓存概述

发布时间:2026/7/16 23:03:07
CANN/asc-devkit系统缓存概述 # 系统缓存概述【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitCache类型Cache缓存的主要作用是在搬运单元或Scalar单元与外部存储之间提供一层高速缓冲以降低数据访问延迟并提高带宽利用率。通常情况下被频繁访问的数据会写入Cache搬运单元或Scalar单元在执行过程中优先从Cache中读取数据当Cache未命中时再从外部存储加载数据并更新到Cache中。表1展示了不同类型的Cache的功能不同产品中支持的Cache类型不同具体情况如下以NPU架构版本3510为例图1展示了AI Core中支持的五类CacheL2 Cache、DCache、ICache、SIMT DCache、NDDMA Cache在硬件架构中的位置关系。图1五类Cache在AI Core中的位置关系示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/atlas_950_cache_architecture_diagram.png atlas_950_cache_architecture_diagram?utm_sourcegitcode_repo_files)以NPU架构版本2201为例图2展示了AI Core中支持的三类CacheL2 Cache、DCache和ICache在硬件架构中的位置关系。图2三类Cache在AI Core中的位置关系示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/atlas_a2_a3_cache_architecture_diagram.png atlas_a2_a3_cache_architecture_diagram?utm_sourcegitcode_repo_files)表1Cache类型及功能说明Cache类型说明L2 CacheL2 Cache作为二级缓存专门用于存储频繁访问的数据和指令以便减少对GM的读写。•通过MTE2单元读取GM时优先从L2 Cache中读取数据当L2 Cache未命中时再从GM加载数据并更新到L2 Cache中。•通过Scalar单元读取GM时优先从DCache中读取数据当DCache未命中时再从L2 Cache中读取数据。当L2 Cache也未命中时再从GM加载数据并更新到L2 Cache和DCache中。•通过Scalar单元读取GM指令时优先从ICache中读取指令当ICache未命中时再从L2 Cache中读取指令。当L2 Cache也未命中时再从GM加载指令并更新到L2 Cache和ICache中。DCacheDCacheData Cache用于缓存Scalar单元近期可能被重复访问的数据段。通过Scalar单元读取GM时优先从DCache中读取数据当DCache未命中时再从L2 Cache中读取数据。当L2 Cache也未命中时再从GM加载数据并更新到L2 Cache和DCache中。ICacheICacheInstruction Cache用于缓存Scalar单元最近使用或频繁使用的指令。通过Scalar单元读取GM指令时优先从ICache中读取指令当ICache未命中时再从L2 Cache中读取指令。当L2 Cache也未命中时再从GM加载指令并更新到L2 Cache和ICache中。SIMT DCacheSIMT访问GM需要经过SIMT DCache中转。数据流经由GM到SIMT DCache再从SIMT DCache到SIMT寄存器SIMT DCache充当中间缓冲层减少对GM的直接访问次数。NDDMA CacheNDDMA Cache用于缓存最近或即将被多维数据搬运DataCopy.md)接口搬运的数据。Cache操作及使用场景表2介绍了缓存的四种基础操作及其核心功能。表2Cache操作及功能说明操作名称功能说明Prefetch硬件根据访问模式自动将预期访问的数据提前加载到缓存提升后续访问速度。Preload软件通过显式指令将指定数据主动加载到缓存为即将到来的读写操作做准备。Invalid•将指定地址范围的Cache Line缓存的最小操作单元标记为“无效”使其从缓存中移除。•保证下一次访问这些内存地址时会从GM重新加载数据而不是使用可能过期的缓存数据。•注意Invalid操作不检查缓存行是否为“脏”dirty表示该数据已被修改但尚未写回到GM若存在脏数据将被直接丢弃。Clean将缓存中被修改过的数据脏数据写回到GM中避免数据丢失。Clean操作不将缓存行标记为“无效”缓存行仍保持有效状态。Cache写策略与Cache一致性问题当向GM写入数据并且启用Cache时存在以下两种Cache写策略延迟写回Write-Back和直写Write-Through。当向GM写数据时采取延迟写回策略工作原理如下开发者预期向GM写入数据即期望数据直接写入GM硬件实际行为是当数据被修改时只在缓存中更新数据。缓存中的数据标记为“脏”。当该Cache Line被替换时或通过软件显式执行Clean操作时数据才会被写回GMCache Line何时被替换由硬件决定。替换Cache Line数据时当缓存空间不足需要替换数据时检查被替换的数据是否为“脏”。如果是“脏”数据先将其写回到GM然后再将该Cache Line替换出缓存。当向GM写入数据时若采用直写Write-Through策略其工作原理如下开发者预期向GM写入数据即期望数据直接写入GM硬件实际行为是当数据被修改时立即在缓存和GM中更新数据。缓存行无需标记为“脏”。替换Cache Line数据时由于每次写数据都同步更新GM因此缓存中的数据不存在“脏”状态也无需在替换时额外写回GM。在延迟写回策略下被修改的数据仅更新在本地缓存中不会立即同步到GM。当其他核读取GM上同一地址时获取的将是过时数据从而导致不同核间缓存数据不一致。 Cache一致性是多核中确保数据正确性的核心机制。简单来说当多个核各自拥有独立的Cache时它们可能同时缓存相同的数据。如果某个核修改了缓存中的数据其他核的缓存副本就会变得“过时”如果不及时同步就会导致多个核间的数据不一致进而引发计算错误。下面介绍不同产品中每种类型Cache是否需要考虑多核间数据不一致针对NPU架构版本3510该产品支持的五类Cache在多核间数据一致性方面的情况如下L2 Cache多核间共享的缓存因此不需要考虑多核间数据不一致的问题。DCache多核独立缓存因此需要考虑多核间数据一致性的问题。ICache只读因此不需要考虑多核间数据不一致的问题。NDDMA Cache多核独立缓存因此需要考虑多核间数据一致性的问题。SIMT DCache在SIMT中写入数据时会立即写入GM不存在一致性问题从GM读取数据时多核独立缓存需要考虑多核间数据一致性的问题。针对NPU架构版本2201支持的三类Cache在多核间数据一致性方面的情况如下L2 Cache多核间共享的缓存因此不需要考虑多核间数据不一致的问题。DCache多核独立缓存因此需要考虑多核间数据一致性的问题。ICache只读因此不需要考虑多核间数据不一致的问题。缓存控制接口汇总表3按照Cache类型L2 Cache、DCache、ICache、NDDMA Cache汇总了与缓存控制相关的接口及其功能说明。表3缓存控制接口汇总Cache类型接口名称功能简述L2 CacheSetL2CacheHint读写GM的数据都默认被缓存在L2 Cache默认启用L2 CacheSetL2CacheHint能够设置GlobalTensor是否启用L2 Cache。DCacheDataCachePreloadDataCachePreload接口从源地址所在的特定GM地址预加载数据到DCache中每次调用只能预加载一个Cache Line大小的数据。DCacheDataCacheCleanAndInvalid当Scalar单元访问GM时使用该接口刷新Cache保证Cache的一致性使用场景如下•读取GM的数据但该数据可能在外部被其余核修改此时需要使用DataCacheCleanAndInvalid接口直接访问GM获取最新数据。•用户通过Scalar单元写GM的数据希望立刻写出也需要使用DataCacheCleanAndInvalid接口。DCacheReadGmByPassDCache.md)/WriteGmByPassDCache.md)不经过DCache向GM地址上读/写数据。使用场景•当多个核写入的数据落在同一条Cache Line内时经过DCache的读写将以64B为粒度可能引发多核数据随机覆盖问题。使用该接口不经过DCache直接按操作数大小读/写GM可避免此问题。•使用该接口不经过DCache直接向GM读/写数据可避免由DCache缓存引发的多核间数据不一致问题。ICacheICachePreLoad.md)开发者手动调用ICachePreLoad接口能够从指令所在GM地址预加载指令到ICache中。ICacheGetICachePreloadStatus.md)GetICachePreloadStatus为调试接口在调用ICachePreLoad后调用用于获取ICache的PreLoad的状态。当返回值为0时说明ICache的PreLoad已完成当返回值为1时说明ICache的PreLoad未完成。NDDMA CacheNdDmaDci在使用多维数据搬运DataCopy.md)接口进行数据搬运前需要使用NdDmaDci接口刷新NDDMA Cache缓存保证为最新状态。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考