【问题标题】:Cublas_Dgemm() not giving me what I expectCublas_Dgemm() 没有给我我所期望的
【发布时间】:2013-12-14 17:01:55
【问题描述】:

我在一个小矩阵上尝试库函数 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))

这给了我:

萨:

1.00 2.00 3.00
3.00 2.00 3.00

某人:

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

我不知道为什么我会得到这个错误的答案,有人会发现我可能犯的错误吗?非常感谢!

【问题讨论】:

  • 除了@Robert Crovella 的回答,请注意您在问题中报告的sa 的值不正确(可能是错字)。根据初始化循环,它们与sb相同,都是正确的。

标签: matrix cuda cublas


【解决方案1】:

我建议对所有 cublas 调用进行适当的错误检查。

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

另外,如果你modify the calling setup.

【讨论】:

  • 嗨,我忘了提到我尝试使用 IDX2F 和 IDX2C 初始化我的数组,但它似乎也不起作用。无论如何我可以按列优先顺序声明我的矩阵吗?
  • 其实我错过了@pQB 指出的错误。我相信这实际上是你困惑的根源。 16,18,23,26 是矩阵乘法的正确值。唯一的其他因素是它们的呈现顺序,这可能因行优先和列优先而异。
猜你喜欢
  • 2015-05-30
  • 2021-12-29
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2018-05-11
  • 1970-01-01
相关资源
最近更新 更多