APP下载

HXDSP上双精度矩阵向量乘运算的实现与优化

2021-11-22廖晓群王佳仪张美春

计算机技术与发展 2021年11期
关键词:指令向量矩阵

廖晓群,王佳仪,苏 涛,李 敏,张美春

(1.西安科技大学 通信与信息工程学院,陕西 西安 710054;2.西安电子科技大学 雷达信号处理国家重点实验室,陕西 西安 710071)

1 概 述

HXDSP1042是中国电子科技集团第三十八研究所在BWDSP100单核DSP基础上研制的首款高性能多核DSP产品,从芯片的硬件架构到软件开发平台,再到指令集系统,都具有完全自主知识产权。它是一个32 位浮点数字信号处理器,工作主频700 MHz,时钟周期1.4 ns,运算能力达每秒300 亿次浮点运算或每秒80 亿次浮点乘法累加运算[1]。HXDSP1042内部集成2个新一代处理器内核eC104+,该内核是BWDSP100内核eC104的增强和改进版,其性能得到大幅提升,达到eC104的3倍,并且其应用领域也由雷达、电子对抗进一步扩展到了通信、视频图像处理和高性能计算等[2]。众多的应用领域需要更大的计算带宽以及更高的数据精度,相对于32位数据运算来说,64位的数据计算可以支持更大的内存以及可以运行更大范围的运算。通过不断的研究,目前编译器HXDSP1042通过改进软件的方式对指令模板进行优化设计,实现了64位数据的运算,支持64 位数据类型的相关语法,满足了高速实时信号处理的需求[3]。

双精度浮点矩阵运算函数属于矩阵类算法,是最基本的库函数,矩阵类算法是雷达信号处理的常用运算,在自适应波束形成、方向估计中矩阵运算占有相当大的比重,它的实现为上层函数与处理提供了强大的调用接口。这些函数的使用较为频繁,经编译系统直接生成的代码性能并不高,不能充分发挥DSP芯片自身的特点,因此选用汇编语言完成库函数的设计,以保证硬件资源利用的最大化。直接从C版本的算法改写成串行的汇编语言,并没有结合DSP芯片的硬件特点,存在一定的缺陷,若指令排布不合理,严重的还可能会发生Bank冲突。为了解决上述问题,有必要从汇编层面优化其性能,提高矩阵乘向量的运算效率。高性能的数据运算,能够保证信号处理过程的精度以及处理的速度。针对最新一代HXDSP1042平台所搭载的函数库实施并行优化,不仅能提升相关应用程序的运算速度,充分发挥HXDSP1042的性能,同时对DSP国产化的实现也具有实际意义。

针对DSP平台对其配套的函数库进行优化是比较重要的工作,在此之前就有很多研究人员基于HXDSP平台进行了一系列的优化研究与设计。文献[4]结合HXDSP1042的特殊指令和硬件逻辑,对中值滤波等图像滤波函数进行了优化,最终使得在四簇流水模式下,所有函数的性能均提升了51倍以上。文献[5]采用软件流水等方式对图像编码器进行优化,通过对编码器的代码并行处理与优化,使得基于TMS320C6678平台的编码速率由3.30帧/秒提升到159.98帧/秒。文献[6]针对BWDSP100的硬件特点,采用逆序循环与位反序寻址等方式充分发挥IO带宽,高性能实现了数字信号处理函数中的快速傅里叶变换算法,使得1 024点的FFT性能达到了ADI公司的ADSP-TS201系列的8倍。

双精度浮点数据运算具有更大的计算带宽以及更高的精确度,并且能够处理更复杂的数据。文中主要借鉴已有的一些研究成果,基于循环展开、软件流水、向量化和指令调度等常用优化技术,并结合HXDSP1042硬件体系结构和指令集特点,对64位数据类型的运算函数库中的矩阵与向量运算进行并行优化与实现。实验结果表明,相比优化前的串行算法结构,并行优化后的函数加速比达到了11以上。

2 研究背景

