首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cublas矩阵LU分解

Cublas矩阵LU分解
EN

Stack Overflow用户
提问于 2014-03-19 09:34:58
回答 1查看 2.6K关注 0票数 4

我给库达的dgetrf打电话有点麻烦。根据我所发现的,我只能称之为批处理版本(http://docs.nvidia.com/cuda/cublas/#cublas-lt-t-gt-getrfbatched)。当我调用它时,我得到了一个返回的错误值7,但没有找到对应的该错误代码的枚举。下面是我的代码,任何帮助都将不胜感激;

代码语言:javascript
复制
void cuda_matrix_inverse (int m, int n, double* a){

    cublasHandle_t handle;
    cublasStatus_t status;
    double **devPtrA = 0;
    double **devPtrA_dev = NULL;
    int *d_pivot_array;
    int *d_info_array;
    int rowsA = m;
    int colsA = n;
    int matrixSizeA;
    cudaError_t error;

    fprintf(stderr,"starting cuda inverse\n");

    error = cudaMalloc((void **)&d_pivot_array, sizeof(int));
    if (error != cudaSuccess) fprintf(stderr,"\nError: %s\n",cudaGetErrorString(error));
    error = cudaMalloc((void **)&d_info_array, sizeof(int));
    if (error != cudaSuccess) fprintf(stderr,"\nError: %s\n",cudaGetErrorString(error));

    fprintf(stderr,"malloced pivot and info\n");

    status = cublasCreate(&handle);
    if (status != CUBLAS_STATUS_SUCCESS) fprintf(stderr,"error %i\n",status);

    matrixSizeA = rowsA * colsA;

    devPtrA =(double **)malloc(1 * sizeof(*devPtrA));

    fprintf(stderr,"malloced devPtrA\n");

    error = cudaMalloc((void **)&devPtrA[0], matrixSizeA * sizeof(devPtrA[0][0]));
    if (error != cudaSuccess) fprintf(stderr,"\nError: %s\n",cudaGetErrorString(error));

    error = cudaMalloc((void **)&devPtrA_dev, 1 * sizeof(*devPtrA));
    if (error != cudaSuccess) fprintf(stderr,"\nError: %s\n",cudaGetErrorString(error));

    fprintf(stderr,"malloced device variables\n");

    error = cudaMemcpy(devPtrA_dev, devPtrA, 1 * sizeof(*devPtrA), cudaMemcpyHostToDevice);
    if (error != cudaSuccess) fprintf(stderr,"\nError: %s\n",cudaGetErrorString(error));

    fprintf(stderr,"copied from devPtrA to d_devPtrA\n");

    status = cublasSetMatrix(rowsA, colsA, sizeof(a[0]), a, rowsA, devPtrA[0], rowsA);
    if (status != CUBLAS_STATUS_SUCCESS) fprintf(stderr,"error %i\n",status);


    status = cublasDgetrfBatched(handle, m, devPtrA_dev,m,d_pivot_array,d_info_array,1); //cannot get this to work
    if (status != CUBLAS_STATUS_SUCCESS) fprintf(stderr,"error in dgetrf %i\n",status);


    fprintf(stderr,"done with cuda inverse\n");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 10:19:11

cublas的错误代码7表示CUBLAS_STATUS_INVALID_VALUE。矩阵在cublas中的反演对于方阵是可能的,所以我假设在您的情况下是m == n。尽管如此,函数cublas<t>getrfBatched要求每个矩阵的枢轴数组的长度为n,因此您应该将d_pivot_array分配为:

代码语言:javascript
复制
error = cudaMalloc((void **)&d_pivot_array, n * sizeof(int));

为了更通用,它被分配为:

代码语言:javascript
复制
error = cudaMalloc((void **)&d_pivot_array, n * batchSize * sizeof(int));

Here是我在测试CUBLAS函数时编写的平方矩阵逆代码。功能输入和输出是分配在设备上的float型方阵。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22501502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档