我試圖使用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)的矩陣值,它是整個矩陣作爲輸入,並且不完整的-喬列斯基上部或下部的三角形只作爲輸出。它是如何工作的 ?