热度 17
2016-1-20 16:59
4358 次阅读|
0 个评论
上一篇说到一个基本的小知识点浮点到定点的转换,这一篇来说说矩阵乘法。矩阵乘法和下一篇要说的矩阵LU分解是矩阵求逆的重要组成部分,所以就算大家不需要做矩阵求逆,对其先有个整体的认识也是好的。(矩阵求逆的整体框图还是很好理解的 ,甚至你只要瞟一眼图就好)。 1 矩阵求逆的整体框图 矩阵求逆的步骤如下: 1. 原始矩阵 A 通过 LU 分解为上三角矩阵 L 与单位下三角矩阵 U 。 2. 分别通过三角矩阵的求逆运算得到 L 逆和 U 逆。 3. 最后通过矩阵乘法得到 A 逆。 显而易见,矩阵求逆由如下三个部分组成: 1. LU 矩阵分解 2. 三角矩阵求逆 3. 矩阵乘法 2 脉动阵列介绍 做矩阵运算,脉动阵列绝对是个神器,笔者大部分的时间是花在脉动阵列上面的,脉动阵列主要完成算法到结构的映射,而这种结构的设计往往是最难的, 值得一提的是,大部分矩阵运算的脉动阵列都已经被设计出,有的甚至不止一种结构。下面简单介绍脉动阵列,如果感兴趣的可以深入研究。 脉动阵列:多个相同的处理单元( PE ),按照一定的规则组成的网络,成为脉动阵列。脉动阵列可以是一维线性、二维三角形、二维矩形、二维六边形等等。 特点: 1. 每一个节点,即 PE ,都是相同的,(个别也可以不同)。 2. 每个 PE 只与其邻近的 PE 进行通信,也就是说 PE 之间的通信具有局部性,而且通信是规则的。这点非常重要!!! 3. 每个 PE 都有其局部的储存器,也就是 PE 的某些边带有延时,延时在硬件上对应于寄存器。 由于以上特点,造成 PE 之间的高度流水化、规则化,因此系统吞吐率非常大且易于 VLSI 的实现。 3 矩阵乘法模块 3.1 矩阵乘法的数学表达式 从公式上可以看出,计算后的矩阵的每个单元( i , j )是矩阵 A 的第 i 行矩阵与矩阵 B 的第 j 列对应元素的乘积和。 可以看出,矩阵乘法的计算规则化,数据间的通讯具有局部化的特点,因此很适合用脉动阵列来实现。 3.2 乘法脉动阵列的设计 根据算法的特点,设计二维方形的脉动阵列,如下图所示:从上到下,从左到右分别流经矩阵 A 、 B 的数据。处理单元 PE 则保存结果矩阵 C ,处理单元以矩阵 C(i,j) 命名,初始值均为 0 。设计好的脉动这列图与以及每个时刻详细的步骤如下: 乘法脉动阵列图 注: * 号代表延时一拍 下面给出计算数据流向与结果的示意图 1. 时刻 1 数据 a11 、 b11 进入 PE 单元,计算并更新 PE ,将数据保存在 PE 中。 2. 时刻 2 数据 a11 继续向右流入 C12 ,与向下流入的 b22 做运算将结果更新保存在 C12 。数据 a21 流入处理单元 C21 , b11 继续向下流动,与 a21 做同样的运算并更新保存 C21 。而此时 C11 保存的是 a11*b11+a12*b21 的结果。 依次向下向右流动,经过 3*n-2 个时钟周期得到结果矩阵 C ,相比串行执行的时间复杂度 (n^3) ,阶数越多,时间缩短的越多。值得说明的是,该阵列中所有处理单元所完成的功能相同,均为乘加运算。 3.3模块的 测试 测试模块包括:矩阵生成模块,定点转浮点模块,矩阵乘积模块(核心模块),浮点转定点。通过matlab仿真与modelsim的结果对比,验证其正确性。 上一篇《 矩阵系列之开篇浮点转定点 》