【问题标题】:Cublas Matrix LU DecompositionCublas 矩阵 LU 分解
【发布时间】:2014-03-19 09:34:58
【问题描述】:

我在 cuda 中调用 dgetrf 时遇到了一些问题。根据我的发现,我只能调用批处理版本(http://docs.nvidia.com/cuda/cublas/#cublas-lt-t-gt-getrfbatched)。当我调用它时,我得到一个返回的错误值 7,我无法找到该错误代码的相应枚举。以下是我的代码,任何帮助将不胜感激;

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");
}

【问题讨论】:

    标签: c++ cuda matrix-inverse


    【解决方案1】:

    cublas 的错误代码 7 表示 CUBLAS_STATUS_INVALID_VALUE。 cublas 中的矩阵求逆仅适用于方阵,所以我假设 m == n 在您的情况下。话虽这么说,函数cublas<t>getrfBatched 要求每个矩阵的主元数组长度为n,因此您应该将d_pivot_array 分配为:

    error = cudaMalloc((void **)&d_pivot_array, n * sizeof(int));
    

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

    error = cudaMalloc((void **)&d_pivot_array, n * batchSize * sizeof(int));
    

    Here 是我在测试 CUBLAS 函数时编写的方阵求逆代码。函数输入输出为设备上分配的float类型方阵。

    【讨论】:

    • 在这种情况下 spitch 和 dpitch 到底是什么?另外,如果我希望它自包含,我可以简单地添加一个 cudaMalloc src_d,然后从 a 到 src_d 的 cudaMemcpy,这样传入的所有内容就是我的源矩阵吗?
    • spitchdpitch 是矩阵的间距,以防使用cudaMallocPitch 分配矩阵。否则,它将等于n * sizeof(dataType)
    • 是的,要使其自包含,您可以在此函数中创建分配设备矩阵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多