论文阅读:面向国产申威 26010 众核处理器的 SpMV 实现与优化

面向国产申威 26010 众核处理器的 SpMV 实现与优化

文章链接:

面向国产申威26010众核处理器的SpMV实现与优化 - 中国知网 (cnki.net)

文章总结

存储格式:CSR

数据名称定义:

  • col:非零元的列号
  • data:非零元数值,连续存放
  • row_off:x数组,每行第一个元素前面的非零元素,最后一个rowoff代表总的非零元素
  • vec:计算向量
  • y:结果向量
  • rows:行号
  • srow:为当前申威处理器一个从核的 LDM 可以容纳的最多稀疏行大小

X动静态buffer

x静态buffer,初始化后一直不改变。(论文中有两种初始化方法)

x动态buffer,未命中,则用dma更新x动态buffer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//slave.c
LDM->malloc x_sbuffer //x静态buffer
LDM->malloc x_dbuffer //x动态buffer
sstart,send,dstart,dend
dma(vec->x_sbuffer,sstart,send)
dma(vec->x_dbuffer,dstart,dend)
for srow
for row
if(in x_sbuffer)
cal
else if(in x_dbuffer)
cal
else
update_dma(vec->x_dbuffer,dstart,dend)
cal
store

负载均衡

动静态划分

第一轮静态:每个从核分配相同的任务量即srow

后续采用动态:哪个从核先计算完,就先从任务池里面拿新的任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//slave.c
eg:64个从核
task_num //任务数
now_addr //当前任务计算到哪里了
//第一轮 每个从核执行相同的任务量即srow

cal srow

//其余任务保存到任务池,用锁保护,实现互斥操作

//任务池,当task_num为0时计算完毕
mutex = 1
P(mutex)
//互斥区
task_num
now_addr
V(mutex)
//取now_addr
cal srow
//随后 继续loop,直到task_num为0