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/Precondition_Iterative_Methods_White_Paper.pdf )。

编辑2

我需要一些关于 curspace 的解释。如果我在描述符中放入这一行:cusparseSetMatType(descr,CUSPARSE_MATRIX_TYPE_SYMMETRIC);分析有效,但奇怪的是我不仅存储了整个矩阵的上部或下部。如果我把cusparseSetMatType(descr,CUSPARSE_MATRIX_TYPE_GENERAL);,它不起作用。此外,我不明白为什么我必须存储在dev_row_ptrm+1 元素中,其中 m 是行数。我在最后一个元素中放了什么?

其他问题:该函数cusparseScsric0将整个矩阵作为输入的矩阵值(文档中的 csrValM)作为输入/输出,仅将不完整的 CHolesky 上三角或下三角作为输出。它是如何工作的 ?

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 回答