开发者
资源
[object Object]
[object Object]

【优先级】高

【描述】SIMT访问Global Memory的粒度为128B,在随机访问Global Memory中的数据时,访存效率较低。当所需访问的数据量远小于最大可用Unified Buffer空间(256KB - 系统预留8KB - 最小Dcache 32KB)时,可以使用SIMD搬运接口将数据从Global Memory搬运到Unified Buffer,使SIMT编程能够直接从Unified Buffer读取数据,从而提高内存访问效率,提升算子的整体性能。

【样例介绍】以SIMD与SIMT混合编程方式实现的gather算子为例,该算子从长度为8192的一维向量中获取指定索引的65536个数据。通过将输入数据预先搬运到Unified Buffer中,提高离散内存访问的效率,从而提升算子的整体性能。

表 1 算子规格

[object Object][object Object]

[object Object]

SIMT线程层次结构为:

  • 线程块数:64
  • 单个线程块中线程数:1024

完整样例请参考

【反例】

SIMT随机访问Global Memory上的input数据,触发数据加载到Dcache,随机访存效率低,代码如下。

[object Object]

【正例】

使用SIMD接口将数据从Global Memory搬运到Unified Buffer,基于SIMT编程方式直接从Unified Buffer读取数据,访存效率远高于读取Global Memory上的数据,代码如下。

[object Object]

【性能对比】

下图为反例的流水图,线程中有两条SIMT_LDG指令,对应表示从Global Memory上加载数据,其中第二条指令占用区间分布不均,指令启动时间差异明显,同一个线程块中随机访问输入数据input,单次访存加载128B数据,而针对单精度浮点数,实际有效数据仅为4B,导致访存效率低。

图 1 反例指令流水图(仿真数据)[object Object][object Object]

下图为反例的内存负载分析图,L2 Cache到Dcache数据传输带宽为10.04GB/s。

图 2 反例内存负载分析(上板数据)[object Object][object Object]

下图为正例的流水图,只有一条占用大区间的SIMT_LDG指令,MTE2流水新增搬运指令MOV_SRC_TO_DST_ALIGNv2。

图 3 正例指令流水图(仿真数据)[object Object][object Object]

下图为正例的内存负载分析图,L2 Cache到Dcache数据传输带宽降低为1.61GB/s,L2 Cache到Unified Buffer数据传输带宽提升至12.93GB/s。

图 4 正例内存负载分析(上板数据)[object Object][object Object]

对比算子运行时间,反例约为4.56us,正例约为3.57us,整体性能提升约21.71%。

图 5 反例算子运行时间(上板数据)[object Object][object Object]

图 6 正例算子运行时间(上板数据)[object Object][object Object]