首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在输入SGEMM参数8时有一个非法值

在输入SGEMM参数8时有一个非法值
EN

Stack Overflow用户
提问于 2015-04-15 18:46:27
回答 2查看 12K关注 0票数 4

我试图探索cblas库;所以我尝试使用Level3 cblas_sgemm例程进行2d矩阵乘法。

代码语言:javascript
运行
复制
C=(alpha)* A * B + (beta) * C
;; where aplha=1 & beta=0
代码语言:javascript
运行
复制
#define TYPE float
#define A_R 3
#define A_C 2
#define B_R 2
#define B_C 3

    int main()
    {
        TYPE *A=NULL,*B=NULL,*C=NULL;
        if(A_C != B_R)
                {
                printf("\nA(%d,%d) X B(%d,%d) not possible\n",A_R,A_C,B_R,B_C);
                exit(1);
                }

        A=(TYPE*)malloc(A_R*A_C*sizeof(TYPE));
        B=(TYPE*)malloc(B_R*B_C*sizeof(TYPE));
        C=(TYPE*)malloc(A_R*B_C*sizeof(TYPE));
        initM(A,B,C);//initializes matrix
        cblas_sgemm(CblasRowMajor, CblasNoTrans,CblasNoTrans,A_R, B_C,A_C, 1.0, A,A_R, B, B_R,0.0, C, A_C);
        //multiply(A,B,C);

        printf("\n%f\n",C[ (A_R*B_C)-1]);
}

我使用静态库编译了我的程序:

代码语言:javascript
运行
复制
gcc mxm_blas.c -L/CBLAS/lib/ -lcblas -L/BLAS/ -lblas -I/CBLAS/include/ -lgfortran

现在运行代码,我得到:

在输入SGEMM参数8时有一个非法值

在我看来,问题在于如何声明数组!大多数示例我见过将数组声明为:

代码语言:javascript
运行
复制
float A[100][100],b[100][100],C[100][100];

这是导致错误的原因,还是程序错误?基于malloc的矩阵乘法不可能通过sgemm实现吗?

更新: initM初始化矩阵:

代码语言:javascript
运行
复制
void initM(TYPE* A,TYPE* B,TYPE* C)
{
long int i,j;

j=A_R*A_C;
for(i=0;i<j;i++) A[i]=2;

j=B_R*B_C;
for(i=0;i<j;i++)  B[i]=3;

j=A_R*B_C;
for(i=0;i<j;i++)  C[i]=0;
 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-15 20:07:05

错误消息是由sgemm而不是cblas_sgemm生成的。sgemm的数字8参数是:

子程序SGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,最不发达国家)

C函数cblas_sgemm只是一个调用Fortran例程sgemm的包装器。基本上,它将从by value传递给by reference的一些参数进行转换。此外,Fortran例程缺少"RowMajor“参数。

由于您使用的是"RowMajor“存储,所以应该使用列数作为矩阵的领先维度。

即使我不能测试它,我也建议:

代码语言:javascript
运行
复制
cblas_sgemm(CblasRowMajor, CblasNoTrans,CblasNoTrans,A_R, B_C, A_C, 1.0, A, A_C, B, B_C, 0.0, C, B_C);

此外,您还可以参考GSL 示例

票数 3
EN

Stack Overflow用户

发布于 2015-04-16 05:24:04

对ctheo的回答略作修改:

代码语言:javascript
运行
复制
A[A_R][A_C] X B[B_R][B_C]=C[A_R][B_C] //if (A_C==B_R)

因此,在将最后一个参数设置为LDC=B_C时,代码可以正常工作。

代码语言:javascript
运行
复制
cblas_sgemm(CblasRowMajor, CblasNoTrans,CblasNoTrans,A_R, B_C,A_C,1.0, A,A_C, B, B_C,0.0, C,   B_C  );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29658349

复制
相关文章

相似问题

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