1
基金与大赛
稀疏矩阵乘法结果的精度问题
2022-07-05 17:32:59
116

在稀疏矩阵比较结果时,首先比较了非零元的数目,在非零元数目相同时比较对应位置的元素,如果绝对误差或者相对误差小于1e-9都算是正确的。但是如果非零元数量不同则直接认为是错误的答案,并且判断非零元时判断的是是否严格等于0,由于矩阵A和B的小数点位数都不太多,而且矩阵很大,结果中有可能乘出一个严格等于0的元素,但是如果计算顺序与标准不同则有可能计算不出恰好为0,例如af23560矩阵在随机数种子是101时在(334, 12382)这个位置就恰好为0,但我计算出来得到1e-14也应该在误差接受的范围内,但是根据这种正确性验证方式会导致非零元数量不同而结果不对。而且我不能自己将小于1e-9的元素认为是0,因为结果中也有小于1e-9的非零元。请问能否将结果中大于1e-9的元素才算做非零元以增大容错性,即matrix_to_csr函数时只有当结果大于1e-9时才认为是非零元。或者请问有没有其他的解决办法。

全部评论(2)
只看楼主
M
muhb
1楼

你好,非常感谢您能够提出问题。

你所描述的问题的确是存在的,但是有几个地方需要更正:
首先,matrix_to_csr只处理数据格式转换,通常用来处理输入数据,为了保证不修改原始数据,非零的判断我们设置为严格比对;
其次,matrix_to_csr这个函数对输出矩阵的非零元数量产生影响主要是在CPU对比计算函数的内部,我们经过多次测试,尽管严格比对是否为零,其非零元数量从未出现超出现象,与rocsparse数学库输出的非零元数量一致或小于后者的数量,实际上rocsparse预测的非零元数量也有将很小的接近零的数值统计为非零元的情况;
此外,demo的主体代码仍有一些不规范之处,这也是选手们对精度产生疑虑的主要原因,但主体验证代码并不影响选手的功能实现和验证。

要解决这个问题,我们给出的建议是:
在实现系数矩阵乘函数接口时,选手在内部做一些限定,比如小于10的-12ci次方,具体阈值或算法选手可经过测试自行选择,因为通用数学库不能要求输入数据必须预先处理精度,只能在数学库函数内部建立容错机制,这也是该赛题对输出稀疏矩阵非零元估计的考察内容。

2022/7/7
L
lyc50
回复 @muhb

好的,多谢您的解答

2022/7/9
没有更多内容了
--
楼主
Level.2
0 帖子
楼主热帖
暂无数据