Cublas矩阵LU分解
Cublas Matrix LU Decomposition
我在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
型方阵
相关文章:
- 通过递归进行因子分解
- 有人能分解一下这个c++模板的语法吗
- C++ 乔列斯基因式分解
- 如何加快本征C++中的LU分解?
- 如何将整数分解为不同的变量?
- 减少本征的 QR 分解
- Xcode 中的加速框架以获得 A 的 QR 分解,但找不到 zgeqrf
- 将无向连接图分解为两个组件
- 在 C++ 中分解数字
- 如何修复 LU 分解?
- 在C 中实现顺序LU分解
- 如何将特征库用于LU分解C
- LU 使用 openmp 分解
- C ++中的LU分解不适用于大矩阵
- 包含 LU 分解的基质
- 使用相同的内存在armadillo中进行LU分解
- 需要一个使用gsl-LU分解获得平方矩阵逆的示例代码
- 我在带有 cuSolver 的设备上找不到 LU 分解
- 如何在本征中使用不完全LU分解
- Cublas矩阵LU分解