2.1 HXDSP1042介绍

HXDSP1042遵循兼容原则,保证“魂芯一号”(BWDSP100)程序运行,内部集成了2个新一代处理器内核eC104+,如图1所示,该内核的硬件结构在一代处理器BWDSP100的内核eC104基础上进行了增强和优化。

图1 eC104+的内核架构

2.1.1 提升运算性能

HXDSP1042仍采用16发射VLIW和4路SIMD混合结构的EfficiencyCore技术。核内的执行部件包含在4个执行宏中,但执行宏的功能在eC104的基础上进行了增强,从而极大地提升了DSP的运算性能。其中, MUL由原来的4个扩展到了8个,SHF由原来的2个扩展到了4个,并且通用寄存器也增加了一倍。具体内容如表1所示。

2.1.2 扩展指令集

所支持的指令操作由之前的600多条增长到了1 300多条,扩展了谓词指令,支持条件执行,增加了面向图像处理、通信的加速指令,大幅提升了指令执行效率。

表1 执行宏中的执行部件

2.1.3 优化存储空间

HXDSP1042在存储空间划分上有优化,程序空间和数据空间在物理上分离,相对于BWDSP100的3个内存块,其内存块增加到6个,每个内存块(block)的大小为256 K*32 bit。双内核共享256 K字指令存储器(SRAM),提高了该DSP的多任务调度效率。

2.1.4 流水线扩展

流水线扩展到了13级。其中取指令占3级,指令缓冲占3级,指令译码占4级,取操作数占1级,指令执行占1级,指令结果写回占1级。影响指令执行的因素中数据相关、数据bank 冲突、原子操作、访问核外存储资源引发的等待,均可引发指令流水的停顿,需要在算法优化过程中避免。

2.1.5 丰富的外设

HXDSP1042集成6对高速SerDes接口,工作在x4模式,支持协议包括RapidIO(最多2对)、PCIe3.0(最多1对)及JESD204B(最多3对)等协议。由于支持JESD204B协议,“魂芯二号”DSP可实现与ADC/DAC器件的高速直接互联。此外,“魂芯二号”DSP还集成有DDR3/4、Ethernet、UART、GPIO、I2C和并口等常用外设,方便用户使用。

2.2 HXDSP1042 SIMD指令的特性分析

HXDSP计算指令的通用格式如下:

[Macro]Rm=Rn op Rs

Macro是执行宏的代号,op是操作,符号“‖”连接多个可并行指令,比如:xRm=Rn+Rs是Scalar指令,表示在X宏上执行整数加法操作,xyztRm=Rn+Rs是SIMD指令,表示在{X,Y,Z,T}四个宏上同时执行整数加法操作,等于xRm=Rn+Rs‖yRm=Rn+Rs‖zRm=Rn+Rs‖tRm=Rn+Rs。

2.3 HXDSP1042 SIMD指令的特性分析

HXDSP虽然采用了SIMD架构,但并没有提供传统意义上的长向量化部件,而是提供了很多向量化指令[7]。文中经常用到的指令包括:64位浮点数据的乘法指令、加减法指令以及双字寻址指令等。以下是常用指令的详细说明。由于在HXDSP中只有32位寄存器,因此对于64位数据的存储需要利用原有的32位寄存器分别存储64位数据的高位和低位,64位浮点的加减法的实现需要四条微操作指令:

{Macro}DFHACCk=DFHRm+1±DFHRn+1

{Macro}DFLACCk=DFLRm±DFLRn

{Macro}DFHRs+1=DFHACCk

{Macro}DFLRs=DFLACCk

其中,DFHACCk和DFLACCk在指令中存储的是64位加减法的结果。HRm、LRm两个寄存器分别存储64位浮点数的高低32位,代表一个64位浮点数,这两个通用寄存器的索引号必须连续。存储结果记为DFRs+1:s,Rs+1存储64位浮点数的高32位,Rs存储低32位。在计算时需要先算高位数再算低位数,等高低位数都计算完成才可将结果保存至寄存器,并且以上4个微操作的ALU选择“k”必须相同,才能完成一次64位浮点数减法,占一个ALU。对于double乘法的实现,需要通过两条指令组合进行使用,有如下两种方式:

