向量ALU运算(下)

2. 缓冲区寻址
缓冲区是内存中的一种数据结构,用索引和偏移量进行寻址。索引指向特定的步长字节记录,偏移量是记录字节偏移量,见表5-6。步幅来自资源,索引来自VGPR(或零),偏移来自SGPR或VGPR,也来自指令本身,见表5-7。
表5-6 用于寻址的缓冲指令字段

字段

大小

说明

inst_offset

12

指令的字面字节偏移量

inst_idxen

 

1

布尔值:为真时从VGPR获取索引,为假时不获取索引

inst_offen

 

1

布尔值:为真时从VGPR获取偏移量,为假时不获取偏移量。inst_offset是存在的,与这个位无关

表5-7 来自GPR的地址组件

字段

大小

说明

SGPR_offset

 

32

地址的无符号字节偏移量。来自SGPR或M0

VGPR_offset

 

32

可选的无符号字节偏移量。它是每个线程的,来自VGPR

VGPR_index

 

32

一个可选的索引值。它是每个线程的,来自VGPR

最终缓冲存储器地址由三部分组成:
1)缓冲区资源的基址(V#)。
2)SGPR的偏移。
3)缓冲区偏移量的计算方式不同,具体取决于缓冲区是线性寻址(简单的结构数组计算)还是混乱的。
    线性缓冲器的地址计算,如图5-19所示。
 
图5-19 线性缓冲器的地址计算
3. 旋转缓冲区寻址
旋转寻址重新排列缓冲区中的数据,以帮助为结构数组提供更好的缓存位置。旋转寻址还需要与Dword对齐的访问。单个fetch指令不能尝试获取大于const元素大小的单位。缓冲区的STRIDE必须是element_size的倍数。
Index = (inst_idxen ? vgpr_index: 0) +
  (const_add_tid_enable ? thread_id[5:0]: 0)
Offset = (inst_offen ? vgpr_offset: 0) + inst_offset
index_msb = index / const_index_stride
index_lsb = index % const_index_stride
offset_msb = offset / const_element_size
offset_lsb = offset % const_element_size
buffer_offset = (index_msb * const_stride + offset_msb *
  const_element_size) * const_index_stride + index_lsb *
  const_element_size + offset_lsb
Final Address = const_base + sgpr_offset + buffer_offset
记住,sgpr_offset不是上述方程中offset项的一部分。
4. 原始缓存
    原始缓冲器架构,如图5-20所示。
 
图5-20 原始缓冲器架构
5. 旋转缓冲器
const_index_stride=8
//将多少个连续的索引组合在一起
const_element_size=4 bytes
//单个元素的大小,以字节为单位
index_msb=index/const_index_stride
index_lsb  =index%const_index_stride
offset_msb=offset/const_element_size
offset_lsb  =offset%const_element_size
Buffer_offset=(index_msb*const_stride+offset_msb*const_element_size)*const_index_stride+index_lsb*const_element_size+offset_lsb
简化为…
Buffer_offset=(index/8*const_stride+(offset/4)*4)*8+index%8*4+offset%4
注意,由于处理的是双字,offset%4始终为==0。
旋转缓冲器架构,如图5-21所示。
 
图5-21 旋转缓冲器架构
另一种可视化旋转缓冲区的方法,如图5-22所示。
 
图5-22可视化旋转缓冲区的方法
6. 内存缓冲区加载到LDS
MUBUF指令格式允许将数据从内存缓冲区直接读取到LDS中,而无需通过VGPR。以下MUBUF指令子集支持此功能。
LDS_offset=从M0[15:0]开始的16位无符号字节偏移。
Mem_offset=SGPR(SOFFSET SGPR)的32位无符号字节偏移。
idx_vgpr=vgpr(位于VADDR)的索引值。(如果idxen=0,则为零。)
off_vgpr=vgpr(位于VADDR或VADDR+1)的偏移值。(如果offn=0,则为零。)
显示了LDS和内存地址计算的组件,如图5-23所示。
 
图5-23 LDS和内存地址计算的组件
只有当资源(T#)的ADD_TID_ENABLE字段设置为1时,才会添加TIDinWave,而LDS会添加它。MEM_ADDR M0位于VDATA字段中,指定M0。
posted @ 2025-04-02 16:35  吴建明wujianming  阅读(23)  评论(0)    收藏  举报