并行与分布式系统中的并行稀疏矩阵-向量乘法(SpMV)算法
字数 1342 2025-11-10 08:54:31
并行与分布式系统中的并行稀疏矩阵-向量乘法(SpMV)算法
题目描述
稀疏矩阵-向量乘法(SpMV)是科学计算和数据分析中的核心操作,形式为 \(y = A \times x\),其中 \(A\) 是稀疏矩阵(大部分元素为0),\(x\) 是输入向量,\(y\) 是输出向量。在并行与分布式系统中,SpMV 的挑战在于如何高效分配矩阵数据和计算任务,以最小化通信开销并平衡负载。
解题过程
1. 问题分析
- 稀疏性影响:矩阵的非零元素(Non-Zeros, NZ)分布不规则,直接按行或列划分可能导致负载不均衡。
- 数据局部性:计算 \(y[i]\) 需要矩阵第 \(i\) 行和向量 \(x\) 的对应元素,若 \(x\) 的元素被多进程使用,需跨节点通信。
- 存储格式:稀疏矩阵的存储格式(如CSR、CSC、COO)影响并行访问效率。
2. 选择并行策略
常用方法包括:
- 按行划分(1D行划分):将矩阵的行块分配给不同进程,每个进程计算本地行与向量 \(x\) 的乘积。
- 通信需求:若某行需要 \(x[j]\) 但 \(j\) 不在本地,需从持有 \(x[j]\) 的进程获取。
- 按列划分(1D列划分):每个进程持有部分列数据,需合并部分结果到 \(y\)。
- 2D划分:将矩阵划分为网格(如块循环分布),平衡通信和计算负载。
3. 以CSR格式的1D行划分为例
步骤3.1 数据分配
- 矩阵 \(A\) 按行块分给 \(P\) 个进程,每个进程存储本地行的CSR数据(行指针、列索引、非零值)。
- 向量 \(x\) 按需分布:若进程需访问非本地的 \(x[k]\),则提前通信聚合所需数据。
步骤3.2 通信优化
- 生成通信模式:
- 每个进程分析本地行所需的 \(x\) 的索引集合 \(S\)。
- 通过全局交换确定每个进程需发送的 \(x\) 的值(如使用MPI_Alltoallv)。
- 重叠通信与计算:异步通信部分 \(x\) 的值,同时计算本地可完成的行。
步骤3.3 本地计算
每个进程遍历本地行:
for i in local_rows:
for j in row_ptr[i] to row_ptr[i+1]-1:
y_local[i] += A_val[j] * x[col_index[j]]
步骤3.4 结果收集
- \(y\) 是分布式结果向量,若需要全局聚合,则通过MPI_Gatherv 收集到根进程。
4. 负载均衡优化
- 动态调整:若行负载差异大(如非零元素数悬殊),使用动态调度(如工作窃取)。
- 矩阵重排序:通过图划分工具(如METIS)对矩阵的行/列重新排序,使非零元素集中在对角块附近,减少通信。
5. 扩展:2D划分策略
- 将进程网格排列为 \(\sqrt{P} \times \sqrt{P}\),矩阵划分为对应块。
- 优点:通信开销从 \(O(P)\) 降为 \(O(\sqrt{P})\)。
- 实现:每个进程仅与同行/列的进程通信,适合大规模系统。
关键挑战与解决方案
- 不规则访问:使用缓存敏感格式(如SELL-C-σ)对行按长度分组,提升向量化效率。
- 通信瓶颈:压缩重复的索引请求,或使用索引编码(如相对索引)减少消息量。
通过结合划分策略、通信优化和存储格式选择,并行SpMV 可显著提升大规模稀疏计算的性能。