高通 Hexagon V65 HVX 编程参考手册(7)

高通 Hexagon V65 HVX 编程参考手册(7)


5 指令组[表],指令系统

本章介绍六角处理器版本6的指令集。HVX指令类包括对5个12位或10个24位数据执行矢量操作的指令。
这些指令在指令类别中按字母顺序列出了。为每条指令提供了以下信息:
■ 指令名
■ 指令的简要描述
■ 高级功能描述(语法和行为)与所有可能的操作数类型
■ 指令类和槽信息分组指令包
■ 注意杂项问题
■ 任何C内在功能提供访问指令
■ 指令编码

5.1 hvx/全计算资源

HVX/ALL-计算资源指令子类包括使用一对HVX资源的ALU指令。

直方图

vhist指令使用了所有的HVX核心资源:寄存器文件、V0-V31和所有四个指令管道。该指令还需要四个执行数据包来完成。直方图指令的基本单位是一个128位宽的切片——可以有4个或8个切片,这取决于特定的配置。32个向量寄存器被配置为多个256个条目直方图,其中每个直方图箱的宽度为16位。这允许最多655个相同值的58位元素。每个直方图有128位宽,32个元素深,总共给出了256个直方图箱。从内存中读取向量并存储在寄存器文件之外的临时位置。然后将读取的数据平均分直方图。
例如:

字节0到15被描述为所有32个向量寄存器中的位0到127位,直方图0。字节16到31被描述为所有32个向量寄存器中的第128到255位,直方图1……。等等

这些字节将经过多个周期的处理,以更新直方图箱。对于每个直方图切片,使用128位切片中每个字节元素的下3位来选择16位的位置,而上5位则选择向量寄存器。然后,将寄存器文件条目增加1。

vhist是唯一一个占用所有管道和资源的指令。

在使用之前,如果要开始一个新的直方图,则必须清除矢量寄存器文件,否则将将当前状态添加到下一个数据的直方图中。

vhist支持与标准负载相同的寻址模式。此外,还有一个启用了字节的版本,可以选择在积累中使用的元素。

下图显示了位于源数据的位置2中的单个8位元素。这个值是124,分配给它的寄存器号是124 >> 3 = V15,而寄存器中的元素号是124和7 = 4。本例中的字节位置是2,它位于存储器输入线的前16字节中,因此数据影响寄存器文件的前128位宽切片。然后将16位直方图箱的位置增加1。每个64位的字节组影响各自的128位直方图切片。

对于64字节的向量大小,假设所有线程都在执行直方法,峰值总消耗为64(每个向量字节)/4(每个操作数据包)*4(线程)=,每个时程周期64字节。

在这里插入图片描述

在这里插入图片描述

Class: COPROC_VX (slots 0,1,2,3)

Encoding

在这里插入图片描述

加权直方图

vwhist指令使用了所有的HVX核心资源:寄存器文件、V0-V31和所有四个指令管道。该指令还需要四个执行数据包来完成。直方图指令的基本单位是一个128位宽的切片——可以有4个或8个切片,这取决于特定的配置。

32个向量寄存器被配置为vwhist256的多个256项直方图,其中每个直方图bin的宽度为16位。每个直方图有128位宽,32个元素深,总共给出了256个直方图箱。

对于vwhist128,32个向量寄存器被配置为多个128项直方图,其中每个直方图箱的宽度为32位。每个直方图有128位宽,16个元素深,总共有128个直方图箱。

从内存中读取向量并存储在寄存器文件之外的临时位置。该向量将用于索引的数据纳入直方图,以及权重。数据占据每个半字的偶数字节,权重每个半字的奇数字节。然后将读取的数据平均分直方图。

例如:

即使是字节0到15也被配置成所有32个向量寄存器中的0到127位,直方图0。
即使是字节16到31也被配置成所有32个向量寄存器中的128到255位,直方图1……。等等

这些字节将经过多个周期的处理,以更新直方图箱。对于vwhist256中的每个直方图切片,使用128位切片中每个偶数字节元素的下3位来选择16位的位置,而上5位则选择向量寄存器。

对于vwhist128中的每个直方图切片,使用128位切片中每个偶数字节元素的2:1位来选择32位位置,而上5位选择向量寄存器。再见的LSB就被忽略了。

然后,寄存器文件条目从奇数字节中按相应的权重递增。

和vhist一样,vwhist也占据了所有的管道和资源。

在使用之前,如果要开始一个新的直方图,则必须清除矢量寄存器文件,否则将将当前状态添加到下一个数据的直方图中。

vwhist支持与标准负载相同的寻址模式。此外,还有一个启用了字节的版本,可以选择在积累中使用的元素。