{Macro}QMACCH=DFRm+1:m*DFRn+1:n

{Macro}DFRs+1:s=QMACCH

或:

{Macro}QMACCL=DFRm+1:m*DFRn+1:n

{Macro}DFRs+1:s=QMACCL

其中,QMACCH和QMACCL在指令中存储的都是64位乘法的结果。该指令实现的功能为将寄存器Rm+1:m中存储的64位浮点数与Rn+1:n中的64位浮点数相乘,结果存入Rs+1:s中。两种方式实现的功能都是64位浮点数据的乘法,其中{Macro}表示指定某个或某些宏内进行运算,如果{Macro}为空就表示四个宏上都进行乘法运算。

3 基于HXDSP1042的优化分析

本节使用到的优化方案,其着力点在于消除性能瓶颈,试图通过多读多写的方式,尽可能让所有功能部件参与运算,铺满流水线,从而获得函数执行性能和效率的提升。

3.1 特殊指令

双字寻址传输指令允许程序在1个时钟周期内读取多个字,进一步减少函数的访存次数,如:

{X,Y,Z,T} Rs+1:s=[Un+=Um,Uk]

[Un+=Um,Uk]={X,Y,Z,T}Rs+1:s

第一条指令是读访存指令, Un是基地址,Uk是在Un地址基础上的调整量,Um则是指令执行后基地址Un的修正量。指令采用双字节寻址,故指令1表示能够一次性读出[Un]和[Un+1]、[Un+2Uk]和[Un+2Uk+1]、[U0+2×2U2]和[U0+2×2U2+1]、[U0+3×2U2]和[U0+3×2U2+1]共8个地址的数据,并将第这8个地址的数据依次送到4个宏的同名寄存器{X,Y,Z,T} Rs+1:s。第二条指令是写存储指令。由于Uk的大小不确定,如果某两个或两个以上的地址落在同一存储器bank上,就会产生bank冲突,一旦产生bank冲突,必须使整个流水线停顿,直到所有的数据被正确的读出或写入,才能恢复正常流水。

移位器的使用:移位器的作用在于对源操作数进行任意裁减、分解、移位和拼接等。滤波算法里涉及到一些求商的计算,可使用移位器来代替需要迭代的除法实现。比如,要计算单精度浮点数r4除以32的值,通常情况下为了保证浮点数据的精度,需要对除法计算进行迭代,此时用算术移位器来做除法计算只需要一个微指令r4 ashift -5就可以实现。

3.2 数据读取操作并行技术

BWDSP体系结构中具有三个地址产生器(U,V,W),相互独立工作,HXDSP104X内核内部数据总线一共有四条,为两读两写,同一时间最多只允许三条总线工作,也就是说一个时钟周期内最多进两组数。在矩阵与向量计算的循环体内可使用r11:10=[u0+=8,1]‖r15:14=[v0+=8,1]‖[w0+=2,1]=r61:60并行指令实现两读一写的操作,或者使用[u0+=8, 1]=r3:2‖[v0+=8, 1]=r1:0‖r5:4=[w0+=8, 1]实现两写一读的操作,也就是支持同时3条读写指令,使得在一个指令行内可读取多个向量数据,提升计算效率。

HXDSP芯片指令并行的优化指的是同一指令同时控制多个运算单元执行相同操作的优化。SIMD架构使得在一条指令中便可以操作多条数据流,各个运算宏之间同种运算部件进行相同的操作可以用一条指令来控制,这样就可以很好地兼顾运算部件控制的灵活性和计算效率之间的矛盾。HXDSP1042内一共有4个互相独立的计算单元(4路SIMD),依次是簇X,Y,Z和T。每个计算簇内都有ALU、MUL、SHF、SPU和寄存器组,这些器件可以对不同类型的数据进行计算与操作。并且每个计算簇均有相应的读写端口,端口通过芯片内部读写数据总线与片上SRAM内存连接,共形成了4条数据通道[8]。由于HXDSP芯片内部具有以上特点,因此在具体优化运算函数时,要对算子进行具体分析,使其充分利用硬件资源单元。使用单条指令在4个运算逻辑单元操作不同通道的数据,从而实现算子在HXDSP内部的细粒度并行计算。

