2016-06-13 52 views
0

我想用culasasSgetrsBatched函数解决CuBLAS的线性方程。 这里是我的程序:cublasSgetrs内核中的内存错误

__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 

我不明白如何使一个简单的线性方程此功能工作。

有人可以帮助我吗?

+0

您可以重新格式化您的代码,以便我们可以阅读吗? – kangshiyin

回答

1

您可能有几个问题。

  1. the doc of cublasSgetrsBatched,你d_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. 与示例代码相同的性能问题。