由于cublas为了更大的适应Fortan语言,二维数据的存储采用以列优先的方式,这与C/C++中,行优先的存储方式不同。由于本人的研究是数据的来源是C代码得到的,为了加速矩阵的运算效率,利用cublas来完成。本文档提出了一种有效的解决方案。
为了更好的说明,以函数cublasSgemm的实现C= A*B为例。接口cublasSgemm 实现的功能为C = alpha*A*B + beta*C,为了完成C= A*B 的功能,令alpha= 1.0f,beta = 0.0f
利用cublasSgemm的参数 transa(transb) 和 lda(ldb)的设置来共同解决存储方式改变的问题。
第一种:输入矩阵A,B均在CPU上
cublasSgemm('t','t',结果矩阵C的行,结果矩阵C的列,左矩阵A的列, alpha,左矩阵,左矩阵的列,右矩阵,右矩阵的列, beta,结果矩阵,结果矩阵的行);
第二种:输入矩阵A在显存上以column-major的方式存储,B在CPU上
cublasSgemm('n','t',结果矩阵C的行,结果矩阵C的列,左矩阵A的列, alpha,左矩阵A,左矩阵A的行,右矩阵B,右矩阵B的列, beta,结果矩阵C,结果矩阵C的行);
第三种:输入矩阵B在显存上以column-major的方式存储,A在CPU上
cublasSgemm('t','n',结果矩阵C的行,结果矩阵C的列,左矩阵A的列, alpha,左矩阵A,左矩阵A的列,右矩阵B,右矩阵B的行, beta,结果矩阵C,结果矩阵C的行);
第四种:输入矩阵A,B均在显存上,以column-major的方式存储
cublasSgemm('n','n',结果矩阵C的行,结果矩阵C的列,左矩阵A的列, alpha,左矩阵A,左矩阵A的行,右矩阵B,右矩阵B的行, beta,结果矩阵C,结果矩阵C的行);
总结:如果前边的参数是't',那么leading dimesion 就是矩阵的列数,因为此时的矩阵是按照C语言以行优先的方式来存储的;反之如果前边的参数是'n',那么leading dimesion 就是矩阵的行数,此时的矩阵保持CUBLAS的列优先存储方式;
期待cublas的高手们,分享解决该问题的方法,先谢了~