【发布时间】:2014-02-07 01:32:23
【问题描述】:
我有一个应用程序,需要我计算二维矩阵的一些大型 Kronecker 积并将结果乘以大型二维矩阵。我想在 CUDA 的 GPU 上实现它,并且更愿意为此使用经过调整的库实现,而不是编写我自己的(当然不是最佳的)Kronecker 产品。我有 CUDA、BLAS、LAPACK 等方面的经验,但不幸的是,常见的 GPU 实现(岩浆、cuBLAS、cula 等)中没有 kron(A,B) 函数。
我已经搜索了一些解决方案,但找不到适合我需要的库。 (关于 SO 最接近的问题是 parallel Kronecker tensor product on gpu using CUDA,但这看起来像是针对特殊情况的自定义解决方案,不适合我的需求。我正在寻找适用于最一般情况的 Kronecker 产品。)
我读过 BLAS 中的 DGEMM 可用于实现 Kronecker 产品。是否有使用 DGEMM(或其单一/复杂变体)实现 Kronecker 产品的标准算法?在我看来,唯一的方法是在循环中调用 DGEMM 并将结果平铺到更大的矩阵中,这似乎不是很有效。或者,有谁知道可能提供我正在寻找的其他实现或论文?
【问题讨论】:
-
两个向量的点积是一个标量。两个向量的克罗内克积是一个矩阵。您如何可能使用点积例程(即归约/求和)来计算 Kronecker 积(元素乘法)?这绝对没有数学意义......
-
GEMM 执行矩阵-矩阵运算,包括乘法。我在我的问题中没有提到点积。根据arxiv.org/abs/1304.7054,“BLAS level-3 operation GEMM is used in practice”来影响Kronecker产品。老实说,我不是 100% 理解这篇论文的意思,但这就是这个问题的重点。正如我上面所说,我只是想弄清楚我可以使用哪些选项(即使 GEMM 是死胡同),而谷歌搜索(如上面的评论)几乎没有帮助。
-
GEMM 是一个点积。矩阵-矩阵点积。您可能想要的是 rank-1 更新(类似于 BLAS
ger),但是 nxn 矩阵上的一对 kronecker 乘积需要 n*n rank-1 更新来计算完整的 kronecker 乘积。 -
GEMM 执行矩阵-矩阵运算,包括乘法。我在我的问题中没有提到点积。根据 arxiv.org/abs/1304.7054,“BLAS level-3 operation GEMM is used in practice”来影响 Kronecker 产品。老实说,我不是 100% 理解这篇论文的意思,但这就是这个问题的重点。正如我上面所说,我只是想弄清楚我可以使用哪些选项(即使 GEMM 是死胡同),而谷歌搜索(如上面的评论)几乎没有帮助。
标签: cuda blas cublas cula magma