gpt4 book ai didi

python - C 连续矩阵上的 Fortran gemm 函数

转载 作者:行者123 更新时间:2023-11-28 17:26:53 26 4
gpt4 key购买 nike

我正在尝试使用 fortran BLAS gemm 函数进行矩阵乘法,请参阅 here .

这个函数的签名是,所有参数的含义都可以在上面的链接中找到。

call sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)

我的问题是,我想使用 C 连续数组而不是 Fortran 连续数组,我已经使用上面的 sgemm 很长一段时间了,但仍然很困惑。

请帮我看一些具体的例子。

我所有的输入数组都是 C 连续的。

a = [[0,1],
[2,3]]
b = [[0,1,2],
[3,4,5]]
# pre-alloc memory for c
c = [[0,0,0],
[0,0,0]]

# compute c = a * b, which should be as follows
# c = [[3,4,5],
# [9,14,19]]

# since sgemm assumes Fortran-contiguous, so I thought it would be
sgemm('T', 'T', 2, 3, 2, 1.0, a, 2, b, 3, 0, c, 2)
~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~
trans both m,n,k lda ldb ldc

# HOWEVER, c is not what I expected,
c = [[3,9,4],
[14,5,19]]

显然 sgemm 以 Fortran 连续顺序存储元素,如何解决这个问题?另外我不太明白那些 m,n,k,lda,ldb 是如何确定 transa/transb='T' 或 'N' 的,希望你可以给我一个详细的解释。

注意

我正在使用从 scipy.linalg.cython_blas 导出的 gemm 函数,这意味着,除了玩这个 Fortran 排序的东西,我别无选择。

最佳答案

如果您想使用行优先矩阵而不是 Fortran 风格的列优先矩阵,您可以使用 CBLAS API gemm。您可以使用第一个参数选择矩阵存储布局。

https://software.intel.com/en-us/node/520775


或者您仍然可以使用 Fortran API。因为改变矩阵布局等同于矩阵转置。但是,您正在以错误的方式计算转置 C。

您的代码计算列优先的 C,但您需要行优先的 C。所以需要通过Fortran API计算C^T in col-major,相当于C in row-major。

应该是

C^T = B^T * A^T

基本上你需要交换A和B,以及相应的参数。有关这些参数的更多详细信息,您可以查看此答案。

Transpose matrix multiplication in cuBLAS howto

关于python - C 连续矩阵上的 Fortran gemm 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38157215/

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