开发者
资源

内存层级

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. 静态内存:从内存的起始地址分配一段指定大小的内存空间,其大小在编译时确定,不可动态修改,开发者通过数组分配申请使用。该方式将在后续版本中支持
    1
    __ubuf__ half staticBuf[1024];
    
  2. 动态内存:位于静态内存之后,通过<<<>>>中参数dynUBufSize指定的动态内存大小空间,可通过使用动态数组分配。该方式将在后续版本中支持
    extern __ubuf__ char dynamicBuf[];
  3. 预留空间:编译器和Ascend C预留空间,大小固定为8KB。
  4. Data Cache:SIMT专有的Data Cache空间,其内存大小受用户配置的静态和动态内存大小影响。DataCache = UB总大小(256KB) - 静态内存 - 动态内存 - 预留空间(8KB)。用户需要合理配置静态和动态内存大小,以确保DataCache大于或等于32KB。

静态内存分配、动态内存的动态数组分配方式目前开发中,将在后续版本中支持,请关注后续版本。

  • 若DataCache小于32KB,会出现校验报错。
  • SIMT场景,算子开发不能使用全部的Unified Buffer空间,除了预留8KB空间外,还需至少为SIMT预留32KB的Data Cache空间。