3.3 零开销循环机制

程序中的条件分支是影响程序性能的一个重要原因,普通的“if”循环判断指令在ECS的环境中需要占10个时钟周期的时间,这使得有循环操作算法的运算总开销大大增加。而使用零开销循环指令,相对于普通的“if”指令而言只需占用1个时钟周期,降低了循环总开销,零开销循环的作用就相当于自动计数装置,一旦索引值达到循环体限定的数字就会自动跳出[9]。HXDSP1042中的指令集提供了LCx(x=0,1,2,3)指令专用与零开销循环,指令形式为“if LCx B loop”,表示若LCx为真则跳转至名为“loop”的分支处。

3.4 循环展开与软件流水技术

基于循环展开的优化指的是在一次循环中展开多次相同的循环的优化,基于软件流水的优化指的是将所述多次相同的循环并行交叉执行。循环展开是一种算法实现级的优化,通过将循环体代码重复多次来实现,这也是一种向量化的思想。循环展开通过将迭代间的并行转化为迭代内的并行,让循环体内部的运行周期尽可能减少。当使用到的数据之间不相关时,这些指令的流水线是可以并行起来执行的[10-12]。

在库函数中,通常程序中的循环占用了较大的时间比,因此汇编程序的优化主要是对循环的优化。循环展开是通过增加每次迭代元素的数量,来减少循环的迭代次数。同时流水线技术可以让多条指令线重叠起来,并行执行,以此提高程序并行度[13]。

3.5 指令调度

HXDSP采用可读性强的汇编指令,VLIW(超长指令字)架构使得单周期内可并行执行16条指令,同时应用程序分支预测机制减少了分支程序在流水线中的开销。为了避免流水线的空转,对于不存在相关依赖或冲突的指令可以组合拼成一个指令行,提高指令并行度[14]。指令调度即从程序中识别出指令级可并行的成分,并利用这些可并行性合理安排指令的执行顺序,已达到最大限度发挥目标机所提供的处理能力的目的。目前该编译器还未实现自动化识别,需要进行手动指令调度来尽可能地提升硬件利用率[15]。

4 双精度浮点矩阵与向量运算函数的优化实现

4.1 双精度浮点矩阵与向量运算函数

为了满足一些对高精度浮点运算的科学计算的需求,函数库中最常用的单精度浮点基本运算都有与之对应的双精度浮点数据的运算。对于32位浮点类型数据只能保证6位7位有效数字,不能满足一些更高精度的数据运算,而64位的浮点双精度数据类型能够保证15位、16位的有效数字,满足大多数浮点数据运算的要求[16]。 “xmulv”表示double型实数矩阵乘以double型向量。对于矩阵和向量之间的操作,主要是乘法以及累加计算的操作,但是在实际结合硬件架构进行汇编优化时,需要考虑的因素众多,不仅要满足理论运行时间,还要达到精度的技术指标。设A=(aij)是一个m×s的矩阵,B=(bi)是一个s×1的向量,则矩阵乘以向量(xmulv)的通用公式定义为:

ci=ai1b1+ai2b2+…+aisbs,i=1,2,…,m

(1)

展开后可表示为:

(2)

4.2 矩阵向量乘运算的优化实现

文中实验的软件平台为“魂芯”系列处理器的统一软件开发平台ECS,所使用的软件版本为ECS2.0,使用的指令集为BW32v2最新版指令集。HXDSP1042处理器的工作频率为700 MHz,所以一个时钟周期为1.4 ns。文中的工作将以矩阵乘以向量运算函数(xmulv)为例进行阐述。

