向量ALU运算(上)
向量ALU运算(上)
向量ALU指令(VALU)对64个线程中的每个线程的数据,执行算术或逻辑运算,并将结果写回VGPR、SGPR或EXEC掩码。
1. 微码编码
大多数VALU指令有两种编码:VOP3的64位和32位两种。使用64位指令并具有全方位的功能,使用32位编码中提供了一组有限的功能。一些指令仅在VOP3编码中可用。
当指令有两种微码格式时,由用户决定使用哪种。建议尽可能使用32位编码。
微码编码如下所示。
VOP2用于具有两个输入和一个向量目标的指令。带有进位的指令隐式地将进位写入VCC寄存器,如图5-14所示。

图5-14 VOP2用于具有两个输入和一个向量目标的指令
VOP1用于没有输入或只有一个输入和一个目的地的指令,如图5-15所示。

图5-15 VOP1用于没有输入或只有一个输入和一个目的地的指令
VOPC用于比较说明,如图5-16所示。

图5-16 VOPC用于比较说明
VOP3适用于最多有三个输入、输入修饰符(否定和绝对值)和输出修饰符的指令。VOP3有两种形式:一种使用标量目标字段(仅用于div_scale、整数加减);这被指定为VOP3b。所有其他指令都使用通用格式,即VOP3a。如图5-17所示。

图5-17 VOP3有两种形式:标量目标字段VOP3b和通用格式VOP3a
任何32位微码格式,都可以使用32位文字常量,但不能使用VOP3。
VOP3P用于使用打包数学的指令:对一对输入值执行操作,这些输入值打包到每个操作数的高16位和低16位中。将两个16位结果作为两个打包值写入单个VGPR。

图5-18 VOP3P用于使用打包数学的指令
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)缓冲区偏移量的计算方式不同,具体取决于缓冲区是线性寻址(简单的结构数组计算)还是混乱的。
    人工智能芯片与自动驾驶
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号