На самом деле я опубликовал соответствующий вопрос несколько дней назад, но получил нули ответов, однако вчера я пришел к очень странному выводу, как упоминалось в моем предыдущем вопросе: Очень низкая производительность csrsv_analysis cusparse, фаза анализа разреженного треугольного решателя cusparse раздражающе медленная, не говоря уже о том, что иногда это не нужно, когда шаблон разреженности матрицы коэффициентов не допускает распараллеливания, поэтому я хотел посмотреть, как плотный треугольный решатель cubas справится с этим, поэтому я заменил решатель cusparse решателем cublas после преобразования моей матрицы коэффициентов в плотный формат, и версии cublas были примерно в 7 раз быстрее, чем версия cusparse с той же матрицей и даже после включая время преобразования формата матрицы в решателе CuBlas! Я пересмотрел решение, чтобы оно было правильным в обоих случаях!
Версия 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 мс
- Время решения CuBlas: 30 мс
- Графический процессор: GeForce GTX 550 Ti
- ОС: Windows 7 максимальная, 64-разрядная
Конечно, использование CuBlas для меня нецелесообразно, так как в моей работе задействованы матрицы большой размерности, начиная от 100 000 и даже доходящие до 1 000 000, а значит, выделение памяти таких размеров просто нецелесообразно, поэтому есть ли способ запустить разреженный решатель без этап анализа?