[daily paper 7]2023 03 05 2011 109 CSX An Extended Compression Format for SpMV on Shared Memory Sys

论文链接

这篇论文讲了一种新的格式Compressed Sparse eXtended(CSX),这种格式把矩阵在行、列、主副对角线、分块上的结构都识别了出来,然后分别用不同的方式存储。

CSX基于CSR-DU格式,这种格式记录的是列坐标之间的差,因此数值更小。如果都不超过256,那么可以用一个Byte存储。256而不是255是因为列坐标的差不为零,所以0可以代表256。一般处理器都有分支预测,所以这个判断并不影响速度。下面是图示:

在这里插入图片描述

CSX在CSR-DU的理念上进行了扩展,不仅探测行上的结构单元,还探测列、主副对角线、分块上的稠密单元。这些不同的探测方向被CSX用一套滑动窗口的框架统一了。

CSX的另一个理念是在进行多步迭代之前,使用LLVM在线生成CSR格式的稀疏矩阵的矩阵乘法计算代码。虽然这个编译优化是要占用不少时间的,但是由于很多迭代算法会一直使用同一个矩阵,所以有可能整体上降低计算时间。LLVM能优化什么呢?我觉得应该是稀疏矩阵上面常量的一些优化,比如乘2/4/8改成位移,以及一些连续元素的向量操作优化。既然可以现场编译,我觉得也可以JIT,这可能也是一个研究方向。

CSX统一探测的基础在于水平方向上的探测,如下图所示:

在这里插入图片描述

Figure 5中,41 61 81不能被探测到,因为长度不够。1 21 41 61 81也不能被探测出来,因为为了算法运行的效率,不支持这样的overlapped run。探测出来间隔一样的,应该是为了压缩,这样只用记录间隔为多少,有几个就行了。

对于列、对角线的方法都一样,对角线的话是分成不同对角线,对每个对角线分别探测。探测分块有两点不一样,一是步长只能为1,另外只能探测到一整个矩形,因为不对齐的矩形会增加额外的复杂度。2D探测图示:

在这里插入图片描述

将特征提取出来之后,就是用LLVM编译并优化不同的部分,然后进行计算,论文中没有细讲。

论文还提供的一个重要的信息,我们知道SpMV的瓶颈在于内存带宽,论文中提到核数越多,内存带宽的影响就越大。其实也很好理解,核数多了算得就快,但还是一个内存,带宽的问题就凸显了。

总结一下,论文的主要思想在于将矩阵在不同方面的特征都提取出来,如行、列、主副对角线、分块等。另一个思想在于在多次使用同一稀疏矩阵的时候,提前进行优化。缺点是提取的特征越详尽就越花费时间,提前优化也是同样。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一个语言模型AI,无法编写和运行程序。但我可以给你提供思路和代码示例: 思路: 1. 定义一个学生类,包括学号、姓名、成绩1、成绩2、成绩3、总分和平均分属性; 2. 在程序中定义一个列表用于存储输入的学生信息; 3. 通过循环输入学生信息直到输入学号为'#林好'为止,并将输入的学生信息保存到列表中; 4. 将列表中的学生信息写入到文件khl-csx中; 5. 从kh1.csv中读取学生信息,计算每个学生的总分和平均分,并将结果保存到列表中; 6. 将列表中的学生信息写入到文件h2.csx中。 代码示例: ```python import csv import math class Student: def __init__(self, id, name, score1, score2, score3): self.id = id self.name = name self.score1 = score1 self.score2 = score2 self.score3 = score3 self.total_score = score1 + score2 + score3 self.avg_score = round(self.total_score / 3, 2) def __str__(self): return f'{self.id}, {self.name}, {self.score1}, {self.score2}, {self.score3}, {self.total_score}, {self.avg_score}' students = [] # 输入学生信息,保存到列表中 while True: id = input('请输入学号:') if id == '#林好': break name = input('请输入姓名:') score1 = float(input('请输入成绩1:')) score2 = float(input('请输入成绩2:')) score3 = float(input('请输入成绩3:')) student = Student(id, name, score1, score2, score3) students.append(student) # 将学生信息写入文件 with open('khl-csx', 'w', newline='') as file: writer = csv.writer(file) for student in students: writer.writerow([student.id, student.name, student.score1, student.score2, student.score3]) # 从文件中读取学生信息,计算总分和平均分,并保存到列表中 students = [] with open('kh1.csv', newline='') as file: reader = csv.reader(file) for row in reader: id = row[0] name = row[1] score1 = float(row[2]) score2 = float(row[3]) score3 = float(row[4]) student = Student(id, name, score1, score2, score3) students.append(student) # 将学生信息及总分、平均分写入文件 with open('h2.csx', 'w', newline='') as file: writer = csv.writer(file) writer.writerow(['学号', '姓名', '成绩1', '成绩2', '成绩3', '总分', '平均分']) for student in students: writer.writerow([student.id, student.name, student.score1, student.score2, student.score3, student.total_score, student.avg_score]) ``` 注意事项: 1. 文件的路径和名称需要根据实际情况进行修改; 2. 在写入csv文件时,需要使用csv.writer对象进行写入,可以避免出现转义字符等问题; 3. 在读取csv文件时,需要使用csv.reader对象进行读取,可以方便地提取每一行的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值