下图显示了源数据的8位元,字节位置3具有相应的权重。

在这里插入图片描述
这个值是124,分配给它的寄存器号是124 >> 3 = V15,而这个元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登记处的号码是124和7 = 4。本例中的字节位置是2,它位于存储器输入线的前16字节中,因此数据影响寄存器文件的前128位宽切片。然后,16位直方图箱位置由字节位置3的权重增加。每个64位的字节组影响各自的128位直方图切片。对于64字节的向量大小,假设所有线程都在执行直方法,峰值总消耗可以为64(每个向量字节)/4(数据包),每个时钟周期4(线程)=64字节。

Class: COPROC_VX (slots 0,1,2,3)
Encoding

在这里插入图片描述

5.2 hvx/alu-双资源

HVX/ALU-双资源指令子类包括使用一对HVX资源的ALU指令

预测操作
在两个向量谓词寄存器Qs和Qt之间执行位逻辑操作,并将结果放在Qd中。这些操作与元素大小无关。

实现了以下组合: Qs & Qt、Qs &!Qt, Qs | Qt, Qs | !Qt, Qs ^ Qt.从两个向量中交错谓词位,以匹配像vsat或vround这样的洗牌操作。可以使用匹配字对半字和半字到字节的变换的格式。

在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)

备注:

	此指令使用任意一对HVX资源(包括相乘或移位/排列)。

内部的

Qd4.b=vshuffe(Qs4.h,Qt4.h) HVX_VectorPred Q6_Qb_vshuffe_QhQh(HVX_VectorPred Qs, HVX_VectorPred Qt)
Qd4.h=vshuffe(Qs4.w,Qt4.w) HVX_VectorPred Q6_Qh_vshuffe_QwQw(HVX_VectorPred Qs, HVX_VectorPred Qt)
Qd4=and(Qs4,!Qt4) HVX_VectorPred Q6_Q_and_QQn(HVX_VectorPred Qs, HVX_VectorPred Qt)
Qd4=and(Qs4,Qt4) HVX_VectorPred Q6_Q_and_QQ(HVX_VectorPred Qs, HVX_VectorPred Qt)
Qd4=or(Qs4,!Qt4) HVX_VectorPred Q6_Q_or_QQn(HVX_VectorPred Qs, HVX_VectorPred Qt)
Qd4=or(Qs4,Qt4) HVX_VectorPred Q6_Q_or_QQ(HVX_VectorPred Qs, HVX_VectorPred Qt)
Qd4=xor(Qs4,Qt4) HVX_VectorPred Q6_Q_xor_QQ(HVX_VectorPred Qs, HVX_VectorPred Qt)

Encoding
在这里插入图片描述
组合

将两个输入向量寄存器组合成单个目标向量寄存器对。

使用标量谓词,有条件地将单个向量寄存器复制到目标向量寄存器中,或者有条件地将两个输入向量合并到目标向量寄存器对中。一个标量谓词保护着整个操作。如果标量谓词为真,则执行该操作。否则,该指令将被视为NOP。

在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)

注意:

■	此指令使用任何一对HVX资源(包括乘法或移位/排列)。

内部的

Vdd=vcombine(Vu,Vv) HVX_VectorPair Q6_W_vcombine_VV(HVX_Vector Vu, HVX_Vector Vv)

编码

在这里插入图片描述

在这里插入图片描述

车道内拖动

vshupoe同时执行和和运算,偶数元素放置在Vdd的偶数向量寄存器中,奇数元素放置在目标向量对的奇数向量寄存器中

在这里插入图片描述

在这里插入图片描述

Class: COPROC_VX (slots 0,1,2,3)

注意:

■	此指令使用任何一对HVX资源(包括乘法或移位/排列)。

内部的

Vdd.b=vshuffoe(Vu.b,Vv.b) HVX_VectorPair Q6_Wb_vshuffoe_VbVb(HVX_Vector Vu, HVX_Vector Vv)
Vdd.h=vshuffoe(Vu.h,Vv.h) HVX_VectorPair Q6_Wh_vshuffoe_VhVh(HVX_Vector Vu, HVX_Vector Vv)

在这里插入图片描述

交换

基于向量谓词寄存器中的谓词位,如果设置该位,则将向量寄存器的相应字节放置在Vdd的偶数目标向量寄存器中,将Vv的字节放置在Vdd的偶数目标向量寄存器中。否则,将Vv中对应的字节写入偶数寄存器,将Vu写入奇数寄存器。该操作可以使用字节进行工作,因此它可以处理所有的数据大小。它类似于vmux操作,但将相反的情况输出放到目标向量寄存器对的奇数向量寄存器中。

在这里插入图片描述
在这里插入图片描述

