设置合理的L2 CacheMode
【优先级】高

该性能优化指导适用于如下产品型号:
Atlas A3 训练系列产品 /Atlas A3 推理系列产品 Atlas A2 训练系列产品 /Atlas 800I A2 推理产品 /A200I A2 Box 异构组件
【描述】L2 Cache常用于缓存频繁访问的数据,其物理位置如下图所示:
L2 Cache的带宽相比GM的带宽有数倍的提升,因此当数据命中L2 Cache时,数据的搬运耗时会优化数倍。通常情况下,L2 Cache命中率越高,算子的性能越好,在实际访问中需要通过设置合理的L2 CacheMode来保证重复读取的数据尽量缓存在L2 Cache上。
L2 Cache访问的原理及CacheMode介绍
数据通过MTE2搬运单元搬入时,L2 Cache访问的典型流程如下:
数据通过MTE3或者Fixpipe搬运单元搬出时,L2 Cache访问的典型流程如下:
从上面的流程可以看出,当数据访问总量超出L2 Cache容量时,AI Core会对L2 Cache进行数据替换。由于Cache一致性的要求,替换过程中旧数据需要先写回GM(此过程中会占用GM带宽),旧数据写回后,新的数据才能进入L2 Cache。
开发者可以针对访问的数据设置其CacheMode,对于只访问一次的Global Memory数据设置其访问状态为不进入L2 Cache,这样可以更加高效的利用L2 Cache缓存需要重复读取的数据,避免一次性访问的数据替换有效数据。
设置L2 CacheMode的方法
Ascend C基于GlobalTensor提供了SetL2CacheHint接口,用户可以根据需要指定CacheMode。
考虑如下场景,构造两个Tensor的计算,x的输入Shape为(5120, 5120),y的输入Shape为(5120, 15360),z的输出Shape为(5120, 15360),由于两个Tensor的Shape不相等,x分别与y的3个数据块依次相加。该方案主要为了演示CacheMode的功能,示例代码中故意使用重复搬运x的实现方式,真实设计中并不需要采用这个方案。下文完整样例请参考设置合理L2 CacheMode样例。
实现方案 |
原始实现 |
优化实现 |
||||
---|---|---|---|---|---|---|
实现方法 |
总数据量700MB,其中:x:100MB;y:300MB;z:300MB。 使用40个核参与计算,按列方向切分。 x、y、z 对应GlobalTensor的CacheMode均设置为CACHE_MODE_NORMAL,需要经过L2 Cache,需要进入L2 Cache的总数据量为700MB。 |
总数据量700MB,其中:x:100MB;y:300MB;z:300MB。 使用40个核参与计算,按列方向切分。 x对应的GlobalTensor的CacheMode设置为CACHE_MODE_NORMAL;y和z对应的GlobalTensor的CacheMode设置为CACHE_MODE_DISABLE。只有需要频繁访问的x,设置为需要经过L2 Cache。需要进入L2 Cache的总数据量为100MB。 |
||||
示例代码 |
|
|