内存层级
SIMT编程可使用的内存空间包含如下三种:
- 每个线程独立的寄存器和栈,用于存储局部变量。可用寄存器数量与线程块中线程数有关,具体支持情况请见下表。
表1 LAUNCH_BOUND的Thread数量与每个Thread可用寄存器数 Thread的个数(个)
每个Thread可用寄存器个数(个)
1025~2048
16
513~1024
32
257~512
64
1~256
127
- 线程块内所有线程共享的本地内存,即Unified Buffer。该内存区域由线程块内所有线程共同访问,且其生命周期和线程块一致。
- 所有线程均可直接访问的全局内存,即Global Memory。

Unified Buffer内存空间总大小为256KB,按功能划分为四个主要区域,从低地址向高地址依次为静态内存、动态内存、 预留空间、Data Cache。

具体结构如下:
- 静态内存:从内存的起始地址分配一段指定大小的内存空间,其大小在编译时确定,不可动态修改,开发者通过数组分配申请使用。该方式将在后续版本中支持。
1__ubuf__ half staticBuf[1024];
- 动态内存:位于静态内存之后,通过<<<>>>中参数dynUBufSize指定的动态内存大小空间,可通过使用动态数组分配。该方式将在后续版本中支持。
extern __ubuf__ char dynamicBuf[];
- 预留空间:编译器和Ascend C预留空间,大小固定为8KB。
- Data Cache:SIMT专有的Data Cache空间,其内存大小受用户配置的静态和动态内存大小影响。DataCache = UB总大小(256KB) - 静态内存 - 动态内存 - 预留空间(8KB)。用户需要合理配置静态和动态内存大小,以确保DataCache大于或等于32KB。
静态内存分配、动态内存的动态数组分配方式目前开发中,将在后续版本中支持,请关注后续版本。
- 若DataCache小于32KB,会出现校验报错。
- SIMT场景,算子开发不能使用全部的Unified Buffer空间,除了预留8KB空间外,还需至少为SIMT预留32KB的Data Cache空间。
父主题: AI Core SIMT编程