C++ CUBLAS-矩阵加法。。怎样?

C++ CUBLAS-矩阵加法。。怎样?,c++,matrix,cuda,blas,cublas,C++,Matrix,Cuda,Blas,Cublas,我试图用库布拉斯求两个未知大小的大矩阵的和。我需要一个完全优化的代码(如果可能的话),所以我选择不重写矩阵加法代码(简单),而是使用CUBLAS,特别是cublasSgemm函数,它允许a和C之和(如果B是单位矩阵):*C=alpha*op(a)*op(B)+beta*C* 问题是:C和C++以矩阵的形式存储矩阵,CuBasAsGM是为了(FORTRAN兼容)以列主格式工作。你可以指定A和B是否首先被转置,但你不能指示转置C。所以我无法完成我的矩阵加法 我自己无法转换C矩阵,因为矩阵的最大大小大

我试图用库布拉斯求两个未知大小的大矩阵的和。我需要一个完全优化的代码(如果可能的话),所以我选择不重写矩阵加法代码(简单),而是使用CUBLAS,特别是cublasSgemm函数,它允许a和C之和(如果B是单位矩阵):*C=alpha*op(a)*op(B)+beta*C*

问题是:C和C++以矩阵的形式存储矩阵,CuBasAsGM是为了(FORTRAN兼容)以列主格式工作。你可以指定A和B是否首先被转置,但你不能指示转置C。所以我无法完成我的矩阵加法

我自己无法转换C矩阵,因为矩阵的最大大小大约为20000x2000


你知道怎么解吗?

如果你只是在加矩阵,那实际上并不重要。你给它alpha,Aij,beta和Cij。它认为你在给它alpha,Aji,beta和Cji,并且给你它认为是Cji=beta Cji+alpha Aji的东西。但就你而言,这是正确的Cij。我担心的是当你开始做一些重要的事情,比如矩阵积。在那里,很可能没有工作

但更重要的是,你不想用GEMM做矩阵加法——你在做一个完全没有意义的矩阵乘法(需要200003次运算,并在内存中多次传递),而这个运算只需要200002次运算和一次传递!将矩阵视为20000^2长的向量,并使用saxpy


矩阵乘法是内存带宽密集型的,所以自己编写和调整版本之间的性能差异很大(10倍或100倍)。理想情况下,您应该更改代码中的结构以匹配库。如果不能,在这种情况下,您可以使用线性代数恒等式进行管理。C-vs-Fortran排序意味着当您传入A时,CUBLAS“看到”了(转置)。这很好,我们可以解决它。如果你想要的是C=A.B,按相反的顺序,B.A,通过矩阵。然后库看到(BT.AT),并计算CT=(A.B)T;然后当它返回CT时,您得到(在您的订单中)C。测试它并查看。

cublasgeam已添加到CUBLAS5.0中。
它计算2个可选转置矩阵的加权和

如果只是添加矩阵,实际上并不重要,对吗?你给它alpha,Aij,beta和Cij。它认为你在给它alpha,Aji,beta和Cji,并且给你它认为是Cji=beta Cji+alpha Aji的东西。但就你而言,这是正确的Cij。我担心的是当你开始做一些重要的事情,比如矩阵积。在这里,可能没有解决方法。但更重要的是,你不想用GEMM做矩阵加法——你在做一个完全没有意义的矩阵乘法(需要大约20000^3个运算和多次内存循环),只需在一次循环中做大约20000^2个运算!将矩阵视为20000^2长的向量并使用saxpy。非常感谢您提供的saxpy解决方案,它非常棒!所以用cublas实现(性能)版本的矩阵乘法是完全不可能的,对吧?我应该自己编码?矩阵乘法是内存带宽密集型的,所以自己编码和优化版本之间的性能差异很大(10倍或100倍)。理想情况下,您应该更改代码中的结构以匹配库。如果不能,可以使用线性代数恒等式。C-vs-Fortran排序意味着当您传入A时,CUBLAS“看到”A^T(转置)。没关系。如果你想要的是C=A.B,请输入B.A。然后库看到(B^T.A^T),并计算C^T=(A.B)^T;然后当它返回C^T时,你得到(在你的订单中)C。测试它,看看。你解决了我的问题,谢谢你,乔纳森,非常感谢!