4.2.1 算法实施层的优化

矩阵乘以向量(xmulv)算法实现的伪代码如下:

算法1:xmulv函数的伪代码。

输入:矩阵pa,向量pb

输出:pc=pa*pb

(1)function xmulv(pa, pb, pc)

(2)for row=0→a-1 do

(3)pc[i]=0

(4)for col=0→b-1 do

(5)pc[i]+=pa[i*b+k] * pb[k]

(6)end for

(7)end for

将未经优化的原始算法记为算法1,这部分的矩阵乘向量函数的实现是串行的,没有发挥出HXDSP的底层架构优势,因此需要结合具体的硬件架构和指令特点来对算法的实现进行优化。在进行细粒度并行优化前,先对其进行算法实施层的优化:将两层for循环用3.3节介绍的零开销循环进行改写。对于向量运算,只需要一层循环,对于矩阵运算则至少需要两层循环来实现。矩阵(M×N)乘向量(N×1)的运算,外层需要M次循环迭代,内层需要N次循环迭代,串行运算时共需要M×N×10个时钟周期。将普通的“if”判断换成零开销循环判断,所占用的运行时钟周期可以至少降到M×N个,显著降低了循环总开销,得到了算法2。64位数据的矩阵乘以向量函数,具体实现时共有两层循环,内层循环实现矩阵的行与向量的乘累加结果,外层循环控制行的移位操作,其汇编形式核心代码循环展开之前的形式如下:

算法2 :矩阵乘向量运算串行计算。

输入:64位数据的矩阵,64位数据的向量

输出:矩阵乘以向量的结果

(1)_xmulv_rowloop://外层循环

(2)_xmulv_maccloop: //内层循环

(3)xr11:10=[u0+=8,1] //取矩阵的值(每次取一个值)

(4)xr15:14=[v0+=8,1] //取向量的值(每次取一个值)

(5)xQMACCH=DFR11:10*DFR15:14 //相乘

(6)xDFR31:30=QMACCH

(7)xDFHACC0=DFHR41+DFHR31 //将结果存至累加器

(8)xDFLACC0=DFLR40+DFLR30

(9)xDFHR41=DFHACC0 //存储高位值

(10)xDFLR40=DFLACC0 //存储低位值

(11).code_align 16

(12)if lc0 b _xmulv_maccloop

(13)_xmulv_maccexit:

(14)[w0+=2,1]=xr41:40 //存储结果值到寄存器w0

(15).code_align 16

(16)if lc2 b _xmulv_rowloop

在这种未进行循环展开的形式下,一个矩阵乘向量的计算总共需要做M×N×2次访存和乘累加的计算操作,M×N次内层循环判断,M次外层循环判断。对于64位数据的运算指令本身就比32位计算要复杂,这使得函数运算所需的理论运行时间太大,达不到库函数的技术指标。

HXDSP芯片内部包含4个执行宏,每个执行宏包含64字的通用寄存器组,通用寄存器组内又分为A面寄存器和B面寄存器,所以每个宏内有128个通用寄存器,四个宏的运算可以并行。并且,在HXDSP的内核eC104+中,内和数据总线有2条读总线和2条写总线,总线提供的数据字宽为3个64 bit,最多可同时利用其中的3条总线实现传输,即同时最多支持两读一写或者两写一读的读写模式。在具体实现时,可以同时读取4个矩阵中的双精度浮点实数和4个向量中的数进行计算。循环内部的乘法和累加循环计算需要按照3.4节的方法将循环进行展开,具体的方式如下:

