实际上我几天前发布了一个相关问题,但是我得到了零答案,但是,我昨天发现了一个非常奇怪的发现,正如我之前的问题中提到的那样:cusparse csrsv_analysis 的性能非常慢, cusparse 的稀疏三角求解器的分析阶段非常慢,更不用说当系数矩阵稀疏模式不允许并行化时有时是不必要的,所以我想看看 cublas 密集三角求解器如何处理这个问题,所以我替换了在将我的系数矩阵转换为密集格式后,带有 cublas 求解器的 cusparse 求解器,并且 cublas 版本比给定相同矩阵的 cusparse 版本快约 7 倍,甚至在 CuBlas 求解器中包含矩阵格式转换时间之后!我修改了解决方案,所以在这两种情况下都是正确的!
Cu稀疏版
// 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 !") ;
测试用例:
- 尺寸 (N) = 5000 * 5000
- 非零数 (NZ) = 35,000
- 迭代次数:3
- CuSparse 求解时间,分析阶段执行一次:180 ms
- CuBlas 求解时间:30 ms
- 显卡:GeForce GTX 550 Ti
- 操作系统:Windows 7 终极版,64 位
当然,使用 CuBlas 对我来说是不切实际的,因为我的工作涉及到大维度矩阵,从 100,000 开始甚至达到 1,000,000,因此,这种大小的内存分配根本不切实际,那么有没有办法在没有分析阶段 ?