0

実際、私は数日前に関連する質問を投稿しましたが、ゼロの回答が得られましたが、前の質問で述べたように、昨日は非常に奇妙な発見になりました:cusparsecsrsv_analysisのパフォーマンスが非常に遅い、cusparseのスパース三角ソルバーの分析フェーズは煩わしいほど遅いです。もちろん、係数行列のスパースパターンで並列化が許可されていない場合は不要な場合もあるので、cublasの密な三角ソルバーがそれをどのように処理するかを確認したかったので、置き換えました。係数行列を密な形式に変換した後のカブラスソルバーを備えたカスパースソルバー。同じ行列が与えられ、マトリックス形式の変換時間をCuBlasソルバーに含めた後でも、カブラスバージョンはカスパースバージョンよりも約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ソリューション時間、1回実行された分析フェーズ:180ミリ秒
  • CuBlasソリューション時間:30ミリ秒
  • GPU:GeForce GTX 550 Ti
  • OS:Windows 7 Ultimate、64ビット

もちろん、CuBlasを使用することは私にとって実用的ではありません。私の作業には、100,000から始まり1,000,000に達する大きな次元の行列が含まれるため、そのようなサイズのメモリ割り当ては単純に実用的ではありません。したがって、スパースソルバーを開始する方法はありません。分析フェーズ?

4

0 に答える 0