论文阅读:稀疏矩阵向量乘法在申威众核架构上的性能优化

稀疏矩阵向量乘法在申威众核架构上的性能优化

文章链接:

稀疏矩阵向量乘法在申威众核架构上的性能优化 - 中国知网 (cnki.net)

文章总结

固定划分方法

  1. 所有计算完再写回
  2. 子矩阵(任务)->子矩阵小块(核心计算)
  3. 将子矩阵小块中的非零元存储在一起,以适应申威处理器上的DMA操作。(Packing)
  4. 核心:寄存器通信->RMA
  5. 根据LDM大小提前计算,充分利用LDM空间,换句话说就是保证计算所需都在LDM中
  6. 加载冗余X,避免DMA隔断

一维负载均衡划分方法

  1. 尽量使从核处理非零元数量相当
  2. 4个层次:原矩阵->矩阵带->子矩阵->小块
  3. 交替分配矩阵带给从核行
  4. 核心计算依然是子矩阵小块,同固定划分方法

二维负载均衡划分方法

  1. 矩阵带分配采取贪心的方法,尽可能保证不同行之间的负载均衡
  2. 解决一维负载均衡方法带来的细粒度同步问题
  3. 非零元过少的矩阵带,交给一个从核完成,而不再均分给同行上的几个从核
  4. 一维和二维主要解决预处理,计算还是固定划分中的子矩阵小块
  5. 排序->根据矩阵带非零元数量从大到小排序(逻辑排序)
  6. Select函数会在所有ROWS行的从核中,选择出目前非零元数量最少的一行,并将当前的矩阵带i分配给它
1
2
3
4
5
6
7
8
输入:tiles,nnz_tile,ROWS
输出:set
nnz_set<-0
for i = 0 to tiles - 1 do
Select id if nnz_set[id] is minimal //注意:这里是选从核行,不是矩阵带
nnz_set[id] += nnz_tiles[i]
set[id] = set[id]U{i} //任务分配
end for

这里注意,我们在固定划分那里解决了数据局部性差等问题,之后的一二维划分,都是在做任务分配,核心计算子矩阵小块一直未改变