Mar*_* A. 3 c++ cuda matrix blas cublas
我正在尝试使用CUBLAS来总结两个未知大小的大矩阵.我需要一个完全优化的代码(如果可能的话)所以我选择不重写矩阵加法代码(简单)但是使用CUBLAS,特别是允许对A和C求和的cublasSgemm函数(如果B是单位矩阵):*C = alpha*op(A)*op(B)+ beta*c*
问题是:C和C++以行主格式存储矩阵,而cublasSgemm旨在(以便兼容)以列主格式工作.你可以指定A和B是否首先被转置,但你不能指示转置C.所以我无法完成我的矩阵添加..
我不能自己转置C矩阵,因为矩阵最大尺寸为20000x20000.
有关如何解决的任何想法吗?
如果你只是添加矩阵,它实际上并不重要.你给它alpha,Aij,beta和Cij.它认为你给它alpha,Aji,beta和Cji,并给你它认为是Cji = beta Cji + alpha Aji.但就你而言,那是正确的Cij.我担心的是当你开始做有关事的事情 - 比如矩阵产品.在那里,可能没有解决它.
但更重要的是,你不想使用GEMM进行矩阵加法 - 你正在做一个完全没有意义的矩阵乘法(需要大约20,000个3次操作,许多次通过内存)才能进行操作需要~20,000次2次操作和一次通过!将matricies视为20,000 ^ 2长矢量并使用saxpy.
矩阵乘法是内存带宽密集型的,因此在自己编码和调优版本之间存在巨大的(10倍或100倍)性能差异.理想情况下,您需要更改代码中的结构以匹配库.如果你不能,在这种情况下,你可以只使用线性代数身份进行管理.C-vs-Fortran排序意味着当你传入A时,CUBLAS"看到"A T(转置).哪个好,我们可以解决它.如果你想要的是C = AB,那么以相反的顺序传入基础,即BA.然后该库看到(B Ť甲.Ť),并计算c Ť =(AB)Ť ; 然后当它传回C T时,你得到(在你的订购中)C.测试并查看.