Skip to main content

PA4: 稀疏矩阵-矩阵乘

Course WorkCUDAIntroduction to High Performance ComputingSpMMAbout 1 minAbout 427 words

优化策略

warp divergence

ref 实现中的 warp divergence 主要是因为将不同行归入一个 warp 计算, 而不同行的 NNZ 可能有很大差异, 产生 warp divergence. 因此, 只要避免将不同行划入同一 warp 即可. 因此, 令 block.x = 1, 使每个 thread block 至多处理一行数据.

如图中 ref 与 phase_1 对比, 提升有限.

shared memory

在 SpMM 中, 稀疏矩阵的一个元素代表了对于稠密矩阵的一行的访问. 因此可以将稀疏矩阵的一部分缓存在 shared memory 中, 以减少重复从 global memory 中读取稀疏矩阵.

如图中 phase_2, 效果拔群.

load imbalance

稀疏矩阵不同行的 NNZ 可能有很大差异, 因此考虑将较大的行进一步划分, 将稀疏矩阵的一行分割为多个 Task, 分配到多个线程中处理, 再使用 atomicAdd 归约. 为了减少同一行被连续线程处理导致 atomic 冲突频繁, 我们可以将 Task 打乱.

如图中 opt, 获得了进一步提升.

opt
opt

Performance

speedup
speedup

kLen = 32

Datasetref timeopt timespeedup
arxiv0.0007726550.0003820112.0225988256882657
collab0.001331050.0007478541.7798260088199034
citation0.01644880.01097641.4985605480849822
ddi0.0007053770.0002335543.0201880507291676
protein0.02464450.01360071.8120023234098244
ppa0.01838610.01031181.783015574390504
reddit.dgl0.04866430.02112762.303352013479998
products0.05582780.03344611.669187139905699
youtube0.003644720.002741291.3295638184942127
amazon_cogdl0.1252640.05220252.399578564245007
yelp0.006580280.003782411.7397056374110687
wikikg20.007144360.004853931.4718712465981172
am0.003740.002261761.6535795132993776

kLen = 256

Datasetref timeopt timespeedup
arxiv0.00300070.002972161.0096024440137812
collab0.005202260.005870650.8861471898341752
citation0.07887060.1190140.6627001865326768
ddi0.001560620.001595440.978175299603871
protein0.08080610.1126180.7175238416594151
ppa0.08497940.08396211.0121161809911854
reddit.dgl0.2023410.1742221.1613975272927644
products0.2584690.2749670.9400000727360011
youtube0.01441810.02200680.6551656760637621
amazon_cogdl0.5170860.4240541.2193871535229006
yelp0.0299760.03055690.980989563731923
wikikg20.01665030.03871690.4300525093692935
am0.01342640.01827730.7345942781483041