上述代码执行时,每次从矩阵和向量中分别取出一个数进行相乘累加运算,只利用了eC104+内核中的一个执行宏X,没有充分利用核内的数据总线和运算资源。考虑SIMD指令与双字寻址方法,可以从4个宏中同时读取数据。每次循环完成4个输入元素的运算,双字传输方式使得每次都能从各个执行宏中读取1个64位的数据,即64 bit×4=256 bit,占满一条读总线。向量数据的访存占用另一条读总线与之并行,这使得访存操作次数由原来的M×N减少到了M×N×2/8。同时,结合循环展开的优化技术,可优化循环体中的读取、处理和存储操作,将循环过程中不相关的数据通过循环展开并行执行,减少循环过程中的运行时间。这使得内层循环次数减少到了1/4。得到优化后的核心代码例子如下:

算法3:矩阵乘向量运算并行优化。

输入:64位数据的矩阵,64位数据的向量

输出:矩阵乘以向量的结果

(1)_xmulv_rowloop:

(2)_xmulv_maccloop:

(3)r11:10=[u0+=8,1]‖r15:14=[v0+=8,1] /*同时取矩阵与向量的值(每个指令行可取4个64bit的值)*/

(4)QMACCH=DFR11:10*DFR15:14 //4个值的乘法同时计算

(5)DFHACC0=DFHR41+DFHR31‖DFR31:30=QMACCH

(6)DFLACC0=DFLR40+DFLR30‖DFHR41=DFHACC0

(7)DFLR40=DFLACC0

(8).code_align 16

(9)if lc0 b _xmulv_maccloop

(10)_xmulv_maccexit:

(11)[w0+=2,1]=r41:40 //存储结果值到寄存器w0

(12).code_align 16

(13)if lc2 b _xmulv_rowloop

在实现过程中,充分考虑软件流水技术,通过重组循环来减少指令间的延迟,设法使得不同循环体之间的指令能够并行执行,从而使得循环数目成倍减少。此时,得到了算法3,算法3相对于算法2的平均性能提升了1.5倍。接下来就是按照3.5节介绍的指令重排技术让指令尽可能地并行执行,减少运行时间,得到算法4,相对于算法3的实现性能平均提升了1.4倍。算法2、3、4的性能比较如图2所示。

图2 算法2~算法4的性能比较

此时,用自动化测试平台对优化后的算法效率进行测试发现算法的性能并未达到技术指标,并且输入的矩阵规格越大所耗费的运行时间越多。因此为了减少运行时间,提高运行效率,需要对软件流水的排布作进一步的优化。

4.2.2 流水排布的优化

一般的64位矩阵运算中循环体软件流水示意图如图3所示。

图3 通用的64位矩阵计算软件流水示意图

对于双精度浮点的矩阵乘向量函数,在HXDSP中的存储与计算都是将其高位和低位分别存储在32位寄存器中,因此在算法处理过程中所花费的时钟周期相对单精度数据计算要多。在进入循环核心期之前,数据读取和准备操作占用了相当大一部分运行时间。因此,若每次循环都要从循环起始期开始执行,在跳出循环核心期的时候会有一部分循环体是已启动但并未执行操作。当运算的矩阵规模较大时,这些循环体已启动但并未执行操作的数据就会造成取数冗余,会大大增加函数整体的运行时间。为了让整个运算充分地并行执行,提升数据量大时的计算效率并避免读取冗余的数据,需要对预设的软件流水排版进行调整,让每一次循环取出的数据都能被完全执行。解决方法就是让循环核心期的每一次零开销循环判断跳转到特定的位置,在该位置将之前循环起始期所取出的全部数据计算完,然后再跳转至矩阵中下一行需要计算的数据。

下面给出汇编算法主体循环部分中的一个cycle进行具体说明:

.code_align 16

if nlc0 b _xmulv_maccexit2‖DFLR40=DFLACC0

r21:20=[u0+=8,1]‖r25:24=[v0+=8,1]

‖QMACCL=DFR23:22*DFR27:26

‖DFR35:34=QMACCH

‖DFHACC3=DFHR47+DFHR37

‖DFLACC2=DFLR44+DFLR34

‖DFHR43=DFHACC1

