并行与分布式系统中的并行矩阵乘法:Systolic阵列算法
字数 1498 2025-11-29 11:08:51
并行与分布式系统中的并行矩阵乘法:Systolic阵列算法
题目描述
设计一个并行算法,使用Systolic阵列(脉动阵列)结构高效计算两个稠密矩阵的乘法。给定矩阵A(m×n)和矩阵B(n×p),目标是在一个由处理单元(PE)构成的网格上并行计算C = A × B,其中每个PE仅与邻居通信,且数据在网格中有节奏地"流动"(脉动),从而减少全局内存访问和通信开销。
解题过程循序渐进讲解
-
问题分析与Systolic阵列概念
- 矩阵乘法C = A × B中,每个元素c[i][j] = Σ_{k=1}^{n} a[i][k] × b[k][j]。直接并行化需处理O(m×n×p)计算量。
- Systolic阵列是一种规则的处理单元网格(如二维网格),每个PE只与相邻PE连接,数据按固定节奏同步流动。优势包括:局部通信、流水线并行、高硬件利用率。
- 关键思想:将矩阵A的行和矩阵B的列输入到网格中,使它们在PE处相遇并累乘,结果逐步累积在C的元素中。
-
Systolic阵列结构设计
- 假设使用m×p的PE网格(每个PE负责计算C的一个元素)。但为优化资源,常使用更小网格(如n×n),通过时间复用处理大矩阵。
- 标准设计:PE排列成二维网格(行标i、列标j),每个PE存储累加值c[i][j],并传递数据:
- A的元素从左向右流动(每行向右传递)。
- B的元素从上向下流动(每列向下传递)。
- C的元素初始为0,在PE中局部累加。
-
数据流动与计算步骤
- 步骤1:初始化数据流
- 矩阵A的第i行元素从网格左侧第i行输入,每隔一个时间步向右移动至相邻PE。
- 矩阵B的第j列元素从网格上方第j列输入,每隔一个时间步向下移动。
- 输入时需对齐:A的元素a[i][k]在时间步t = i + k - 1到达PE(i,j),B的元素b[k][j]在t = k + j - 1到达同一PE。
- 步骤2:PE内部操作
- 每个PE在每个时间步执行:
- 从左侧接收A的元素,从上方接收B的元素。
- 若收到有效数据,计算乘积并加到局部累加器c[i][j]。
- 将A的元素传递给右侧邻居,B的元素传递给下方邻居。
- 示例:PE(i,j)在时间步t同时收到a[i][k]和b[k][j]时,计算a[i][k] × b[k][j]并累加至c[i][j]。
- 每个PE在每个时间步执行:
- 步骤3:输出结果
- 经过T = m + n + p - 2时间步后,所有乘积项累加完成。结果c[i][j]从PE(i,j)输出(或最后一步读取)。
- 步骤1:初始化数据流
-
示例与复杂度分析
- 以2×2矩阵为例:
- A = [[a11, a12], [a21, a22]], B = [[b11, b12], [b21, b22]]。
- 时间步1:PE(1,1)接收a11和b11,计算a11×b11。
- 时间步2:PE(1,1)接收a12和b21,计算a12×b21并累加;同时PE(1,2)接收a11和b12,PE(2,1)接收a21和b11。
- 时间步3:所有PE完成累加,如PE(1,1)输出c11 = a11×b11 + a12×b21。
- 时间复杂度:O(m + n + p)(基于流水线长度),优于串行O(mnp)。
- 空间复杂度:PE数O(m×p),每个PE存储常数数据。
- 以2×2矩阵为例:
-
优化与扩展
- 资源优化:若PE数有限,可循环复用网格(分块矩阵乘法)。
- 异步变体:支持异步数据流以处理异构系统,但需额外同步。
- 错误容忍:通过检查点机制处理PE故障。
通过Systolic阵列,矩阵乘法变为高效、局部的数据流动过程,适用于FPGA或ASIC等硬件实现。