-1

我有一个应用程序,需要我计算二维矩阵的一些大型 Kronecker 积并将结果乘以大型二维矩阵。我想在 CUDA 的 GPU 上实现这一点,并且更愿意为此使用经过调整的库实现,而不是编写我自己的(当然不是最佳的)Kronecker 产品。我有 CUDA、BLAS、LAPACK 等方面的经验,但不幸的是,常见的 GPU 实现(岩浆、cuBLAS、cula 等)中没有 kron(A,B) 函数。

我已经搜索了一些解决方案,但找不到适合我需要的库。(关于 SO 最接近的问题是使用 CUDA 在 gpu 上并行 Kronecker 张量产品,但这看起来像是针对特殊情况的自定义解决方案,不适合我的需求。我正在寻找可以在最通用的情况下工作的 Kronecker 产品案子。)

我读过 BLAS 中的 DGEMM 可用于实现 Kronecker 产品。是否有使用 DGEMM(或其单一/复杂变体)实现 Kronecker 产品的标准算法?在我看来,唯一的方法是在循环中调用 DGEMM 并将结果平铺到更大的矩阵中,这似乎不是很有效。或者,有没有人知道另一个可能提供我正在寻找的实现或论文?

4

1 回答 1

3

您链接到的论文正在利用以下身份

在此处输入图像描述

消除了显式计算 Kronecker 乘积并将其替换为 3 级 BLAS gemm 调用的需要。如果您的问题是矩阵方程,那么您可以通过这种方式使用 gemm ,否则对您没有用处。

另一个可能有用的身份是使用外部产品计算克罗内克产品(2 级 BLAS IIRC 中的 1 级更新):

在此处输入图像描述

再次注意,结果矩阵的顺序与矩阵AB的 Kronecker 积不同。

我不知道用于计算一对任意大小矩阵的真正 Kronecker 积的 CUDA 库。这应该是一个内存受限的问题,因此即使是一种相对简单的方法,它可以合并负载并尽可能多地重用数据,也应该相当接近峰值带宽。

于 2014-01-20T13:49:33.917 回答