私は LU 前処理を使用して共役勾配ソルバー (方程式の線形システム用) を作成し、nvidia の研究コミュニティに関するマキシム ナウモフ博士の論文をガイドラインとして使用しました。上三角行列システムは、次の 2 つの段階に分けられます。
- 分析フェーズ (スパース パターンを利用し、並列化レベルを決定します)。
- 解決段階そのもの。
このトピックに関連するすべての投稿、およびナウモフの論文自体によると、分析フェーズは解決フェーズよりも大幅に遅くなりますが、一度実行されるため、全体の実行時間を考慮すると問題になることはありませんが、私のプログラムでは、解析フェーズに全体のソリューション時間 (すべての反復を実行するのに必要な時間!) の ~35-45% が必要です。ほぼすべての要素で以前の要素が既知である必要があるため、大量の並列化が可能になります (CFD では、各ノードはその周囲に少なくとも隣接する 6 つのノード (六面体ボリューム) を必要とし、それがすべての行で繰り返されるため)、分析フェーズとにかくあまり役に立ちません!
このコードのmatrixLUには上三角行列と下三角行列の両方が含まれ、上三角行列は元の行列の対角線を使用し、下三角行列は 1 対角線 (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 ミリ秒
- 解決フェーズの実行時間 (すべての反復の合計): 350 ミリ秒
- すべての浮動小数点演算は倍精度形式で実行されます
- GPU: GeForce GTX 550 Ti
- OS: Windows 7 Ultimate、64 ビット