Cblas_Dgemm()没有给我我的期望

时间:2013-11-28 15:29:14

标签: matrix cuda cublas

我在一个小矩阵上试用了库函数Cublas_Dgemm(),但它没有给我我所期望的。

所以我按以下方式声明并初始化矩阵:

    double alpha = 1.0, beta = 0.0;
    double * sa = (double *)malloc(6*sizeof(double));
    double * sb = (double *)malloc(6*sizeof(double));
    double * sc = (double *)malloc(4*sizeof(double));

    for( a = 0; a<2; a++)
            for (b = 0; b < 3; b++){
                    sa[a*3+b] = a+b+1.0;
                    sb[a*3+b] = a+b+1.0;}

仅供记录,我也试过

for( a = 0; a<2; a++)
    for (b = 0; b < 3; b++){
        sa[IDX2F(a, b)] = a+b+1.0;
        sb[IDX2F(a, b)] = a+b+1.0;}

其中

#define IDX2C(i,j,ld) (((j)*(ld))+(i))

这给了我:

sa:

1.00 2.00 3.00
3.00 2.00 3.00

SB:

1.00 2.00
3.00 2.00
3.00 4.00

然后我按如下方式在GPU上分配内存:

    double *dsa, *dsb, *dsc;
    cudaMalloc((void **) &dsa, 6*sizeof(*sa));
    cudaMalloc((void **) &dsb, 6*sizeof(*sb));
    cudaMalloc((void **) &dsc, 4*sizeof(*sc));

    cublasSetMatrix(2, 3, sizeof(*sa), sa, 2, dsa, 2);
    cublasSetMatrix(3, 2, sizeof(*sb), sb, 3, dsb, 3);

    cublasDgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, 2, 2, 3, &alpha, dsa, 2, dsb, 3, &beta, dsc, 2);

    cublasGetMatrix(2, 2, sizeof(*sc), dsc, 2, sc, 2);

然而,当我打印矩阵Sc时,我得到了

SC:

16.00 18.00
23.00 26.00

当它应该是(根据matlab):

16.00 18.00
18.00 22.00

我不确定为什么我会得到错误的答案,有人会发现我犯的错误吗?谢谢你!

1 个答案:

答案 0 :(得分:2)

我建议您对所有Cublas电话进行适当的错误检查。

你得到的结果是因为cublas希望给它的矩阵在column-major order。您期望的结果对于行主矩阵是正确的(并注意@pQB对设置代码中的错误所说的内容。)

此外,如果modify the calling setup.

,您可以将行主要有序数据直接传递给Cublas并获得合理的结果