Class: COPROC_VX (slots 0,1,2,3)

注意:

■	此指令使用任何一对HVX资源(包括乘法或移位/排列)。

内部的

在这里插入图片描述
编码

在这里插入图片描述
标志/零扩展

对Vu中的每个偶数元素进行符号扩展,并将其放在偶数目标向量寄存器Vdd[0]中。奇数元素被符号扩展,并放置在奇数目标向量寄存器Vdd[1]中。字节被转换为半字,半字被转换为单词。

单词的符号扩展是一种交叉车道操作,只能在排列槽上执行。

在这里插入图片描述
对Vu中的每个偶数元素执行零扩展,并将其放在偶数目标向量寄存器Vdd[0]中。奇元素被零扩展,并放置在奇目标向量寄存器Vdd[1]中。字节被转换为半字,半字被转换为单词。

单词的零扩展是一个交叉车道操作,只能在排列槽上执行。

在这里插入图片描述
在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)

注意:

■ 此指令使用任何一对HVX资源(包括乘法或移位/排列)

内部的
Vdd.h=vsxt(Vu.b) HVX_VectorPair Q6_Wh_vsxt_Vb(HVX_Vector Vu)
Vdd.uh=vzxt(Vu.ub) HVX_VectorPair Q6_Wuh_vzxt_Vub(HVX_Vector Vu)
Vdd.uw=vzxt(Vu.uh) HVX_VectorPair Q6_Wuw_vzxt_Vuh(HVX_Vector Vu)
Vdd.w=vsxt(Vu.h) HVX_VectorPair Q6_Ww_vsxt_Vh(HVX_Vector Vu)

编码

在这里插入图片描述
算术运算

在两个向量Vu和Vv的元素之间执行简单的算术运算,加减。支持字、半字(有符号和无符号)和字节(有符号和无符号)。可选择饱和的单词和半字。对于无符号类型,总是保持饱和。

在这里插入图片描述
在这里插入图片描述
Class: COPROC_VX (slots 0,1,2,3)
注意:

■	此指令使用任何一对HVX资源(包括乘法或移位/排列)。

内部的

Vdd.b=vadd(Vuu.b,Vvv.b) | HVX_VectorPair Q6_Wb_vadd_WbWb(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.b=vadd(Vuu.b,Vvv.b):sat |HVX_VectorPair Q6_Wb_vadd_WbWb_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.b=vsub(Vuu.b,Vvv.b) |HVX_VectorPair Q6_Wb_vsub_WbWb(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.b=vsub(Vuu.b,Vvv.b):sat |HVX_VectorPair Q6_Wb_vsub_WbWb_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.h=vadd(Vuu.h,Vvv.h) | HVX_VectorPair Q6_Wh_vadd_WhWh(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.h=vadd(Vuu.h,Vvv.h):sat | HVX_VectorPair Q6_Wh_vadd_WhWh_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.h=vsub(Vuu.h,Vvv.h) | HVX_VectorPair Q6_Wh_vsub_WhWh(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.h=vsub(Vuu.h,Vvv.h):sat | HVX_VectorPair Q6_Wh_vsub_WhWh_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.ub=vadd(Vuu.ub,Vvv.ub):sat | HVX_VectorPair Q6_Wub_vadd_WubWub_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.ub=vsub(Vuu.ub,Vvv.ub):sat | HVX_VectorPair Q6_Wub_vsub_WubWub_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.uh=vadd(Vuu.uh,Vvv.uh):sat | HVX_VectorPair Q6_Wuh_vadd_WuhWuh_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.uh=vsub(Vuu.uh,Vvv.uh):sat | HVX_VectorPair Q6_Wuh_vsub_WuhWuh_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.uw=vadd(Vuu.uw,Vvv.uw):sat | HVX_VectorPair Q6_Wuw_vadd_WuwWuw_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.uw=vsub(Vuu.uw,Vvv.uw):sat |HVX_VectorPair Q6_Wuw_vsub_WuwWuw_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.w=vadd(Vuu.w,Vvv.w) |HVX_VectorPair Q6_Ww_vadd_WwWw(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.w=vadd(Vuu.w,Vvv.w):sat | HVX_VectorPair Q6_Ww_vadd_WwWw_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.w=vsub(Vuu.w,Vvv.w) | HVX_VectorPair Q6_Ww_vsub_WwWw(HVX_VectorPair Vuu, HVX_VectorPair Vvv)
Vdd.w=vsub(Vuu.w,Vvv.w):sat | HVX_VectorPair Q6_Ww_vsub_WwWw_sat(HVX_VectorPair Vuu, HVX_VectorPair Vvv)

编码

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/129579995