cuBLAS(numba)中的非方Corder矩阵

2024-06-09 00:58:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Anaconda的Numba包中的cuBLAS函数,但遇到了一个问题。我需要输入矩阵是C阶的。输出可以采用Fortran顺序。在

我可以运行包here提供的示例脚本。该脚本有两个函数,gemm_v1gemm_v2。在gemm_v1中,用户必须以Fortran顺序创建输入矩阵。在gemm_v2中,它们可以传递给GEMM的cuda实现并在设备上进行转置。我可以用这些例子来处理方阵。但是,我不知道如何使gemm_v2与非平方输入矩阵一起工作。有没有办法处理非平方的C阶输入矩阵?在

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


Tags: 函数用户脚本示例here顺序矩阵anaconda
1条回答
网友
1楼 · 发布于 2024-06-09 00:58:06

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

我手头没有一个正在工作的cuBLAS装置,所以这有点像是在瞎猜,但如果cuBLAS的工作方式与通常的BLAS不同,我会非常惊讶的。BLAS期望矩阵以列主顺序(即Fortran顺序)排列,但也可以用于行主顺序(aka C-order)的矩阵。在

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

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

即使您可能已经知道了,为了充实我的答案,我想首先详细说明行主顺序(c-memory-layout)和列主要顺序(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

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

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

^{pr2}$

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

现在,让An x k-矩阵和B一个k x m-矩阵,gemm例程的调用应该如下所示:

gemm('N', 'N', m, n, k, 1.0, B, m, A, k, 0.0, C, m)

请注意:

  1. 我们不必转置矩阵AB,因为它是通过将C阶重新解释为Fortran顺序来处理的。在
  2. 我们必须交换矩阵AB的位置,才能得到以Fortran顺序排列的{}。在
  3. 得到的矩阵C是C阶的(通过将其从Fortran顺序重新解释为C阶,我们去掉了^t)。在

相关问题 更多 >