现在的位置: 首页 > 综合 > 正文

cublasSgemm处理C中按行存储的矩阵乘法

2013年02月25日 ⁄ 综合 ⁄ 共 927字 ⁄ 字号 评论关闭

    

    由于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的行);


得到的结果C都是按列存储的。

    总结:如果前边的参数是't',那么leading dimesion 就是矩阵的列数,因为此时的矩阵是按照C语言以行优先的方式来存储的;反之如果前边的参数是'n',那么leading dimesion 就是矩阵的行数,此时的矩阵保持CUBLAS的列优先存储方式。


抱歉!评论已关闭.