cuBLAS(numba)中的非平方C阶矩阵

use*_*752 17 python cublas anaconda numba

我正试图在Anaconda的Numba软件包中使用cuBLAS功能并遇到问题.我需要输入矩阵为C顺序.输出可以是Fortran顺序.

我可以在这里运行随包提供的示例脚本.该脚本有两个功能,gemm_v1gemm_v2.在gemm_v1,用户必须以Fortran顺序创建输入矩阵.在gemm_v2,它们可以传递给GEMM的cuda实现并转换到设备上.我可以使用这些示例来处理方形矩阵.但是,我无法弄清楚如何gemm_v2使用非方形输入矩阵.有没有办法使用非正方形的C阶输入矩阵?

注意:
理想情况下,在调用GEMM以用于其他计算之后,输入和输出矩阵都将保留在设备上(这是迭代方法的一部分).

ead*_*ead 4

这个例子的问题是,它只适用于方阵。如果矩阵不是方阵,则A^t*B^t由于维度不匹配而无法计算(假设维度正确A*B)。

我手头没有可用的 cuBLAS 安装,所以这有点盲目,但如果 cuBLAS 的工作方式与通常的 BLAS 不同,我会感到非常惊讶。BLAS 期望矩阵采用列主序(又名 Fortran 顺序),但也可用于行主序(又名 C 顺序)矩阵。

在我看来,这可能是完全错误的,gemm_v2这不是处理两个 C 阶矩阵相乘的常用/最佳方法,例如,因为如果将两个 C 阶矩阵相乘,那么也将得到一个 C 阶矩阵作为答案。

借助 计算两个 C 阶矩阵的乘积的技巧gemm如下:

即使您可能知道,我也想首先详细说明行主要顺序(c-内存布局)和列主要顺序(fortran-内存布局),以便充实我的回答。

因此,如果我们有一个2x3(即 2 行和 3 列)矩阵A,并将其存储在一些连续内存中,我们会得到:

row-major-order(A) = A11, A12, A13, A21, A22, A23
col-major-order(A) = A11, A21, A12, A22, A13, A33
Run Code Online (Sandbox Code Playgroud)

这意味着如果我们得到一个连续的内存,它表示一个行主序的矩阵,并将其解释为列主序的矩阵,我们将得到一个完全不同的矩阵!

然而,如果我们看一下转置矩阵,A^t我们可以很容易地看到:

row-major-order(A) = col-major-order(A^t)
col-major-order(A) = row-major-order(A^t)
Run Code Online (Sandbox Code Playgroud)

这意味着,如果我们想得到C行主序的矩阵作为结果,blas例程应该将C列主序的转置矩阵(毕竟我们无法改变)写入到这个内存中。然而,C^t=(AB)^t=B^t*A^tB^tanA^t是以列主顺序重新解释的原始矩阵。

现在,设An x k-matrix 和 B-matrix , gemmk x m例程的调用应如下所示:

gemm('N', 'N', m, n, k, 1.0, B, m, A, k, 0.0, C, m)
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 我们不必转置矩阵AB,因为它是通过将 C 顺序重新解释为 Fortran 顺序来处理的。
  2. 我们必须交换矩阵A和的位置B才能得到C^tFortran 顺序的结果。
  3. 得到的矩阵C是 C 顺序的(通过将其从 Fortran 顺序重新解释为 C 顺序,我们摆脱了^t)。