gpt4 book ai didi

python - cuBLAS ( numba ) 中的非正方形 C 阶矩阵

转载 作者:IT老高 更新时间:2023-10-28 21:14:20 31 4
gpt4 key购买 nike

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

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

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

最佳答案

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

我手头没有可用的 cuBLAS 装置,所以这有点像在黑暗中拍摄,但如果 cuBLAS 的工作方式与通常的 BLAS 不同,我会感到非常惊讶。 BLAS 期望矩阵采用列优先顺序(又名 Fortran 顺序),但也可用于行优先顺序(又称 C 顺序)的矩阵。

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

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

即使你可能知道,我还是想先详细说明行优先顺序(c-memory-layout)和列优先顺序(fortran-memory-layout),以便充实我的答案。

所以如果我们有一个 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,我们可以很容易地看到:

row-major-order(A) = col-major-order(A^t)
col-major-order(A) = row-major-order(A^t)

这意味着,如果我们想得到矩阵 C 作为结果,那么 blas 例程应该在列中写入转置矩阵 C -major-order(毕竟这是我们无法改变的)进入这个内存。但是,C^t=(AB)^t=B^t*A^tB^tA^t 是原始矩阵以列优先顺序重新解释。

现在,让 An x k-矩阵,Bk x m-矩阵,调用gemm例程应该如下:

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

请注意:

  1. 我们不必转置矩阵 AB,因为它是通过将 C-order 重新解释为 Fortran-order 来处理的。
  2. 我们必须交换矩阵 AB 的位置,以便以 Fortran 顺序获得 C^t 作为结果。
  3. 生成的矩阵 C 是 C 顺序的(通过将它从 Fortran 顺序重新解释为 C 顺序,我们摆脱了 ^t)。

关于python - cuBLAS ( numba ) 中的非正方形 C 阶矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307686/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com