并行与分布式系统中的并行矩阵乘法:Cannon算法
字数 2017 2025-11-11 19:30:34
并行与分布式系统中的并行矩阵乘法:Cannon算法
题目描述
Cannon算法是一种用于并行与分布式系统的矩阵乘法算法,特别适用于网格拓扑的多处理器环境。该算法通过将输入矩阵分块并循环移位这些块,使每个处理器能够在本地计算部分结果,最终通过累加得到完整的矩阵乘积。其核心目标是减少通信开销,提高并行效率。假设有两个大矩阵 \(A\) 和 \(B\)(尺寸均为 \(n \times n\)),需要计算 \(C = A \times B\)。系统由 \(p \times p\) 个处理器组成网格(通常 \(p \ll n\)),每个处理器存储矩阵的一个分块(尺寸为 \(m \times m\),其中 \(m = n/p\))。算法需解决分块间的数据依赖问题,避免全局通信。
解题过程
-
初始化与分块分配
- 将矩阵 \(A\) 和 \(B\) 均匀分块为 \(p \times p\) 个子矩阵,每个子矩阵记为 \(A_{i,j}\) 和 \(B_{i,j}\)(\(i, j \in [0, p-1]\))。
- 将处理器组织成 \(p \times p\) 的网格,处理器 \(P_{i,j}\) 初始存储分块 \(A_{i,j}\) 和 \(B_{i,j}\)。
- 目标:每个处理器 \(P_{i,j}\) 最终计算分块 \(C_{i,j} = \sum_{k=0}^{p-1} A_{i,k} \times B_{k,j}\)。但直接计算需要全局通信(例如收集所有 \(A_{i,k}\) 和 \(B_{k,j}\)),效率低下。
-
分块循环移位(对齐阶段)
- Cannon算法通过循环移位使每个处理器在本地逐步积累部分积,减少通信次数。
- 步骤1:初始偏移
- 对矩阵 \(A\):将第 \(i\) 行的分块向左循环移动 \(i\) 位。即处理器 \(P_{i,j}\) 将原存储的 \(A_{i,j}\) 发送给 \(P_{i, (j-i) \mod p}\),并接收来自 \(P_{i, (j+i) \mod p}\) 的分块。
- 对矩阵 \(B\):将第 \(j\) 列的分块向上循环移动 \(j\) 位。即处理器 \(P_{i,j}\) 将原存储的 \(B_{i,j}\) 发送给 \(P_{(i-j) \mod p, j}\),并接收来自 \(P_{(i+j) \mod p, j}\) 的分块。
- 移位后,处理器 \(P_{i,j}\) 本地持有分块 \(A_{i, (j+i) \mod p}\) 和 \(B_{(i+j) \mod p, j}\)。此步骤确保后续计算中所需的分块对逐步对齐。
-
迭代计算与移位
- 算法进行 \(p\) 次迭代。在每次迭代 \(k\)(\(k = 0\) 到 \(p-1\))中:
- 步骤2:本地矩阵乘法
- 每个处理器 \(P_{i,j}\) 将当前本地存储的 \(A\) 分块和 \(B\) 分块相乘,将结果累加到本地 \(C_{i,j}\) 中(初始 \(C_{i,j} = 0\))。
- 步骤3:分块循环移位
- \(A\) 分块:每个处理器将当前 \(A\) 分块向左循环移动1位(发送给左侧邻居,从右侧邻居接收)。
- \(B\) 分块:每个处理器将当前 \(B\) 分块向上循环移动1位(发送给上方邻居,从下方邻居接收)。
- 移位后,处理器获得新的分块对,用于下一次迭代的乘法。
- 步骤2:本地矩阵乘法
- 原理:经过 \(k\) 次移位,处理器 \(P_{i,j}\) 持有的 \(A\) 分块原属于 \(A_{i, (j+i+k) \mod p}\),\(B\) 分块原属于 \(B_{(i+j+k) \mod p, j}\)。当 \(k\) 遍历 \(0\) 到 \(p-1\) 时,所有必要的 \(A_{i,*}\) 和 \(B_{*,j}\) 分块均被组合一次,覆盖全部 \(p\) 个乘积项。
- 算法进行 \(p\) 次迭代。在每次迭代 \(k\)(\(k = 0\) 到 \(p-1\))中:
-
终止与结果收集
- 完成 \(p\) 次迭代后,每个处理器 \(P_{i,j}\) 的本地 \(C_{i,j}\) 即为最终分块结果。
- 无需额外通信,若需集中结果,可将所有 \(C_{i,j}\) 发送到主处理器。
关键点
- Cannon算法通过循环移位将通信局部化(仅邻处理器通信),避免全局数据交换。
- 总通信开销为 \(O(p \times m^2)\),优于朴素方法的 \(O(p^2 \times m^2)\)。
- 假设处理器网格为环面拓扑(边界循环连接),确保移位连续性。