内核中有cublasSgetrsBatched错误

时间:2016-06-13 14:58:16

标签: kernel cublas

我想用cublasSgetrsBatched函数用CuBLAS求解线性方程。 这是我的计划:

__global__ void invokeDeviceCublasSgemm(cublasStatus_t *returnValue,
                                        int n,
                                        const float *d_alpha,
                                        float *d_A,
                                        float *d_B,
                                        const float *d_beta,
                                        float *d_C)
{
    cublasHandle_t cnpHandle;
    cublasStatus_t status = cublasCreate(&cnpHandle);

    if (status != CUBLAS_STATUS_SUCCESS)
    {
        *returnValue = status;
        return;
    }



    int indice = 0;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            if(i==j)
            {
                d_A[i*5+j] = 1;
            }else
            {
              d_A[i*5+j] = 0;
            }
            d_A[i*5+j] = indice++ +1;
        }
        d_B[i] = i*i+2;
    }




    //A*At

    float alpha = 1.0;
    float beta  = 0;
    int devIpiv = 5;
    int info;



    cublasSgetrsBatched(cnpHandle,
                CUBLAS_OP_N,
                5,
                1,
                &d_A,
                5*5,
                (&devIpiv),
                &d_B,
                (#VERSION1)5, or (#VERSION2)1,
                &info,
                1);


    printf("info %d ",info);


    cublasDestroy(cnpHandle);

    *returnValue = status;
}

此函数为cublasSgetrsBatched#VERSION1

的第一个版本生成
  info 0 !!!! device to host memory copy error

我无法复制数据,但没有信息错误。

在版本2#VERSION2中:

 info -8

我不明白如何使这个功能适用于简单的线性方程式。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

你可能有几个问题。

  1. 根据the doc of cublasSgetrsBatchedd_Ad_B的类型应为const float* []float*[],但您使用的是float* }。

  2. 条件ldb>=max(1,n)对#VERSION2失败。

  3. devIpiv应该是一个数组而不是标量。

  4. d_A中的矩阵应该是LU因子,但是你给出了一个任意的矩阵。您可以在此函数之前调用cublasSgetrfBatched来进行LU分解。以下an example code (with performance issue but working)解决AX=I,您可以将其用作解决AX=B的参考。您可以阅读this以了解为何需要LU分解。

  5. 与示例代码相同的性能问题。