2012-10-05 2 views
4

cuSparse 라이브러리에 익숙해 지려고합니다. 내 간단한 코드에서 함수 cusparseSnnz은 CUSPARSE_STATUS_INTERNAL_ERROR 인 상태 6을 반환합니다. CUDA 드라이버와 cuSparse 라이브러리가 올바르게 설치되었다고 생각합니다. 누군가가 나를 도울 수 있다면 정말 고마워 할 것입니다. 감사.cuSparse cusparseSnnz 함수가있는 CUSPARSE_STATUS_INTERNAL_ERROR

cusparseStatus_t status; 
cusparseHandle_t handle=0; 
cusparseMatDescr_t descr=0; 

status = cusparseCreate(&handle); 
if (status != CUSPARSE_STATUS_SUCCESS) { 
    cout << "CUSPARSE Library initialization failed" << endl; 
} 
status = cusparseCreateMatDescr(&descr); 
if (status != CUSPARSE_STATUS_SUCCESS) { 
    cout << "Matrix descriptor initialization failed" << endl; 
} 
status = cusparseSetMatType(descr, CUSPARSE_MATRIX_TYPE_GENERAL); 
if (status != CUSPARSE_STATUS_SUCCESS) { 
    cout << "cusparseSetMatType failed" << endl; 
} 
status = cusparseSetMatIndexBase(descr, CUSPARSE_INDEX_BASE_ZERO); 
if (status != CUSPARSE_STATUS_SUCCESS) { 
    cout << "cusparseSetMatIndexBase failed" << endl; 
} 
int nnzPerRow[2]; 
int nnzTotal; 
float tempf[6]; 
tempf[0] = 1.0; 
tempf[1] = 0.0; 
tempf[2] = 3.4; 
tempf[3] = 0.0; 
tempf[4] = 2.2; 
tempf[5] = 8.6; 
float* d_Temp; 
cudaMalloc((void**)&d_Temp, sizeof(float)*6); 
cudaMemcpy(d_Temp, tempf, sizeof(float)*6, cudaMemcpyHostToDevice); 
status = cusparseSnnz(handle, CUSPARSE_DIRECTION_ROW, 2, 3, descr, d_Temp, 2, nnzPerRow, &nnzTotal); 
if (status != CUSPARSE_STATUS_SUCCESS) { 
    cout << "nnz calculation failed" << endl; 
    cout << "status = " << status << endl; 
} 
cout << "nnzPerRow[0] = " << nnzPerRow[0] << endl; 
cout << "nnzPerRow[1] = " << nnzPerRow[1] << endl; 

답변

2

나는 틀린 것을 발견했습니다. nnzPerRow가 장치에 있어야합니다.

int nnzPerRow[2]; 

이것은 다음과 같이해야합니다 :

int* nnzPerRow=0; 
checkCudaErrors(cudaMalloc((void**)&nnzPerRow, sizeof(int)*2)); 
관련 문제