2012-11-01 70 views
1

我試圖使用preconditoned共軛梯度來解析Ax = b。 所以我舉了cuda-sdk的例子。 有時,當我調用函數cusparseScsrsv_analysis時,它將返回「執行失敗」的錯誤6。有時候,它可以工作。cusparse csrsvanalysis有時可以工作,有時會失敗

矩陣A是對稱正定的。

此外,共軛梯度在相同的數據上正常工作。

這是我的代碼:

/* Get handle to the CUSPARSE context */ 
cusparseHandle_t cusparseHandle = 0; 
cusparseStatus_t cusparseStatus; 
cusparseStatus = cusparseCreate(&cusparseHandle); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseCreate returned error code %d !\n", cusparseStatus); 

cusparseMatDescr_t descr = 0; 
cusparseStatus = cusparseCreateMatDescr(&descr); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseCreateMatDescr returned error code %d !\n", cusparseStatus); 

// create the analysis info object for the A matrix 
cusparseSolveAnalysisInfo_t infoA = 0; 
cusparseStatus = cusparseCreateSolveAnalysisInfo(&infoA); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseCreateSolveAnalysisInfo returned error code %d !\n", cusparseStatus); 

// Perform the analysis for the Non-Transpose case 
cusparseStatus = cusparseScsrsv_analysis(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, N, nnz, descr, dev_val, dev_row_ptr, dev_colInd, infoA); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseScsrsv_analysis 1 returned error code %d !\n", cusparseStatus); 

N是列和行的數量,NNZ是非零元素的數量。我的矩陣是csr格式。編輯: 我沒有看到任何特殊要求。我認爲這不是記憶,我有超過2GB,我沒有使用大矩陣(48MB)。

我試着預處理共軛梯度與雅可比precondionner,它也正常工作,但如果我嘗試用cusparse分析,它失敗了一半的時間。

我想要的是使用使用cusparse和cublas的Maxim Noumov算法(http://developer.download.nvidia.com/compute/DevZone/docs/html/CUDALibraries/doc/Preconditioned_Iterative_Methods_White_Paper.pdf)。

EDIT2

我需要有關curspace一些解釋。如果我把這個描述符放在這一行:cusparseSetMatType(descr,CUSPARSE_MATRIX_TYPE_SYMMETRIC);分析工作,但奇怪的是我存儲整個矩陣不僅上部或下部。如果我把cusparseSetMatType(descr,CUSPARSE_MATRIX_TYPE_GENERAL);,它不起作用。此外,我不明白爲什麼我必須存儲在dev_row_ptr m + 1元素,其中m是行數。我在最後一個元素中放入了什麼?

其他問題: 功能cusparseScsric0作爲輸入/輸出(在文檔中csrValM)的矩陣值,它是整個矩陣作爲輸入,並且不完整的-喬列斯基上部或下部的三角形只作爲輸出。它是如何工作的 ?

回答

1

關於cusparseScsric0的cusparse文檔有誤,需要CUSPARSE_MATRIX_TYPE_SYMMETRIC作爲輸入。該功能使cusparseScsrsv_analysis墜毀。

這裏是一個正確的代碼:

cusparseMatDescr_t descrR = 0; 
cusparseStatus = cusparseCreateMatDescr(&descrR); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
fprintf(stderr, "cusparseCreateMatDescr returned error code %d !\n", cusparseStatus); 

cusparseSetMatFillMode(descrR,CUSPARSE_FILL_MODE_UPPER); // It can also be lower side 
cusparseSetMatType(descrR,CUSPARSE_MATRIX_TYPE_SYMMETRIC); 
cusparseSetMatIndexBase(descrR,CUSPARSE_INDEX_BASE_ZERO); 

cusparseSolveAnalysisInfo_t infoR = 0; 
cusparseStatus = cusparseCreateSolveAnalysisInfo(&infoR); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseCreateSolveAnalysisInfo returned error code %d !\n", cusparseStatus); 


cusparseStatus = cusparseScsrsv_analysis(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, 27, 153, descrR, dev_valR, dev_row_ptrR, dev_colIndR, infoR); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseScsrsv_analysis returned error code %d !\n", cusparseStatus); 

// generate the Incomplete Cholesky factor H for the matrix R using cusparseScsric0 
cusparseStatus = cusparseScsric0(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, 27, descrR, dev_valR, dev_row_ptrR, dev_colIndR, infoR); 
if(cusparseStatus!=CUSPARSE_STATUS_SUCCESS) 
    fprintf(stderr, "cusparseScsric0 returned error code %d !\n", cusparseStatus); 

dev_row_ptrR而且是行+ 1的數目。

相關問題