C连续矩阵上的Fortran gemm函数

时间:2016-07-02 06:28:59

标签: python c fortran matrix-multiplication blas

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

此功能的签名是,所有参数'意思可以在上面的链接中找到。

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

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

请帮助我介绍一些具体的例子。

我所有的输入数组都是C-contigous。

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' or 'N'如何确定,希望你能给我一个详细的解释。

注意

我正在使用从scipy.linalg.cython_blas导出的gemm函数,这意味着,我没有别的选择,而不是播放这个Fortran订购内容。

1 个答案:

答案 0 :(得分:2)

如果要使用行主矩阵而不是Fortran样式的col-major,可以使用CBLAS API gemm。您可以使用第一个参数选择矩阵存储布局。

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

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

您的代码在col-major中计算C,但您需要在行主要中使用C.所以你需要通过Fortran API计算col-major中的C ^ T,这相当于行主要的C.

应该是

C^T = B^T * A^T

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

Transpose matrix multiplication in cuBLAS howto