2014-03-19 2 views
4

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

답변

3

더 블층의 오류 코드 7은 CUBLAS_STATUS_INVALID_VALUE을 의미합니다. cube에서의 역행렬은 정사각형 행렬에서만 가능하므로 여러분의 경우에는 m == n이라고 가정합니다.

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

: 그것은으로 할당

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

가 더 일반적인 될 수로 :이 작업은 d_pivot_array을 할당해야하므로 피벗 배열을 필요로 cublas<t>getrfBatched 기능은 각 행렬의 길이 n의 수 말했다되고 Here은 CUBLAS 함수를 테스트하는 동안 작성한 정사각형 행렬 역변환 코드입니다. 함수 입력 및 출력은 장치에 할당 된 float 유형의 사각형 행렬입니다.

+0

이 경우 정확하게 spitch와 dpitch가 무엇입니까? 또한, 만약 내가 자체 포함 된 싶었, 나는 단순히 cudaMalloc src_d, cudaMemcpy 추가 할 수 src_d, 그래서 그 모든 전달되는 내 원본 행렬? – David

+0

'spitch'와'dpitch'는 행렬이'cudaMallocPitch'를 사용하여 할당 된 경우의 행렬의 피치입니다. 그렇지 않으면'n * sizeof (dataType)'와 동일 할 것입니다. – sgarizvi

+0

예, 자체적으로 포함 시키려면이 함수 내에 장치 행렬을 할당 할 수 있습니다. – sgarizvi