나는 cuda에서 dgetrf를 호출하는 데 약간의 문제가 있습니다. 내가 찾은 것에서는 일괄 처리 된 버전 (http://docs.nvidia.com/cuda/cublas/#cublas-lt-t-gt-getrfbatched) 만 호출 할 수 있습니다. 호출 할 때 오류 값 7이 반환되며, 해당 오류 코드에 해당하는 열거 형을 찾을 수 없습니다. 아래 코드는 내 도움이 될 것입니다.큐브 매트릭스 LU 분해
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");
}
이 경우 정확하게 spitch와 dpitch가 무엇입니까? 또한, 만약 내가 자체 포함 된 싶었, 나는 단순히 cudaMalloc src_d, cudaMemcpy 추가 할 수 src_d, 그래서 그 모든 전달되는 내 원본 행렬? – David
'spitch'와'dpitch'는 행렬이'cudaMallocPitch'를 사용하여 할당 된 경우의 행렬의 피치입니다. 그렇지 않으면'n * sizeof (dataType)'와 동일 할 것입니다. – sgarizvi
예, 자체적으로 포함 시키려면이 함수 내에 장치 행렬을 할당 할 수 있습니다. – sgarizvi