求问有谁知道CU-BLAS中矩阵乘法的实现方式
图那丁吧
全部回复
仅看楼主
level 7
我算是和矩阵乘法杠上了。
起因是很久之前发现使用1080TI计算float矩阵乘法误差会比CPU大,刚开始以为是老黄在浮点运算上动了手脚降低精度,后来查阅CUDA文档确认默认按IEEE-754来的,即四则运算FMA都是round to nearest, 简单的向量加减甚至内积计算结果都与CPU的一毛一样,一个位都不变。(这部分是matlab实现的,matlab内部调用cuda)
问题来了,按GPU的结构矩阵乘法的分块只会比CPU更多,我使用的是0-1间均匀分布的随机矩阵,更多的分块理论上误差应该会更小些。
我所知道的只剩一种可能,CU-blas使用了strassen类的算法。我拿出自己之前写的strassen代码,4096x4096的double矩阵,strassen递归到分块为64时与MKL/OPENBLAS得到的结果相差大约为Openblas与mkl之间差别的10倍(frobenius范数)。
理论上显卡的结构对strassen这类算法也是有利的,所以老黄的cu-blas里是否使用了strassen算法?
2019年02月22日 08点02分 1
level 11
不懂帮顶
2019年02月22日 13点02分 2
level 14
不懂[泪]
2019年02月24日 15点02分 3
level 7
自己测试了下,不恰当的矩阵乘法实现,或者strassen算法都会增加测试中的误差。调整分块大小,strassen递归层数误差会随之变化,误差范围涵盖了GPU所得的误差,但无法准确重现GPU的误差。且其结果与GPU结果之差大于以上这些误差。
针对strassen算法恶意构造的矩阵实测可以放大自己的strassen算法误差,但对GPU的误差没有影响。
所以就算CUBLAS使用了strassen算法,其实现方式也与我写的不一样。更可能是计算路径不一样导致误差大了点。
2019年02月27日 03点02分 4
level 9
github上一翻一大堆。如果用CPU运算的话,记得调用AVX2指令集。
AVX2比SSE4.2估计少说也要快10倍
https://software.intel.com/zh-cn/articles/intel-sdm
https://docs.microsoft.com/zh-cn/previous-versions/hh977023(v=vs.140)
2019年02月28日 23点02分 5
自己手写对接近方阵行列数适中时速度是库函数的70%,用的是反汇编看到的MKL内部分块乘法汇编代码。现在关心的不是速度,是误差和具体的实现方式,因为不会GPU的调试/反汇编所以不好猜测实现过程。
2019年03月01日 02点03分
level 10
感觉进错了吧
2019年03月02日 15点03分 6
1