【发布时间】:2012-07-10 05:50:21
【问题描述】:
我编写了一个带有 LU 预处理的共轭梯度求解器(用于线性方程组),我使用了 Maxim Naumov 博士在 nvidia 研究社区上的 papers 作为指导,残差更新步骤,这需要求解下三角矩阵系统然后求解一个上三角矩阵系统分为两个阶段:
- 分析阶段(利用稀疏模式并决定并行化级别)。
- 解决阶段本身。
根据与该主题相关的所有帖子以及 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
- 所有浮点运算均以双精度格式执行
- GPU:GeForce GTX 550 Ti
- 操作系统:Windows 7 终极版,64 位
【问题讨论】:
-
运行此代码的问题大小、GPU 和操作系统是什么?
-
@talonmies,我在编辑中添加了信息,非常感谢您的关注,构建大图还需要其他什么吗?这几天我一直在为此苦苦挣扎!
标签: cuda linear-algebra sparse-matrix