4

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

问题是:C 和 C++ 以行优先格式存储矩阵,cublasSgemm 旨在(为了与 fortran 兼容)以列优先格式工作。您可以指定是否要先转置 A 和 B,但不能指示转置 C。所以我无法完成矩阵加法..

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

请问有什么办法解决吗?

4

2 回答 2

7

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

于 2012-09-26T16:10:39.783 回答
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(A 转置)。这很好,我们可以解决它。如果您想要的是 C=AB,则以相反的顺序传入矩阵 BA 。然后库看到 (B T . A T ),并计算 C T = (AB) T;然后当它传回 C T时,你得到(在你的订购中) C。测试它看看。

于 2011-03-29T23:46:13.993 回答