Overview(1)
Qualcomm
Hexagon
是一种为各种各样多媒体以及调制解调器应用打造的通用高性能低功耗数字信号处理器。文章中所提及的V5版本为Hexagon
处理器架构的第五代版本。在接下来的几章中,我将从以下几个主题来描述该处理器的大概结构以及处理方法:
1. Hexagon处理器优点与优势
内存:HexagonDSP的程序与数据部分都统一存储在32位的地址空间中,HexagonDSP所遵循的load/store架构为编译器的代码生成和DSP应用程序都提供了一套完整的寻址模式。
寄存器:一共有32个通用寄存器,用户可以访问单寄存器(也就是常用的32位寄存器访问)或者访问双寄存器(以64位的方式访问)。通用寄存器可以保存各种各样的数据,包括了标量数据(布尔、整数、浮点数、字符串型),指针以及矢量数据。
数据类型:HexagonDSP提供的指令可以对定点数据与浮点数据进行各种各样的操作,定点指令可以支持各种大小的标量与矢量数据,浮点指令可以支持单精度型浮点数的操作。
并行执行:作为一款为多线程打造的多媒体处理器,HexagonDSP所支持的指令可以被整合于VLIW(VeryLong Instruction Word,超长指令字,用于提高指令型并行性能)中,每一个VLIW都包括了一到四个机器指令,而矢量指令通过SIMD矢量来控制(Single Instruction Multiple Data,单指令多数据流)。这些体系结构都为开发者在开发过程中的并行编程以及程序交互提供了极大地便利。
程序执行:Hexagon
可支持有条件跳转与无条件的跳转以及子程序的call指令,这些指令的实现为程序计数器与寄存器间接寻址提供了可实现的方法。
指令流水线:通过硬件设计,HexagonDSP可以完美解决流水线冒险(Pipelinehazards) 硬件的安排可以使得指令的执行过程并不会被流水线结构的限制所约束。
代码的压缩:通过compound指令,有些共用了的的操作序列可能会被合并成一个指令。Duplex的编码可在一个32位指令中发出两个并行指令。
内存缓存:对内存的访问有可能会被缓存保存,独立的L1指令以及数据缓存将会将程序代码以及数据保存其中,同时一个统一规格的L2级缓存可以被部分或全部设置为TCM。
虚拟内存:通过使用虚拟到物理地址的映射,我们可以获取虚拟内存。通过虚拟内存,可以在硬件独立方式下实现内存管理与内存保护。
2.
Hexagon处理器功能单元
上图显示出了Hexagon
V5的如下主要几个功能单元
(1) 内存与寄存器
Hexagon
处理器中的内存遵循字节编码的体式格局,该内存拥有单一的32位虚拟地址空间,在该空间中,程序或地址都可以存储,同时该地址空间以小端法存储数据
在Hexagon处理器中存在着两种寄存器:通用寄存器以及控制寄存器,通用寄存器一共有32个,他们被命名为R0~R31,这些通用寄存器都可以被直接单寄存器的32位或双寄存器64位访问,这些通用寄存器同时也能够保存指针,标量以及矢量数据,累加器数据。控制寄存器包括了程序计数器,状态寄存器,循环寄存器等在内的各种寄存器。
(2) 指令序列
指令序列可以处理每周期中合并了一或四个指令的packet,如果在一个packet中包含了超过一个指令,则该指令将会被并行执行。
如图中所示,Packet中指令的结合可以允许指令在四个执行单元中并行的处理
(3) 执行单元
如图所示,图中的双执行单元完全是一样的,都包含了一个64位的移位器以及一个携带了16*16乘法器矢量乘/加单元来支持标量以及矢量指令。
这些单元对于32位或者64位ALU指令,jump指令以及循环指令都能进行计算
(4) Load/Store单元
Load/Store单元能够处理有符号或无符号字节,半字,字或者双字的操作。
同时为了增加指令结合的数目,Load单元同样支持了32位的ALU指令。
3. 指令集:
为了让Hexagon
处理能够在每个周期内处理足够的工作,指令集在设计中将遵循如下的属性:
采用静态合并(VLIW)架构
使用扩展的合并指令
引入了大量的SIMD以及特殊的为应用优化的指令
为了达到有效的编译,这些对寄存器,寻址模式以及Load/store访问大小都是支持交叉编译的。
寻址模式:Hexagon处理器支持如下的内存寻址模式:
(注:等号左边为寄存器,右边为memx(R) ,x代表取出数据类型,此处以w(字)为示例 )
32位绝对寻址: R2 = memw(##myvariable)
32位绝对引用寻址: R2 = memw(R3=##myvariable)
(基址+偏移量)寻址 R2 = memw(R4<<#3+##myvariable)
全局指针寻址 R2 = memw(GP+#200)
间接寻址 R2 = memw(R1)
间接偏移选址 R2 = memw(R3+#100)
间接寄存器偏移选址 R2 = memw(R3+R4<<#2);
间接自动偏移寻址(可以是立即数或寄存器的值) R2 = memw(R3++#4);
环形自动偏移寻址(可以使立即数或寄存器的值)R0 = memw(R2++#8:circ(M0))
位反向自动偏移寻址(寄存器的值) R2 = memw(R0++M1:brev)
Hexagon
为标量数据提供的的支持与指令可以控制16位32位64位的加减,以及32位与64位的逻辑,乘法,移位,cmp,最小值最大值,位操作,托管等复杂的操作,这些都会在接下来的章节描述详细操作方法
Hexagon为矢量数据提供了大量的指令用用于控制不同的数据类型,半字与字的指令包括了加减,乘法计算,移位,平均值,最小值,最大值等一般操作,同时,Hexagon还支持了一些特殊的数据指令:数据对齐,复数共轭,复数翻转,数据的打包等,这些都会在接下来的一些部分详细描述操作方法
例如:R1:0 += vrmpyh(R3:2,R5:4)等同于
同时处理如下四个指令:
R1:0 += ( (R2.L * R4.L) +(R2.H * R4.H) + (R3.L*R5.L) + (R3.H* R5.H))
下图演示了Hexagon
实现矢量计算的框架:
Hexagon
对浮点计算同样支持加减乘法计算,以及square,求根,格式转换。
4.控制流
Hexagon
处理器在无需系统开销的情况下支持硬件循环:
loop0(start,#3) // loop 3 times
start:
{ R0 = mpyi(R0,R0) } :endloop0
同时如果将条件标定,上述循环可以被内嵌
软件分支同样支持分支预测,表达完整的compare指令可以产生一个分支位,该分支位用来在后面指令中进行分支的条件跳转。
P1 = cmp.eq(R2, R3)
if (P1) jump end
jump与子call可以为条件跳转或无条件跳转,并且跳转方式支持直接寻址与间接寻址
jump end
jumpr R1
call function
callr R2
子程序的call指令将返回地址存储在通用寄存器R31中
指令的打包(packet)
指令序列可以被声明打包从而支持并行计算:
{
R8 = memh(R3++#2)
R12 = memw(R1++#4)
R = mpy(R10,R6):<<1:sat
R7 = add(R9,#2)
}
上例中,花括号用来给指令包指示起点与中点,指令包可以同时来自四个长指令,同时,不同长度的指令包可以被随意的混合到程序代码中。
对于如上的格式,Hexagon定义了各种各样的限制,下图显示了指令包中可以打包的指令类别,以及包中可以存放的指令:
通过这些指令,指令包可以被精确地表示以及快速的执行,这些架构与设计都保证了Hexagon快速的处理能力与水平,在下一篇,将详细介绍其他的Hexagon 的概略信息