高通 Hexagon V65 HVX 编程参考手册(1)
1介绍
本文档描述了高通®六角形™向量扩展(HVX)指令集体系结构。这些扩展是在一个可选的协处理器中实现的。本文档假定读者熟悉六边形的体系结构。有关该体系结构的完整描述,请参考高通六边形程序员参考手册。
1.1 SIMD协处理器
HVX指令主要在单指令多数据(SIMD)协处理器块中实现,该块包括向量寄存器、向量计算元素和专用内存。这扩展了基线六边形体系结构,以实现高性能的计算机视觉、图像处理或其他可以映射到SIMD并行处理的工作负载。
图1-1带附加SIMD协处理器的六角形芯
六边形指令集体系结构(ISA)通过新的HVX指令进行了扩展。这些指令使用HVX计算资源,并且可以与VLIW数据包中的普通六边形指令自由混合。HVX指令还可以使用来自核心的标量源操作数。
1.2 HVX features
HVX为六边形ISA增加了非常广泛的SIMD能力。SIMD操作在向量寄存器上执行(目前每个最多1024位),并且可以并行执行多个SIMD指令。下面的小节将描述HVX的主要特性。
1.2.1矢量长度
HVX体系结构具有可伸缩的,但特定于实现的向量长度。HVX支持由核心SYSCFG寄存器中的V2X位可选择的两个向量长度。
- 使用V2X=0,使用一个基向量长度,即512位(64B)。每个向量寄存器(V)是512位(64B),并且每个向量谓词寄存器(Q)是64位宽(每个向量寄存器字节1位)。这是一个不赞成使用的向量长度,并不是在所有实现中都可用;应该避免依赖于这个向量长度。
- 使用V2X=1时,向量长度是两倍: 1024位(128B)。每个向量寄存器(V)是1024位(128B),并且每个向量谓词寄存器(Q)是128位宽。
Figure 1-2 Registers using 128B with a vector length of 1024 bits
为了尽量减少将HVX软件移植到未来硬件实现的工作量,软件应该以一种将向量长度视为2的恒定幂的方式编写。
1.2.2向量上下文
向量上下文由向量寄存器文件、向量谓词文件和使用这种状态执行指令的能力组成。
十六边形的硬件线程可以动态地附加到一个向量上下文中。这使线程能够执行HVX指令。多个硬件线程可以并行执行,每个线程都具有不同的向量上下文。所支持的向量上下文的数量是由实现定义的。
六边形标量核心可以包含任意数量大于或等于向量上下文数量的硬件线程。标量硬件线程可通过每个线程的SSR: XA编程分配给向量上下文,如下所示:
- XA=4: HVX指令使用向量上下文0
- XA=5: HVX指令使用向量上下文1。
- SSR: XA=6: HVX指令使用向量上下文2。通常,这只适用于V2X=0(单向量长度),它目前是64B和弃用。
- SSR: XA=7: HVX指令使用向量上下文3。通常,这只适用于V2X=0(单向量长度),它目前是64B和弃用。
图1-3显示了包含四个硬件线程的向量上下文配置,但其中两个线程配置为使用双大小的向量。在这种配置中,两个线程可以执行双向量长度(128B)向量指令,而另外两个线程可以执行仅标量指令。
1.2.3内存访问
HVX存储器指令(称为VMEM指令)使用六角形通用寄存器(R0-R31)来形成访问存储器的地址。这些指令的内存存取大小是矢量长度或矢量寄存器的大小。
VMEM加载和存储作为普通标量加载/存储共享一个32位的虚拟地址空间。VMEM负载/存储与标量负载/存储保持一致,并且硬件保持一致性。
1.2.4向量寄存器
HVX有两组寄存器:
-
数据寄存器由32个向量长度寄存器组成。某些操作可以访问一对寄存器,以有效地将操作数的向量长度翻倍。
-
谓词寄存器由4个寄存器组成,每个寄存器每字节的向量长度为1位。这些寄存器为各种比较、mux和其他特殊指令提供操作数。
向量寄存器被划分为以SIMD方式操作的通道。例如,对于1024位(128B)的向量长度,每个向量寄存器可以包含以下任意项: -
32字(32位元素)
-
64半字(16位元素)
-
128字节(8位元素)
元素排序是小中间位的,最低字节在最不重要的位置,如图1-4所示。
图1-4 1024位SIMD寄存器
1.2.5向量计算指令
矢量指令以SIMD的方式处理矢量寄存器数据。该操作将在每个矢量车道上并行执行。例如,以下指令对每个半字执行一个有符号的ADD操作:
V2.h = VADD (V3.h,V4.h)
在本指令中,将V3中的半字与V4中相应的半字进行求和,结果存储在V2中。
当在指令中指定向量时,通常还会指定元素类型:
- .b为有符号字节
- .ub为无符号字节
- .h为有符号半字
- .uh为无符号半字
- .w为有符号字
- .uw为无符号字
例如:
v0.b = vadd(v1.b,v2.b) // Add vectors of bytes
v1:0.b = vadd(v3:2.b, v5:4.b) // Add vector pairs of bytes
v1:0.h = vadd(v3:2.h, v5:4.h) // Add vector pairs of halfwords
v5:4.w = vmpy(v0.h,v1.h) // Widening vector 16x16 to 32
// multiplies: halfword inputs,
// word outputs
对于具有混合元素大小的操作,每个元素大小较小的操作数使用单个向量寄存器,而每个元素大小较大的操作数(较小的两倍)的操作数使用向量寄存器对。一对中的一个向量包含偶数元素和其他奇数元素。
1.3技术援助
为了帮助或澄清本文件中的信息,请向https://support.cdmatech.com上的高通技术公司提交一个案例。
如果您没有访问CDMATech支持网站,请注册访问或发送电子邮件到support.cdmatech@qti.qualcomm.com。