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

文章详细介绍了高通HexagonV65处理器中HVX向量扩展的编程规则,包括VLIW打包策略、向量指令的资源使用、加载/存储、散列和聚集操作,以及特殊的直方图指令。HVX支持非连续内存访问和SIMD并行性,提高处理效率。
摘要由CSDN通过智能技术生成

4 向量指令

本章概述了 HVX 加载/存储指令、计算指令、VLIW 数据包规则、依赖性和调度规则。 4.7 节总结了所有指令类别的所有六边形槽、HVX 资源和指令延迟。

4.1 VLIW打包规则

HVX为向量指令执行提供了六种资源:

  • load
  • store
  • shift
  • permute
  • two multiply

如第4.1.2节所述,每种HVX指令都消耗了这些资源的一定组合。

VLIW数据包无法超额订阅资源。指令数据包最多包含四个说明,以及一个endloop。数据包内的说明必须遵守第4.1.3节中描述的数据包分组规则。

注:
组装器应检查和标记无效的数据包组合。在执行无效数据包的情况下,行为未定义。

4.1.1双向量说明

某些指令消耗​​一对资源,或者将移位和置换作为一对,或者将资源乘以另一对。这样的指令被称为双向量指令,因为它们使用两个向量计算资源。

半字乘法是双向量指令,因为它们同时消耗乘法资源。

4.1.2 向量指令资源使用

下表总结了 HVX 指令在执行期间使用的资源。它还指定了 Hexagon 汇编程序从最严格到最不严格的顺序尝试构建指令包的顺序。
在这里插入图片描述

4.1.3 向量指令

除了矢量资源分配,矢量指令还映射到某些 Hexagon 插槽。 ALU 指令的特殊子集需要标量 Rt 寄存器的完整 32 位(或 Rtt 的 64 位)映射到插槽 2 和 3。这些指令包括查找表、splat、插入和使用 Rt 的加/减。
在这里插入图片描述
在这里插入图片描述

4.2 向量 load/store

VMEM指令在VRF和内存之间移动数据。VMEM指令支持以下寻址模式。

  • 间接
  • 间接带偏移
  • 间接增加自动增量(直接和寄存器/修饰语寄存器)
    例如:
V2 = vmem(R1+#4) // address R1 + 4 * (vector-size) bytes
V2 = vmem(R1++M1) // address R1, post-modify by the value of M1

即时增量和后增量值是矢量计数。所以字节偏移量是向量长度的倍数。

为了方便未对齐的内存访问,可以使用未对齐的加载和存储。VMEMU指令生成对L2缓存的多次访问,并使用置换网络来对齐数据。

“load-temp”和“load-current”形式允许在同一个包中立即使用负载数据。“load-temp”指令不会将加载数据写入寄存器文件(必须指定寄存器,但它不会被覆盖)。由于“load-temp”指令不写入寄存器文件,因此它不消耗矢量ALU资源。

{ V2.tmp = vmem(R1+#1) // Data loaded into a tmp
    V5:4.ub = vadd(V3.ub, V2.ub) // Use loaded data as V2 source
    V7:6.uw = vrmpy(V5:4.ub, R5.ub, #0)
}

" Load-current “类似于” load-temp ",但是当加载的数据写入寄存器文件时,会消耗一个矢量ALU资源以上翻译结果来自有道神经网络翻译(YNMT)。

{ V2.cur = vmem(R1+#1) // Data loaded into a V2
V3 = valign(V1,V2, R4) // load data used immediately
V7:6.ub = vrmpy(V5:4.ub, R5.ub,#0)
}

VMEM存储指令可以存储新生成的值。它们不消耗矢量ALU资源,因为它们不读也不写寄存器文件。

vmem(R1+#1)= V20.new // Store V20 that was generate in the current packet

一个标量谓词也可以抑制整个VMEM写入

if P0 vmem(R1++M1) = V20 // Store V20 if P0 is true

可以使用向量谓词寄存器发出和控制部分启用字节的存储

if Q0 vmem(R1++M1) = V20 // Store bytes of V20 where Q0 is true

4.3 Scatter and gather

与访问内存中连续向量的向量加载和存储不同,catter/gather允许向量数据的非连续内存访问。通过catter和gather,每个元素可以独立地索引到内存区域。这使得应用程序可以很好地映射到HVX提供的SIMD并行性。

散点将数据从一个连续的向量传输到非连续的内存位置。类似地,gather将数据从非连续的内存位置传输到连续的向量。在HVX中,scatter是一个向量寄存器到非连续内存的传输,gather是一个非连续内存到连续内存的传输。此外,HVX支持原子相加的catter-累积指令。

为了最大化性能和效率,catter/gather指令定义了一个有界区域,所有非连续访问都必须在该区域内。该区域必须在VTCM(catter/gather能力)范围内,并且在一个可翻译的页面内。vector为每个元素访问指定从区域底开始的偏移量。下表描述了指定catter或gather的非连续访问的三个源:
在这里插入图片描述

为了形成HVX集合(内存到内存),vgather与向量存储配对以指定目标地址。散点是用一条指令指定的。忽略元素大小,下表描述了散射和收集指令的基本形式:
在这里插入图片描述

4.4 内存指令插槽组合

VMEM加载/存储指令和catter/gather指令可以与普通的标量加载/存储指令分组。

表4-5提供了HVX内存指令的有效分组组合。表中不存在的组合是无效的,应该被汇编程序拒绝。硬件产生无效报文错误异常。
在这里插入图片描述

4.5特殊说明

4.5.1直方图

HVX包含一个专门的直方图指令。向量寄存器文件被分为四个直方图表,每个直方图表有256个条目(32个寄存器乘以8个半字)。一行是通过临时VMEM加载指令从内存中获取的。每个字节的前五位提供一个寄存器选择,底部位提供一个元素索引。寄存器文件中元素的值增加。所有寄存器在程序员使用之前必须清除。

例子:

{ 
    V31.tmp = VMEM(R2) // load a vector of data from memory
    VHIST();// Perform histogram using counters in VRF and indexes from temp load
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值