【问题标题】:CUDA Library for Computing Kronecker Product [closed]用于计算 Kronecker 产品的 CUDA 库 [关闭]
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2017-06-22
    • 2014-09-13
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多