主循环中每次循环可处理4个64位数据的取值、运算和累加。BWDSP1042算法编写只有A面寄存器时支持16个slot,当一个cycle中存在A、B面寄存器传输时,最多只支持14个slot,这就使得算法编写有时陷入瓶颈,编写时应尽量避免这种情况。上述这段代码中,第一段代码共占用3个slot,其中跳转指令占用了2个slot;第二段代码共占用了7个slot,共占用了8个MUL,8个ALU,所以ALU和MUL的利用率为100%。主循环体中的每段代码执行完成之后,都会跳转至对应的位置即“Loop_exit n”处,目的是为了将之前读取的数计算完。

调整后的循环排布主要有两部分做了调整:第一部分是循环结尾部分,不再使用统一的结尾方式。而是让每个从循环体内跳出的分支都有一个单独的结构去将之前取出的数完全计算完,不至于造成取数冗余。计算的同时再并行上矩阵运算的下一行的循环起始与核心期,使得每个指令行都是充分地并行执行。可以看出,对下一行计算的处理部分是相同的,这样做的目的是为了方便计算完下一行的数之后重新跳转至“Loop”处,接着计算剩余的数。

第二部分是循环次数的调整。由于Loop循环体内的每个指令行执行完都会跳转至不同的分支指令,因此需要对零开销循环次数lcx根据具体的方案进行调整。对于文中所实现的矩阵乘运算函数,循环起始期用了10拍取出了10×4个数(每一拍取出4个64位的数),核心期用了10拍取出了10×4个数。因此内层循环lc0初始值为n/4-10,经过下一行计算时lc0被赋值为n/4-20。将该思想应用到算法中后得到算法5。

在以上优化的基础上,再对汇编代码的并行性进一步挖掘,再次利用3.5节的指令调度技术将算法再次优化。在64位运算中,对于累加计算,需要提前设定几个寄存器作为累加器来存储每回累加计算的结果。这些累加器的初始化以及对于零开销循环次数lc0、lc1的设置可以通过指令调度将其与其他不相关的指令行并行来避免单独占用一个运行周期。此时,得到算法6。算法5和算法6的性能比较如图4所示。

图4 算法5和算法6的性能比较

4.3 64位矩阵与向量运算优化前后性能对比

表2是具体的对矩阵乘向量函数(xmulv)进行优化前后的性能对比。其中cycles为时钟周期的单位,表中结果数据为使用算法优化前后在HXDSP1042处理器上执行不同数据规模程序时的具体时钟周期数。

由表2可得,算法xmulv相对于优化前的初始算法平均性能提升了大概14.96倍。实验结果表明,VLIW DSP处理器下文中的优化方法充分利用处理器强大的计算能力和资源优势,可使得64位的矩阵函数的运算时钟周期明显减少,可显著提升该函数在VLIW DSP上的执行性能。

表2 矩阵乘向量函数(xmulv)优化前后的对比

5 结束语

针对HXDSP1042芯片体系结构特点,文中对其软件系统所配套的64位运算函数,通过利用数据读取操作并行、零开销循环、循环展开与软件流水、指令调度等方法进行优化,实现了相关函数汇编代码。实验结果表明,在充分挖掘其并行性下,双精度浮点型矩阵乘以向量函数的加速比能达到11以上,证明汇编函数的优化效果可以提升函数在HXDSP上的计算性能。该并行性优化方法对该系列的DSP上的函数基本适用,其中优化后的循环展开与软件流水排布对类似的矩阵运算都具有参考意义。在下一步工作中,将对双精度浮点运算函数的操作指令进行改进,以进一步完善与优化双精度库函数的计算效率,使其满足大量需要高精度浮点运算的计算需求,提高工作效率。

猜你喜欢

指令向量矩阵
向量的分解
聚焦“向量与三角”创新题
《单一形状固定循环指令G90车外圆仿真》教案设计
新机研制中总装装配指令策划研究
关于ARM+FPGA组建PLC高速指令控制器的研究
多项式理论在矩阵求逆中的应用
向量垂直在解析几何中的应用
向量五种“变身” 玩转圆锥曲线
矩阵
矩阵