首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C-连续矩阵上的Fortran gemm函数

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

Stack Overflow用户
提问于 2016-07-02 06:28:59
回答 1查看 374关注 0票数 3

我试图使用fortran gemm函数进行矩阵乘法,参见这里

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

代码语言:javascript
复制
call sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)

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

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

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

代码语言:javascript
复制
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',希望你能给我一个详细的解释。

注意事项

我使用从gemm导出的这个布拉斯函数,这意味着,我没有其他选择,而不是玩这个Fortran订购的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-02 06:35:29

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

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

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

您的代码计算C在col,但您需要一个C在行专业。所以你需要用Fortran来计算C^T,这相当于行专业中的C。

它应该是

代码语言:javascript
复制
C^T = B^T * A^T

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

转置矩阵乘法在cuBLAS中的应用

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38157215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档