我写了一个带有 LU 预处理的共轭梯度求解器(用于线性方程组),我使用 Maxim Naumov 博士在 nvidia 研究社区上的论文作为指导,残差更新步骤,这需要求解下三角矩阵系统,然后求解上三角矩阵系统分为两个阶段:
- 分析阶段(利用稀疏模式并决定并行化级别)。
- 解决阶段本身。
根据与该主题相关的所有帖子以及 Naumov 的论文本身,分析阶段比求解阶段慢得多,但它只执行一次,因此考虑到整个执行时间,这应该不是问题,但是,在我的程序中,分析阶段需要大约 35-45% 的整个求解时间(执行所有迭代所需的时间!),这很烦人,另一件事是我很确定矩阵的稀疏模式不会允许大量并行化,因为几乎所有元素都需要知道先前的元素(因为在 CFD 中,每个节点都需要至少相邻的 6 个节点(六面体体积)围绕它,并且每行都重复),所以分析阶段反正不会很有用!
这段代码中的matrixLU同时包含上三角矩阵和下三角矩阵,上三角矩阵使用原始矩阵对角线,下三角矩阵有单位对角线(LU分解)。
// 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() ;
那么,有人知道为什么分析阶段如此缓慢吗?以及如何加速?(分析阶段执行时间)/(求解阶段执行时间)比率是否取决于 GPU?
编辑: 我在很多情况下都尝试了这个求解器,结果很接近,但在我关心的特定情况下,它具有以下条件:
- 尺寸 ( N ) : ~ 860,000 * 860,000
- 非零数 ( NZ ): ~ 6,000,000
- 收敛所需的迭代次数:10
- 分析阶段执行时间:210 ms
- 求解阶段执行时间(总结所有迭代):350 ms
- 所有浮点运算都以双精度格式执行
- 显卡:GeForce GTX 550 Ti
- 操作系统:Windows 7终极版,64 位