Matrix 没有给我我想要的

Matrix 没有给我我想要的,matrix,cuda,cublas,Matrix,Cuda,Cublas,我在一个小矩阵上尝试库函数Cublas_ggemm(),但它并没有给出我所期望的结果 因此,我用以下方式声明并初始化矩阵: 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(

我在一个小矩阵上尝试库函数Cublas_ggemm(),但它并没有给出我所期望的结果

因此,我用以下方式声明并初始化矩阵:

    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;}
这给了我:

sa:

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


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

我建议您对所有cublas调用进行正确的错误检查

您得到的结果是因为cublas希望提供给它的矩阵是正确的。您期望的结果对于行主矩阵是正确的(请注意@pQB在设置代码中对错误的描述)


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

Hi,我忘了提到我尝试使用IDX2F和IDX2C初始化数组,但它似乎也不起作用。我是否可以按列的主要顺序声明我的矩阵?实际上,我错过了@pQB指出的错误。我相信这就是你困惑的根源。16、18、23、26是矩阵乘法的正确值。唯一的另一个因素是它们的显示顺序,这可能在行主调和列主调之间有所不同。除了@Robert Crovella的答案外,还要考虑您在问题中报告的
sa
的值不正确(可能是打字错误)。根据初始化循环,它们与正确的
sb
相同。
#define IDX2C(i,j,ld) (((j)*(ld))+(i))
    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);