我正在尝试使用Anaconda的Numba包中的cuBLAS函数,但遇到了一个问题。我需要输入矩阵是C阶的。输出可以采用Fortran顺序。在
我可以运行包here提供的示例脚本。该脚本有两个函数,gemm_v1
和gemm_v2
。在gemm_v1
中,用户必须以Fortran顺序创建输入矩阵。在gemm_v2
中,它们可以传递给GEMM的cuda实现并在设备上进行转置。我可以用这些例子来处理方阵。但是,我不知道如何使gemm_v2
与非平方输入矩阵一起工作。有没有办法处理非平方的C阶输入矩阵?在
注意:
理想情况下,在调用GEMM之后,输入和输出矩阵都将保留在设备上以用于其他计算(这是迭代方法的一部分)。在
这个例子的问题是,它只适用于方阵。如果矩阵不是正方形,则无法计算
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
,并将其存储在一些连续内存中,我们得到:这意味着如果我们得到一个连续的内存,它以行主顺序表示一个矩阵,并将其解释为列主顺序的矩阵,我们将得到一个完全不同的矩阵!在
但是,如果我们看一下转置矩阵
^{pr2}$A^t
,我们可以很容易地看到:这意味着,如果我们希望得到行主顺序的矩阵
C
,blas例程应该将转置后的矩阵C
以列主顺序(毕竟我们无法更改)写入这个内存。然而,C^t=(AB)^t=B^t*A^t
和B^t
和A^t
是按列主顺序重新解释的原始矩阵。在现在,让
A
是n x k
-矩阵和B
一个k x m
-矩阵,gemm例程的调用应该如下所示:请注意:
A
和B
,因为它是通过将C阶重新解释为Fortran顺序来处理的。在A
和B
的位置,才能得到以Fortran顺序排列的{C
是C阶的(通过将其从Fortran顺序重新解释为C阶,我们去掉了^t
)。在相关问题 更多 >
编程相关推荐