Cuda cusparse csrsv_分析的性能非常慢
我用LU预处理编写了一个共轭梯度解算器(用于线性方程组),我使用了Maxim Naumov博士在nvidia研究社区的研究作为指导,残差更新步骤需要求解下三角矩阵系统,然后求解上三角矩阵系统分为两个阶段:Cuda cusparse csrsv_分析的性能非常慢,cuda,linear-algebra,sparse-matrix,Cuda,Linear Algebra,Sparse Matrix,我用LU预处理编写了一个共轭梯度解算器(用于线性方程组),我使用了Maxim Naumov博士在nvidia研究社区的研究作为指导,残差更新步骤需要求解下三角矩阵系统,然后求解上三角矩阵系统分为两个阶段: 分析阶段(利用稀疏模式并决定并行化级别) 解决方案阶段本身 根据与本主题相关的所有帖子,以及Naumov的论文本身,分析阶段明显比求解阶段慢,但它只执行了一次,因此在考虑整个执行时间时,这不应该是一个问题。然而,在我的程序中,分析阶段需要大约35-45%的整个求解时间(执行所有迭代所需的时间!
- 大小(N):~860000*860000
- 非零数量(NZ):~6000000
- 收敛所需的迭代次数:10
- 分析阶段执行时间:210毫秒
- 求解阶段执行时间(总结所有迭代
我联系了NVIDIA的线性代数库团队,他们提供了以下反馈
// z = inv(matrixLU)*r
cusparseMatDescr_t descrL = 0 ;
cusparseMatDescr_t descrU = 0 ;
cusparseStatus = cusparseCreateMatDescr(&descrL) ;
cusparseStatus = cusparseCreateMatDescr(&descrU) ;
cusparseSetMatType(descrL,CUSPARSE_MATRIX_TYPE_GENERAL) ;
cusparseSetMatIndexBase(descrL,CUSPARSE_INDEX_BASE_ONE) ;
cusparseSetMatDiagType(descrL,CUSPARSE_DIAG_TYPE_UNIT) ;
cusparseSetMatFillMode(descrL,CUSPARSE_FILL_MODE_LOWER) ;
cusparseSetMatType(descrU,CUSPARSE_MATRIX_TYPE_GENERAL) ;
cusparseSetMatIndexBase(descrU,CUSPARSE_INDEX_BASE_ONE) ;
cusparseSetMatDiagType(descrU,CUSPARSE_DIAG_TYPE_NON_UNIT) ;
cusparseSetMatFillMode(descrU,CUSPARSE_FILL_MODE_UPPER) ;
cusparseSolveAnalysisInfo_t inforL = 0 ;
cusparseSolveAnalysisInfo_t inforU = 0 ;
cusparseStatus = cusparseCreateSolveAnalysisInfo(&inforL) ;
cusparseStatus = cusparseCreateSolveAnalysisInfo(&inforU) ;
double startFA = omp_get_wtime() ;
cusparseStatus = cusparseDcsrsv_analysis(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, N, NZ, descrL, matrixLU, iRow, jCol, inforL) ;
if(cusparseStatus != CUSPARSE_STATUS_SUCCESS) printf("%s \n\n","cusparseDcsrsv_analysis1 Error !") ;
cusparseStatus = cusparseDcsrsv_analysis(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, N, NZ, descrU, matrixLU, iRow, jCol, inforU) ;
if(cusparseStatus != CUSPARSE_STATUS_SUCCESS) printf("%s \n\n","cusparseDcsrsv_analysis2 Error !") ;
double finishFA = omp_get_wtime() ;