Cublas矩阵LU分解

大卫

我在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");
}
烧伤

cublas的错误代码7为CUBLAS_STATUS_INVALID_VALUEcublas中的矩阵求逆仅适用于平方矩阵,因此我认为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设备上分配的类型平方矩阵。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

LU分解的矩阵乘法问题?

来自分类Dev

获取LU分解的nxn矩阵时发生堆损坏

来自分类Dev

如何缩放SPICE矩阵,以便LU分解不会失败

来自分类Dev

获取LU分解的nxn矩阵时发生堆损坏

来自分类Dev

设备的cublas矩阵求逆

来自分类Dev

设备的cublas矩阵求逆

来自分类Dev

高斯-乔丹消除与LU分解

来自分类Dev

使用openmp进行LU分解

来自分类Dev

MATLAB LU分解部分旋转

来自分类Dev

GPU MATLAB上的LU分解

来自分类Dev

MATLAB LU分解部分旋转

来自分类Dev

使用CUBLAS进行批量QR分解

来自分类Dev

分解SVG变换矩阵

来自分类Dev

cublas矩阵乘法不符合预期

来自分类Dev

cuBLAS矩阵逆运算比MATLAB慢得多

来自分类Dev

使用CUBLAS进行多个矩阵向量调用

来自分类Dev

cublas矩阵乘法不符合预期

来自分类Dev

使用更少的循环进行LU分解

来自分类Dev

LU分解速度与传统Ax = b

来自分类Dev

使用更少的循环进行LU分解

来自分类Dev

使用MATLAB的linsolve进行LU分解

来自分类Dev

使用置换矩阵的稀疏矩阵的Cholesky分解

来自分类Dev

SVD分解后的矩阵重建

来自分类Dev

如何分解仿射矩阵?

来自分类Dev

为什么对于稀疏矩阵乘法,cuSparse比cuBlas慢得多

来自分类Dev

如何使用本征库进行Lu分解C ++

来自分类Dev

腌制Scipy的SuperLU类用于不完全LU分解

来自分类Dev

使用OpenMP进行LU分解似乎很慢,需要建议

来自分类Dev

配合物64分解LU的数值精度