本文主要是介绍高通 Hexagon V65 HVX 编程参考手册(7),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
高通 Hexagon V65 HVX 编程参考手册(7)
- 5 指令组[表],指令系统
- 5.1 hvx/全计算资源
- 5.2 hvx/alu-双资源
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)
编码
这篇关于高通 Hexagon V65 HVX 编程参考手册(7)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!