并行与分布式系统中的并行矩阵乘法: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\))。算法需解决分块间的数据依赖问题,避免全局通信。

解题过程

  1. 初始化与分块分配

    • 将矩阵 \(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}\)),效率低下。
  2. 分块循环移位(对齐阶段)

    • 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}\)。此步骤确保后续计算中所需的分块对逐步对齐。
  3. 迭代计算与移位

    • 算法进行 \(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位(发送给上方邻居,从下方邻居接收)。
      • 移位后,处理器获得新的分块对,用于下一次迭代的乘法。
    • 原理:经过 \(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\) 个乘积项。
  4. 终止与结果收集

    • 完成 \(p\) 次迭代后,每个处理器 \(P_{i,j}\) 的本地 \(C_{i,j}\) 即为最终分块结果。
    • 无需额外通信,若需集中结果,可将所有 \(C_{i,j}\) 发送到主处理器。

关键点

  • Cannon算法通过循环移位将通信局部化(仅邻处理器通信),避免全局数据交换。
  • 总通信开销为 \(O(p \times m^2)\),优于朴素方法的 \(O(p^2 \times m^2)\)
  • 假设处理器网格为环面拓扑(边界循环连接),确保移位连续性。
并行与分布式系统中的并行矩阵乘法: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位(发送给上方邻居,从下方邻居接收)。 移位后,处理器获得新的分块对,用于下一次迭代的乘法。 原理 :经过 \( 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 \) 次迭代后,每个处理器 \( P_ {i,j} \) 的本地 \( C_ {i,j} \) 即为最终分块结果。 无需额外通信,若需集中结果,可将所有 \( C_ {i,j} \) 发送到主处理器。 关键点 Cannon算法通过循环移位将通信局部化(仅邻处理器通信),避免全局数据交换。 总通信开销为 \( O(p \times m^2) \),优于朴素方法的 \( O(p^2 \times m^2) \)。 假设处理器网格为环面拓扑(边界循环连接),确保移位连续性。