并行与分布式系统中的并行稀疏矩阵-向量乘法(SpMV):基于行划分的并行算法
字数 1341 2025-11-10 14:41:09
并行与分布式系统中的并行稀疏矩阵-向量乘法(SpMV):基于行划分的并行算法
题目描述
稀疏矩阵-向量乘法(SpMV)是科学计算中的核心操作,形式为 \(y = A \times x\),其中 \(A\) 是大型稀疏矩阵(绝大多数元素为0),\(x\) 和 \(y\) 是稠密向量。在并行分布式环境中,矩阵 \(A\) 和向量 \(x, y\) 被划分到多个处理器上。本题要求设计一个基于行划分的并行SpMV算法,实现高效的计算和通信。
解题过程
-
问题分析
- 稀疏矩阵的存储需节省空间,常用压缩存储格式(如CSR)。
- 并行挑战:每个处理器分配矩阵的一部分行,但计算时需要访问全局向量 \(x\) 的某些元素,可能涉及跨处理器通信。
- 目标:最小化通信开销,平衡各处理器负载。
-
数据划分
- 行划分策略:将矩阵 \(A\) 按行块划分给 \(P\) 个处理器。例如,处理器 \(P_i\) 获得行块 \(A_i\),并负责计算对应的输出子向量 \(y_i\)。
- 向量分布:输入向量 \(x\) 被复制或划分到各处理器。若 \(x\) 的某个元素被多个处理器需要,需通过通信获取。
-
本地计算准备
- 每个处理器解析本地行块 \(A_i\) 的非零元结构,确定需要从其他处理器获取的 \(x\) 的元素集合(称为"外部依赖")。
- 例如,若 \(A_i\) 的某非零元位于列 \(j\),且 \(x_j\) 不在本地,则需标记 \(j\) 为需获取的索引。
-
通信优化
- 邻居通信模式:各处理器向拥有所需 \(x\) 元素的处理器发送请求,仅获取必要数据,避免全广播。
- 数据聚合:将所需索引按目标处理器分组,合并通信消息,减少网络延迟开销。
-
计算与通信重叠
- 异步通信:在等待接收非本地 \(x\) 元素时,先使用本地可用的 \(x\) 元素进行计算,隐藏通信延迟。
- 步骤:
a. 启动非本地数据的异步接收请求。
b. 同步计算依赖本地 \(x\) 元素的部分结果。
c. 等待通信完成,补充计算剩余部分。
-
本地SpMV计算
- 使用CSR格式高效计算:
- 数组
val存储非零元,col_ind存储列索引,row_ptr标记行起始位置。 - 对本地每行 \(k\):
- 数组
- 使用CSR格式高效计算:
\[ y[k] = \sum_{j=\text{row\_ptr}[k]}^{\text{row\_ptr}[k+1]-1} \text{val}[j] \times x[\text{col\_ind}[j]] \]
- 若某些 \(x\) 元素非本地,暂存部分和,待数据到位后累加。
- 全局同步与结果收集
- 各处理器完成本地 \(y_i\) 计算后,若结果需全局聚合,则通过规约操作(如MPI_Gather)汇总到根处理器。
- 若后续计算需分布式 \(y\),可保持分布状态。
关键点
- 负载均衡:通过矩阵非零元分布优化行划分(如METIS图划分工具)。
- 通信压缩:仅传输必要的向量元素,索引重排序可提升局部性。
- 扩展性:算法适用于大规模分布式系统,需结合具体通信库(如MPI)实现。