基于FPGA的实对称矩阵特征值分解的数据存储方法
文献发布时间:2023-06-19 10:32:14
技术领域
本发明涉及信号处理领域,具体涉及一种基于FPGA的实对称矩阵特征值分解的数据存储方法。
背景技术
实对称矩阵特征值分解在无线通信、深度学习、图像压缩等领域得到了广泛应用,由于矩阵特征值分解过程存在大量的数值计算和数据交换,计算过程需要多轮循环迭代,提升实对称矩阵特征值分解的性能面临巨大挑战。基于FPGA芯片和Jacobi算法实现的实对称矩阵特征值分解目前正成为一项研究热点,该方法结合了FPGA和Jacobi高度并行的优点,可以用来提升特征值分解的效率。对于实对称矩阵,目前通用的做法是通过上三角阵列结构来节省接近一半的输入数据存储,为了提高并行性,RAM存储资源一般会采用乒乓结构以获得并行流水性能。然而,随着输入的矩阵尺寸的增大,计算过程所需的RAM也随之成倍增加,当FPGA内部的RAM不够使用时,只能借助于FPGA外部的RAM资源,这就导致FPGA与外部存储之间需要不断的来回搬移中间计算结果,由此造成数据的碎片化,导致整体计算效率较低,实时性变差,同时也对外部存储接口的带宽提出了苛刻要求。
申请号为CN2019102853514的专利提及了基于FPGA的并行Jacobi计算加速实现方法,主要靠通过优化内部CORDIC电路的计算周期来提高并行流水能力,实现加速。该方法是基于输入的数据是持续提供的,如果输入数据出现停滞,例如,随着输入矩阵尺寸的增加,FPGA内部RAM存储资源出现不足,流水线性能就会受到严重影响。
申请号CN2019105040347的专利提及了通过在迭代过程中改变阵列结构内部处理单元中的输入输出数据的顺序,提高了迭代运算的效率,更侧重于调度顺序的优化上,在数据存储设计方面,则并没有提及。
因此,在基于FPGA的实对称矩阵特征值分解应用中,如何设计出一套高效的数据储存设计方法,将有助于提升特征值分解的效率,加速整体实时性能,同时减轻对外部存储接口的带宽需求。
发明内容
针对现有技术的不足,本发明提出基于FPGA的实对称矩阵特征值分解的数据存储方法,该方法根据实对称矩阵简化后的上三角阵列,按照从上到下每行分配一块RAM存储,每块RAM存储根据所在的行分为奇数行或偶数行,充分利用上三角结构阵列从上到下每行存储的数据个数线性递减,存在接近一半的存储空闲,采用RAM互补存储结构替代常见的乒乓结构,将空闲存储充分利用,从而实现了节省接近原来一半的RAM存储资源的效果。此外,将每行元素的寻址地址从右往左排序以取代通常的从左至右排序,保留了原有实对称矩阵的行列交换规律,利于上三角阵列结构经Jacobi旋转计算后,行列数据交换规律的数字电路实现。
本发明的目的通过如下的技术方案来实现:
一种基于FPGA的实对称矩阵特征值分解的数据存储方法,其特征在于,所述实对称矩阵为2N行×2N列;所述FPGA准备2N+1块RAM,RAM编号为i,i∈0~2N,RAM内地址编号为j,j∈0~2N-1;所述的数据存储包括实对称矩阵的写入存储、上三角阵列结构经双边Jacobi变换后的数据存储;
所述实对称矩阵的写入存储具体包括如下步骤:
(1)将所述实对称矩阵转换为上三角阵列结构,整个阵列结构共有N(2N+1)个元素,根据并行双边Jacobi算法,每个处理单元为一个2×2的子矩阵,整个上三角阵列结构包含N(N+1)/2个处理单元;
(2)在FPGA内部为上三角阵列结构的每一行设置一块RAM存储,各块RAM按行由上至下从0开始顺序编号,即首行数据存储在第0块RAM,最末尾的一行数据存储在第2N-1块RAM,第2N块RAM为额外扩展存储;每块RAM内地址由右往左从0开始编号且顺序递增,并将上三角阵列结构的每一行元素依次写入对应RAM相应的地址中;
所述上三角阵列结构经双边Jacobi变换后的数据存储和更新包括如下步骤:
(1)当i=0时,第i块RAM更新后的所有数据统一写到第2N块RAM中,且内部地址更新规律为:原地址j=2N-1的元素写到新地址0处,原地址j=0的元素写到新地址2N-1处,其余原地址j为奇数的元素写到新地址2N-2-j处,其余原地址j为偶数的元素写到新地址2N-j处;
(2)当i=2N-1时,第i块RAM更新后的数据写到第1块RAM中,原地址j=0的唯一元素更新后写到新地址2N-1中;
(3)当i=1~2N-3且i为奇数,其中原地址j=2N-i-2的元素,更新后的数据写到第2N-i块RAM中的新地址i+1处;其余元素统一写到第2N-(i+1)块RAM中,并执行和步骤(1)相同的RAM内部地址更新规律;
(4)当i=2~2N-2且i为偶数,更新后的数据写到互补的第2N-(i-1)块RAM中,并执行和步骤(1)相同的RAM内部地址更新规律。
进一步地,第0块RAM与第2N块RAM形成互补,第1块RAM与第2N-1块RAM互补,第2块RAM与第2N-2块RAM互补,…,第N块存储与自身互补;每块RAM内部的地址0与地址2N-1形成互补,地址1与地址2N-2互补,…,地址N-1与地址N互补。
本发明的有益效果如下:
本发明通过分析上三角阵列结构从上到下每行存储的数据个数线性递减的特点,存在接近一半的存储空闲,采用RAM互补存取结构可以将接近一半的空闲存储得到充分利用,从而实现了节省接近一半的RAM存储资源的效果。此外,创新地将每行元素的寻址地址从右往左排序,保留了原有实对称矩阵的行列交换规律,利于上三角阵列的Jacobi旋转前后行列数据交换规律的电路实现。
附图说明
图1为512×512实对称矩阵特征值分解的上三角阵列结构图;
图2为8×8实对称矩阵特征值分解的上三角阵列结构图;
图3为8×8各行RAM存储数据示意图;
图4第0行存储Jacobi旋转变换前后数据交换图;
图5第7行存储Jacobi旋转变换前后数据交换图;
图6第1行存储Jacobi旋转变换前后数据交换图;
图7第2行存储Jacobi旋转变换前后数据交换图。
具体实施方式
下面根据附图和优选实施例详细描述本发明,本发明的目的和效果将变得更加明白,应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
首先给出技术术语解释:
(1)FPGA:Field Programmable Gate Array 现场可编程门阵列
(2)RAM:Random Access Memory 随机存储器,这里特指FPGA内部RAM
(3)Jacobi:这里特指并行双边雅克比旋转,常用于基于FPGA的矩阵特征值分解
(4)BRAM:Block RAM,FPGA内部块状RAM
本发明的基于FPGA的实对称矩阵特征值分解的数据存储方法,实对称矩阵为2N行×2N列,该实对称矩阵转换后的上三角阵列结构的每行元素个数呈线性现递减的规律,接近一半的存储空间处于空闲浪费状态,且并行Jacobi旋转更新前后的行列交换存在确定的规则。因此,本发明的方法在实对称矩阵的写入存储,以及上三角阵列结构经双边Jacobi变换后的数据存储时,均采用RAM互补存储结构替代常见的乒乓结构,将空闲存储充分利用,从而实现了节省接近原来一半的RAM存储资源的效果。此外,将每行元素的寻址地址从右往左排序以取代通常的从左至右排序,保留了原有实对称矩阵的行列交换规律。具体过程如下:
所述FPGA准备2N+1块RAM,RAM编号为i,i∈0~2N,RAM内地址编号为j,j∈0~2N-1。
所述实对称矩阵的写入存储具体包括如下步骤:
(1)将所述实对称矩阵转换为上三角阵列结构,则整个阵列结构共有N(2N+1)个元素,根据并行双边Jacobi算法,每个处理单元为一个2×2的子矩阵,整个上三角阵列结构包含N(N+1)/2个处理单元;
(2)在FPGA内部为上三角阵列结构的每一行设置一块RAM存储,各块RAM按行由上至下从0开始顺序编号,即首行数据存储在第0块RAM,最末尾的一行数据存储在第2N-1块RAM,第2N块RAM为额外扩展存储;每块RAM内地址由右往左从0开始编号且顺序递增,并将上三角阵列结构的每一行元素依次写入对应RAM相应的地址中。
因每块RAM内部的地址寻址从0开始,按从右往左顺序递增来代替传统的从左往右递增做法,避免了实对称矩阵简化为上三角阵列后引起的列规则被打乱,可以简化后续的行列交换逻辑实现复杂度。
在上三角阵列结构进行双边Jacobi变换时,总共有N(N+1)/2个2×2的子矩阵处理单元需要处理,FPGA实现过程中会采用串行流水线的方式来执行以节省逻辑资源的使用量。由于存在行和列的临近交叉,Jacobi计算更新后写回同一块RAM会覆盖尚未执行Jacobi旋转计算的元素,导致结果错误;采用乒乓结构的RAM存储方式,则会增加一倍的RAM资源。因此,通过额外增加一块相同深度和宽度的RAM存储,并编号为2N,将其与第0块RAM存储的数据交换;其他的各个块均采用结构互补的形式,用空闲的存储单元去存储更新后的数据,并遵循Jacobi旋转计算的对角交换规则,从而不会破坏其他地址的数据,同时达到节省RAM存储资源的效果。
所述上三角阵列结构经双边Jacobi变换后的数据存储具体包括如下步骤:
(1)当i=0时,第i块RAM更新后的所有数据统一写到第2N块RAM中,且内部地址更新规律为:原地址j=2N-1的元素写到新地址0处,原地址j=0的元素写到新地址2N-1处,其余原地址j为奇数的元素写到新地址2N-2-j处,其余原地址j为偶数的元素写到新地址2N-j处;
(2)当i=2N-1时,第i块RAM更新后的数据写到第1块RAM中,原地址j=0的唯一元素更新后写到新地址2N-1中;
(3)当i=1~2N-3且i为奇数,其中原地址j=2N-i-2的元素,更新后的数据写到第2N-i块RAM中的新地址i+1处;其余元素统一写到第2N-(i+1)块RAM中,并执行和步骤(1)相同的RAM内部地址更新规律;
(4)当i=2~2N-2且i为偶数,更新后的数据写到互补的第2N-(i-1)块RAM中,并执行和步骤(1)相同的RAM内部地址更新规律。
下面以一个具体的实施例对本发明的数据存储方法进行进一步的解释和说明。
如图1所示,为本发明512×512实对称矩阵特征值分解的上三角阵列结构图,每个元素是实数,数据类型为单精度浮点数,位宽32比特,FPGA开发板选择的是Xilinx公司提供的VC707,FPGA型号是XC7VX485T-2FFG1761C,内含18Kb的Block RAM共计2030块。18Kb的BRAM(其中的2Kb用于奇偶校验)配置成位宽32、深度512,正好匹配矩阵输入维度512,一块18Kb的BRAM正好存储上三角阵列的对应一行,若采用传统的乒乓RAM存储结构,实对称矩阵特征值分解任务中仅用于数据交换就需要消耗1024块BRAM,此外计算特征向量也需要使用同等数量的RAM存储资源,则已经达到2048块BRAM,即使FPGA内部还有少量的分布式RAM存储可供使用,也会导致FPGA布局布线困难,设计无法通过。进而只能求助于板上的外部DDR3SDRAM存储,通过FPGA内部存储与DDR3外部存储之间不断的来回搬移数据,实现整体计算任务。但是,片段化的数据来回搬移加上寻址的不连续,会导致整体计算效率降低,同时也对外部存储接口的带宽提出了苛刻要求。
因此,通过采用本法的RAM存储互补结构,将空闲存储得到充分利用,从而实现了节省接近原来一半的RAM存储资源的结果。此外,创新地将每行元素的寻址地址从右往左排序,保留了原有实对称矩阵的行列交换规律,利于上三角阵列的Jacobi旋转前后行列数据交换规律的电路实现。
对于512×512的上三角阵列结构,总计有(256+1)*256/2=32896个2×2子矩阵处理单元,共有512块RAM存储用于储存从上到下每一行的元素,另增加扩展存储一块,RAM位宽32比特,深度512,编号0,1,2,…,512。第0行RAM存满512个元素,第1行RAM存有511个元素,…,第511行RAM仅有一个元素,扩展存储初始时为全空。
为描述和理解方便,对具体实施的512×512实对称矩阵特征值分解,这里会以8×8实对称矩阵特征值分解的上三角阵列结构图来阐述,如图2所示,两者原理和流程完全一致,只是尺寸数量不同。
在写入存储时:
(1)根据上三角阵列结构,在FPGA内部为每一行分别设置一块RAM存储,各RAM存储的深度和宽度规格相同,用于存放每一行的元素,整个阵列结构是8行,需要使用8块RAM存储;另外增加1块RAM存储用于与第0行存储的数据交换,因此共需9块RAM存储;
(2)各块RAM存储按行方式从上到下的顺序编号,存储编号从0开始,即最开始的首行数据存储在第0行存储RAM,最末尾的一行数据存储在第7行存储;整个上三角阵列结构最右上角的元素存储在第0块存储的地址0处,最左上角的元素存储在第0块存储的地址7处,最底部的元素存储在第7块存储的地址0处;从第0块RAM存储到第7块RAM存储,其所存的元素数量从8到1线性递减的,列编号对应就是RAM存储里的寻址地址;8×8实对称矩阵特征值分解的上三角阵列结构在FPGA内部的RAM存储详细情况,如图3所示。
所述上三角阵列结构经双边Jacobi变换后的数据存储具体为:
根据Jacobi旋转前后的数据交换规则以及RAM存储格式,名义上第0块的的RAM整行元素的行编号保持不变,地址0和地址7两个元素寻址地址保持不变,其余元素的寻址地址执行临近奇偶交叉规则,即原先地址2i-1的元素经Jacobi旋转计算后存放到地址2i,原先地址2i的元素经Jacobi旋转计算后存放到地址2i-1,i={1,2,3};实际操作时,由于Jacobi旋转计算是按2×2处理单元流水线执行的,第0行RAM不能写回本身的第0行RAM存储,否则会发生其余还没有计算更新的元素被覆盖,这就是需要增加一块扩展存储即第8块RAM作为互补存储的原因;原先地址0元素P03.b经 Jacobi旋转计算后得到的值P03.b’写到互补存储即第8块RAM的7地址处,第0行存储地址为7的元素P00.a经Jacobi旋转计算后的P00.a’写到第8块RAM的地址0处,其余的中间元素执行RAM内部地址奇偶交叉,如图4所示;下一轮迭代时,把第8块存储当做第0行存储,而原先的第0行存储的内容已经无效,作为扩展存储,如此循环处理;
根据Jacobi旋转前后的数据交换规则以及RAM存储格式,得到最后一行即第7块存储各元素经Jacobi旋转计算后的存储交换规律:第7块存储仅有一个元素,行编号和寻址地址编号均保持不变;第7块存储仅使用一个元素,而第1块存储仅剩一个空闲元素,两者形成互补结构,如图5所示。
根据Jacobi旋转前后的数据交换规则,中间的第1行存储、第3行存储、第5行存储中,均有一个特殊的元素保持行列不变,即P01.c、P12.c、P23.c,其余元素的行分别变为第2、第4、第6,各行除了寻址地址0不变,其余元素均执行RAM内部地址更新规律即“互补”的交叉操作;以第1行存储为例,第1行的存储名义上是写到第2行存储,需要6个元素的存储位置,但是第2行存储本身就需占用6个元素的存储,导致数据被覆盖,而与第2行存储形成互补结构的第6行存储则刚好有6个元素的空闲位置,两者形成互补结构,所以真实的第1行存储经Jacobi旋转计算后是写到第6行存储,其中特殊的P01.c保持不变;详细操作如图6所示,特殊元素P01.c保持行列不变以浅灰色标识,第1行存储与第2行存储名义上执行Jacobi数据交换,但实际上是写入到RAM互补结构的第6行存储,其中寻址地址执行“互补”操作。
根据Jacobi旋转前后的数据交换规则以及RAM存储格式,得到中间第2、第4、第6行存储各元素经Jacobi旋转计算后的存储交换规律,分别变为第1、第3、第5行存储,对于寻址地址,除了地址0不变为,其余寻址地址同样地执行RAM内部地址更新规律即“互补”的交叉操作;以第2行存储为例,如图7所示,其Jacobi旋转计算更新后需要写到第1行存储,需要占用6个元素,第1行S7中特殊的元素P01.c共计需要7个新元素,会导致数据被覆盖,而与第7行存储刚好有7个元素存储位置空闲,刚好与第1行存储形成互补,所以第2行存储经Jacobi旋转计算后,更新的值最终是写入到第7行存储位置中。
由于总共有5x4/2=10个2×2的子矩阵处理单元需要处理,FPGA实现过程中会采用串行流水线的方式来执行以节省逻辑资源的使用量, Jacobi计算更新后写回同一块RAM会覆盖尚未执行Jacobi旋转计算的元素,会导致结果错误;RAM存储采用传统的乒乓结构,则会增加一倍的存储资源;采用本发明的RAM互补存取结构可以使原本接近一半的空闲RAM资源得到使用,从而节省接近一半的FPGA内部RAM存储资源。
完成各行的数据交换后,继续对这5x4/2=10个2×2的子矩阵进行下一轮的双边Jacobi旋转计算,并重复执行上述的数据交换操作,直至满足收敛条件。
对于512×512的上三角阵列结构,采用上述方法,以增加1块18Kb的BRAM来替换乒乓结构的512块18Kb的BRAM,总共节省了511块BRAM,原先需要1024块BRAM现在只需513块BRAM即可实现,BRAM资源使用下降接近50%,进一步地可以将整个512×512的实对称矩阵特征值分解任务部署在FPGA内部高速运行,省去了FPGA与外部存储之间需要不断的来回搬移中间计算结果。
本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。
- 基于FPGA的实对称矩阵特征值分解的数据存储方法
- 基于FPGA的实对称矩阵的特征值分解的并行实现方法