计算Kronecker产品的CUDA库

时间:2014-01-17 16:17:26

标签: cuda blas cublas cula magma

我有一个应用程序需要我计算一些2D矩阵的大型Kronecker积,并将结果乘以大型2D矩阵。我想在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并将结果平铺到一个更大的矩阵中,这看起来效率不高。或者,是否有人知道可能提供我正在寻找的其他实现或论文?

1 个答案:

答案 0 :(得分:3)

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

enter image description here

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

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

enter image description here

再次注意,结果矩阵的排序与矩阵 A B 的Kronecker积相同。

我不知道用于计算一对任意大小矩阵的真正Kronecker积的CUDA库。它应该是一个内存限制的问题,所以即使是一种相对天真的方法,它可以合并负载并重新使用尽可能多的数据,但应该非常接近峰值带宽。