2011-03-25 98 views
2

我正在尝试使用CUBLAS来计算未知大小的两个大矩阵。我需要一个完全优化的代码(如果可能),所以我选择不重写矩阵加法代码(简单),而是使用CUBLAS,尤其是cublasSgemm函数,它允许A和C相加(如果B是单位矩阵):* C = alpha * op(A)* op(B)+ beta * c *CUBLAS - 矩阵加法..怎么样?

问题是:C和C++以行主格式存储矩阵,cublasSgemm的目的是为了Fortran兼容性,主要格式。你可以指定A和B是否先被转置,但是你不能指示转置C.所以我无法完成我的矩阵加法。

我不能转置我自己的C矩阵,因为矩阵最大尺寸为20000x20000。

关于如何解决请任何想法?

+0

如果你只是添加了matricies,那实际上并不重要,对吧?你给它alpha,Aij,beta和Cij。它意味着你给它alpha,Aji,beta和Cji,并给你它认为是Cji = beta Cji + alpha Aji。但就你而言,这是正确的Cij。我担心的是,当你开始讨论重要的事情时 - 比如矩阵产品。在那里,有可能没有解决它。 – 2011-03-25 21:38:26

+3

但更重要的是,你不希望使用GEMM做矩阵_addition_ - 你正在做一个完全没有意义的矩阵乘法(需要花费大约20,000^3次操作并且很多次通过内存)一次性通过20,000^2次操作!将基质视为20,000^2长的载体并使用松软。 – 2011-03-25 21:43:32

+0

非常感谢你的松软解决方案,它非常棒!所以用cublas实现(性能)矩阵乘法是完全不可能的,对吧?我应该自己编码? – 2011-03-25 22:27:24

回答

5

如果你只是添加矩阵,它并不重要。你给它alpha,Aij,beta和Cij。它认为你给它alpha,Aji,beta和Cji,并给你它认为是Cji = beta Cji + alpha Aji。但就你而言,这是正确的Cij。我担心的是,当你开始去做重要的事时 - 比如矩阵产品。在那里,有可能没有解决它。

但更重要的是,您不希望使用GEMM来进行矩阵加法 - 您正在做一个完全没有意义的矩阵乘法(这需要大约20,000次操作和很多遍历内存)对于一个操作人员来说,这个操作人员只需要操作一次就可以完成大约20,000次!将基质视为20,000^2长的载体并使用松软。

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

5

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