Cublas矩阵LU分解

Cublas Matrix LU Decomposition

本文关键字:分解 LU 矩阵 Cublas      更新时间:2023-10-16

我在cuda调用getf时遇到了一些麻烦。根据我所发现的,我只能调用批处理版本(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 inversen");
    error = cudaMalloc((void **)&d_pivot_array, sizeof(int));
    if (error != cudaSuccess) fprintf(stderr,"nError: %sn",cudaGetErrorString(error));
    error = cudaMalloc((void **)&d_info_array, sizeof(int));
    if (error != cudaSuccess) fprintf(stderr,"nError: %sn",cudaGetErrorString(error));
    fprintf(stderr,"malloced pivot and infon");
    status = cublasCreate(&handle);
    if (status != CUBLAS_STATUS_SUCCESS) fprintf(stderr,"error %in",status);
    matrixSizeA = rowsA * colsA;
    devPtrA =(double **)malloc(1 * sizeof(*devPtrA));
    fprintf(stderr,"malloced devPtrAn");
    error = cudaMalloc((void **)&devPtrA[0], matrixSizeA * sizeof(devPtrA[0][0]));
    if (error != cudaSuccess) fprintf(stderr,"nError: %sn",cudaGetErrorString(error));
    error = cudaMalloc((void **)&devPtrA_dev, 1 * sizeof(*devPtrA));
    if (error != cudaSuccess) fprintf(stderr,"nError: %sn",cudaGetErrorString(error));
    fprintf(stderr,"malloced device variablesn");
    error = cudaMemcpy(devPtrA_dev, devPtrA, 1 * sizeof(*devPtrA), cudaMemcpyHostToDevice);
    if (error != cudaSuccess) fprintf(stderr,"nError: %sn",cudaGetErrorString(error));
    fprintf(stderr,"copied from devPtrA to d_devPtrAn");
    status = cublasSetMatrix(rowsA, colsA, sizeof(a[0]), a, rowsA, devPtrA[0], rowsA);
    if (status != CUBLAS_STATUS_SUCCESS) fprintf(stderr,"error %in",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 %in",status);

    fprintf(stderr,"done with cuda inversen");
}

cublas的错误码7表示CUBLAS_STATUS_INVALID_VALUE。立方矩阵的反演只适用于方阵所以我假设在你的例子中是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));

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