我正在尝试使用预条件共轭梯度来解决 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_ptr
m+1 元素中,其中 m 是行数。我在最后一个元素中放了什么?
其他问题:该函数cusparseScsric0
将整个矩阵作为输入的矩阵值(文档中的 csrValM)作为输入/输出,仅将不完整的 CHolesky 上三角或下三角作为输出。它是如何工作的 ?