实际上我几天前发布了一个相关的问题,但我得到了零回答,但是,昨天我发现了一个非常奇怪的发现,正如我在上一个问题中提到的那样:Very slow performance of cusparse csrsv_analysis,稀疏的分析阶段cusparse的三角解算器非常慢,更不用说当系数矩阵稀疏模式不允许并行化时,它有时是不必要的,所以我想看看cublas密集三角形求解器如何处理它,所以我用cublas求解器替换了cusparse求解器在将我的系数矩阵转换为密集格式之后,在给定相同矩阵的情况下,即使在CuBlas求解器中包含矩阵格式转换时间之后,Cublas版本比cusparse版本快〜7倍!我修改了解决方案,所以在两种情况下都是正确的!
CuSparse版本
// Analysis phase
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 !") ;
// Solve phase
cusparseStatus = cusparseDcsrsv_solve(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, N, &c2, descrL, matrixLU, iRow, jCol, inforL, r, t) ;
if(cusparseStatus != CUSPARSE_STATUS_SUCCESS) printf("%s \n\n","cusparseDcsrsv_solve1 Error !") ;
cusparseStatus = cusparseDcsrsv_solve(cusparseHandle, CUSPARSE_OPERATION_NON_TRANSPOSE, N, &c2, descrU, matrixLU, iRow, jCol, inforU, t, z) ;
if(cusparseStatus != CUSPARSE_STATUS_SUCCESS) printf("%s \n\n","cusparseDcsrsv_solve2 Error !") ;
CuBlas版本
// CSR to dense conversion
cusparseStatus = cusparseDcsr2dense(cusparseHandle, N, N, descrLU, matrixLU, iRow, jCol, aLU, N) ;
if(cusparseStatus != CUSPARSE_STATUS_SUCCESS) printf("%s \n\n","cusparseDcsr2dense1 Error !") ;
// Solving directly
cublasStatus = cublasDtrsv(cublasHandle, CUBLAS_FILL_MODE_LOWER, CUBLAS_OP_N, CUBLAS_DIAG_UNIT, N, aLU, N, z, 1) ;
if(cublasStatus != CUBLAS_STATUS_SUCCESS) printf("%s \n\n","cublasSolve1 Error !") ;
cublasStatus = cublasDtrsv(cublasHandle, CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N, CUBLAS_DIAG_NON_UNIT, N, aLU, N, z, 1) ;
if(cublasStatus != CUBLAS_STATUS_SUCCESS) printf("%s \n\n","cublasSolve2 Error !") ;
测试用例:
当然,使用CuBlas对我来说是不切实际的,因为我的工作涉及大尺寸矩阵,从100,000开始甚至达到1,000,000,因此,这种尺寸的内存分配根本不切实际,所以有没有办法启动稀疏求解器没有分析阶段?