Ax = bを解決するために、前提条件付き共役勾配を使用しようとしています。そこで、cuda-sdk で与えられたサンプルを例に取りました。関数を呼び出すと、cusparseScsrsv_analysis
「実行に失敗しました」というエラー 6 が返されることがあります。時々、それはうまくいきます。
行列 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)を使用していません.
jacobi 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 が行数である m+1 要素に格納する必要がある理由がわかりません。最後の要素には何を入れますか?
他の質問: 関数cusparseScsric0
は入力/出力として行列値 (ドキュメントでは csrValM) を受け取ります。これは行列全体を入力として取り、不完全なコレスキーの上三角または下三角だけを出力として取ります。それはどのように機能しますか?