我正在尝试使用CUBLAS对两个未知大小的大矩阵求和。我需要一个完全优化的代码(如果可能的话)所以我选择不重写矩阵加法代码(简单)但是使用CUBLAS,特别是允许对A和C求和的cublasSgemm函数(如果B是单位矩阵):* C = alpha * op(A)* op(B)+ beta * c *
问题是:C和C ++以行主格式存储矩阵,而cublasSgemm旨在(以便兼容)以列主格式工作。你可以指定A和B是否首先被转置,但你不能指示转置C.所以我无法完成我的矩阵添加..
我不能自己转置C矩阵,因为矩阵最大尺寸为20000x20000。
有关如何解决的任何想法吗?
答案 0 :(得分:6)
答案 1 :(得分:5)
如果你只是添加矩阵,它实际上并不重要。你给它alpha,Aij,beta和Cij。它认为你给它alpha,Aji,beta和Cji,并给你它认为是Cji = beta Cji + alpha Aji。但就你而言,那是正确的Cij。我担心的是当你开始做有关事的事情 - 比如矩阵产品。在那里,可能没有解决它。
但更重要的是,你不想使用GEMM进行矩阵加法 - 你正在做一个完全没有意义的矩阵乘法(需要大约20,000个 3 操作和许多通过记忆)进行操作,只需要~20,000 2 操作和一次通过!将基质视为20,000 ^ 2长的向量并使用saxpy。
矩阵乘法是内存带宽密集型的,因此在自己编码和调优版本之间存在巨大的(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。测试并查看。