cuSparse与cuBlas三角形求解器

时间:2012-07-10 17:24:49

标签: cuda linear-algebra sparse-matrix cublas

实际上我几天前发布了一个相关的问题,但我得到了零回答,但是,昨天我发现了一个非常奇怪的发现,正如我在上一个问题中提到的那样: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 !") ;

测试用例:

  • 尺寸(N)= 5000 * 5000
  • 非零数(NZ)= 35,000
  • 迭代次数: 3
  • CuSparse解决时间,分析阶段执行一次: 180 ms
  • CuBlas解决方案时间: 30 ms
  • GPU: GeForce GTX 550 Ti
  • 操作系统: Windows 7旗舰版,64位

当然,使用CuBlas对我来说是不切实际的,因为我的工作涉及大尺寸矩阵,从100,000开始甚至达到1,000,000,因此,这种尺寸的内存分配根本不切实际,所以有没有办法启动稀疏求解器没有分析阶段?

0 个答案:

没有答案