1

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) を受け取ります。これは行列全体を入力として取り、不完全なコレスキーの上三角または下三角だけを出力として取ります。それはどのように機能しますか?

4

1 に答える 1

1

についてのcusparseのドキュメントcusparseScsric0は間違って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です。

于 2013-01-17T01:34:27.667 に答える