在科学计算中,需要大量的矩阵运算,而矩阵运算中乘法运算是其他运算的基础,如能提高嵌入式系统中浮点矩阵乘法运算的速度,则可加快其他类型的矩阵运算速度。
目前实现浮点矩阵运算的方法,有直接使用VHDL语言编写的浮点矩阵相乘处理单元[1],关键技术是乘累加单元的设计,通常依据设计者的编程水平决定硬件性能。同样,FPGA厂商也推出了一定规模的浮点矩阵运算IP核[2],其应用针对本厂家器件,且经过专业调试和硬件实测,性能稳定且优于手写代码,但还有一些可改进的地方。
本文基于Altera的算法IP核,采用数选方式对矩阵运算中的单精度浮点矩阵相乘进行改进,可推广到阶数更高的矩阵运算和双精度浮点、复数单精度浮点运算中。
1 浮点矩阵相乘的IP核原理
Altera公司推出的浮点矩阵相乘IP核ALTFP_MATRIX_MULT,适用于Quartus10.1版本以上的软件环境,能够进行一定规模的浮点矩阵计算,原理图如图1所示。
图1的矩阵相乘结合流水线方式控制数据流动,关键部分为核心PE(Processing Element)单元实现两浮点数的相乘。输入数据在控制器的引导下分为AA矩阵和BB矩阵,分别存于M144K或M9K存储器中,在计算指令的控制下做浮点相乘运算,接着并行地浮点相加完成输出。分析整个计算结构,要达到较好的性能就需要耗费多个存储器和多个浮点相乘单元。列出矩阵相乘的基本时序图如图2所示。
从时序图可见,整个IP核有7个输入、4个输出,分为数据加载、数据处理、数据输出三个阶段。在系统同步时钟sysclk的驱动下,loadaa、loadbb对数据loaddata进行乘数矩阵、被乘数矩阵使能,将数据加载到存储器中。当calcimatrix上升沿到来时,进行矩阵乘法运算并输出数据outdata,且在outvalid为高电平时有效。在整个数据输出有效阶段,完成信号done处于低电平,其余阶段为高电平。
浮点矩阵运算IP核的运算方式分为单精度、双精度、复数单精度三种方式,矩阵运算阶数有8、16、32、64、96、128阶6种,并不能实现任意阶矩阵的相乘,随着矩阵阶数的增大,最高时钟频率在下降,同时占用器件资源在增加,耗用最多的是存储器资源,呈几何倍数增长。
2 数选实矩阵相乘设计
在矩阵相乘运算中最基础的是2阶矩阵的相乘,核心部分为乘累加器[3],通过适当数选控制,可使整个矩阵运算具有高时钟频率。如图3为2阶矩阵相乘电路。
整个矩阵相乘模块的设计,结合数据选择的控制方式,分为流水线数据输入、数据相乘、数据输出三部分。在流水线数据输入模块,采用流水线的方式输入乘矩阵数据KA、KB,被乘数矩阵数据A、B,以同步系统时钟启动两个数据选择器,由cntr0控制两个数选器选择数据输出到乘法器两端;将乘法器的输入数据相乘并存于寄存器中;最后在数据输出部分cntr1模块的控制下,累加输出矩阵数据X、Y,完成矩阵运算。以Altera器件EP2C35F672C6为映射器件,其时钟频率为250 MHz。在Quartus7.2软件编程下,运行此2阶乘法器,可获得248.69 MHz的最高时钟频率。占用资源为172个逻辑单元、152个寄存器、2个9位乘法器,且在输入数据之后2个时钟输出运算结果,如图4所示。设计具有较高的计算性能,关键点在于数据选择器在电路运算过程中的作用,取代了存储器单一存储的目的,可进行乒乓式实时数据流动,提高系统运算效率,节省了一半存储器。
图4中乘矩阵[KA KB]在Matlab中的表示为[5 3;2 4],被乘矩阵[A B]表示为[2 2;3 4],得到的输出结果为[16 27;12 22],可见FPGA运算结果与Matlab结果一致。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)