在《计算机工程》2025年2月第2期中《基于国产加速器的三维卷积前向算子优化》(https://qikan.cqvip.com/Qikan/Article/Detail?id=7200337573 )提到了使用汇编指令的优化技巧
请问这几条指令(buffer_load、buffer_load_dwordx4、buffer_store)要怎么使用?参数是什么?调用格式是什么?哪里可以找到相关文档呢?
你提到的 buffer_load、buffer_load_dwordx4、buffer_store 属于GPU 底层汇编指令,主要用于 AMD 的 GCN(Graphics Core Next)或 RDNA 架构的 GPU 编程(如 ROCm 生态中的底层优化),用于访问内存缓冲区(Buffer)中的数据。这些指令是硬件级别的操作,通常由编译器(如 HIPCC、Clang)从 OpenCL、HIP 等高级语言自动生成,手动编写需深入了解 GPU 架构细节。
这些指令的核心功能是在 GPU shader 核心与内存缓冲区之间进行数据传输,具体用途和参数如下:
1. buffer_load(缓冲加载指令)
用途:从指定的内存缓冲区加载数据到 GPU 寄存器。
核心参数:
dst:目标寄存器(加载的数据存放的位置,通常是向量寄存器v[0..255])。
src0:缓冲描述符(Buffer Descriptor),存放缓冲区的基地址、格式、范围等信息(通常存放在s[0..1023]系统寄存器中)。
src1:偏移量(Offset),相对于缓冲区基地址的字节偏移(可以是立即数或寄存器)。
fmt:数据格式(可选),指定加载数据的类型(如dword=32 位整数,float=32 位浮点数等)。
addr:寻址模式(可选),如是否使用相对寻址、边界检查等。
调用格式示例(GCN 架构语法):
buffer_load v0, s[0:3], v1, fmt=dword, addr64 ; 从s[0:3]描述的缓冲区中,以v1为偏移加载32位数据到v0
2. buffer_load_dwordx4(四字加载指令)
用途:一次加载 4 个 32 位数据(共 128 位,即一个 “向量”)到寄存器,效率高于单次加载,适合向量运算。
dst:目标向量寄存器(通常是连续的 4 个寄存器,如v0:3表示 v0、v1、v2、v3)。
src0:缓冲描述符(同buffer_load,存放在s寄存器中)。
src1:偏移量(同buffer_load,字节偏移)。
addr:寻址模式(如addr64表示 64 位地址)。
调用格式示例:
buffer_load_dwordx4 v0:3, s[4:7], v2, addr64 ; 从s[4:7]描述的缓冲区中,以v2为偏移加载4个32位数据到v0-v3
3. buffer_store(缓冲存储指令)
用途:将 GPU 寄存器中的数据存储到指定的内存缓冲区。
src0:源寄存器(要存储的数据,通常是v寄存器)。
src1:缓冲描述符(同前,s寄存器)。
src2:偏移量(相对于缓冲区基地址的字节偏移)。
fmt:数据格式(指定存储数据的类型)。
addr:寻址模式。
buffer_store v0, s[0:3], v1, fmt=dword, addr64 ; 将v0中的32位数据存储到s[0:3]描述的缓冲区,偏移为v1
具体可以参考amd的文档
你提到的 buffer_load、buffer_load_dwordx4、buffer_store 属于GPU 底层汇编指令,主要用于 AMD 的 GCN(Graphics Core Next)或 RDNA 架构的 GPU 编程(如 ROCm 生态中的底层优化),用于访问内存缓冲区(Buffer)中的数据。这些指令是硬件级别的操作,通常由编译器(如 HIPCC、Clang)从 OpenCL、HIP 等高级语言自动生成,手动编写需深入了解 GPU 架构细节。
这些指令的核心功能是在 GPU shader 核心与内存缓冲区之间进行数据传输,具体用途和参数如下:
1. buffer_load(缓冲加载指令)
用途:从指定的内存缓冲区加载数据到 GPU 寄存器。
核心参数:
dst:目标寄存器(加载的数据存放的位置,通常是向量寄存器v[0..255])。
src0:缓冲描述符(Buffer Descriptor),存放缓冲区的基地址、格式、范围等信息(通常存放在s[0..1023]系统寄存器中)。
src1:偏移量(Offset),相对于缓冲区基地址的字节偏移(可以是立即数或寄存器)。
fmt:数据格式(可选),指定加载数据的类型(如dword=32 位整数,float=32 位浮点数等)。
addr:寻址模式(可选),如是否使用相对寻址、边界检查等。
调用格式示例(GCN 架构语法):
buffer_load v0, s[0:3], v1, fmt=dword, addr64 ; 从s[0:3]描述的缓冲区中,以v1为偏移加载32位数据到v0
2. buffer_load_dwordx4(四字加载指令)
用途:一次加载 4 个 32 位数据(共 128 位,即一个 “向量”)到寄存器,效率高于单次加载,适合向量运算。
核心参数:
dst:目标向量寄存器(通常是连续的 4 个寄存器,如v0:3表示 v0、v1、v2、v3)。
src0:缓冲描述符(同buffer_load,存放在s寄存器中)。
src1:偏移量(同buffer_load,字节偏移)。
addr:寻址模式(如addr64表示 64 位地址)。
调用格式示例:
buffer_load_dwordx4 v0:3, s[4:7], v2, addr64 ; 从s[4:7]描述的缓冲区中,以v2为偏移加载4个32位数据到v0-v3
3. buffer_store(缓冲存储指令)
用途:将 GPU 寄存器中的数据存储到指定的内存缓冲区。
核心参数:
src0:源寄存器(要存储的数据,通常是v寄存器)。
src1:缓冲描述符(同前,s寄存器)。
src2:偏移量(相对于缓冲区基地址的字节偏移)。
fmt:数据格式(指定存储数据的类型)。
addr:寻址模式。
调用格式示例:
buffer_store v0, s[0:3], v1, fmt=dword, addr64 ; 将v0中的32位数据存储到s[0:3]描述的缓冲区,偏移为v1
具体可以参考amd的文档
https://www.amd.com/content/dam/amd/en/documents/radeon-tech-docs/instruction-set-architectures/vega-7nm-shader-instruction-set-architecture.pdf