Треугольные решатели cuSparse и cuBlas [дубликаты]

На самом деле я опубликовал соответствующий вопрос несколько дней назад, но получил нули ответов, однако вчера я пришел к очень странному выводу, как упоминалось в моем предыдущем вопросе: Очень низкая производительность 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, а значит, выделение памяти таких размеров просто нецелесообразно, поэтому есть ли способ запустить разреженный решатель без этап анализа?


person Alphajet    schedule 10.07.2012    source источник
comment
Будьте терпеливы, иногда ответы требуют времени. Я ответил на ваш предыдущий вопрос сегодня вечером. Это действительно должно было быть редактированием вашего первого вопроса...   -  person harrism    schedule 12.07.2012
comment
Прошу прощения, ребята, я просто подумал, что первый вопрос был напрасным, но вы доказали, что я ошибаюсь, кроме того, я подумал, что результаты сравнения cuBlas достойны нового вопроса. Я прочитал ваш первый ответ @harrism, и он довольно всеобъемлющий, однако я понятия не имею, как cuBlas будет быстрее, чем cuSparse для разреженных матриц, я буду ждать ваших комментариев по этому поводу, искреннее спасибо.   -  person Alphajet    schedule 12.07.2012
comment
Ну, если я правильно понимаю, вы конвертируете в плотную матрицу, и cuBLAS при этом быстрее. Я думаю, что ответ на другой вопрос должен в некоторой степени ответить и на этот, особенно если вы предоставите дополнительную информацию, запрошенную по другому вопросу.   -  person harrism    schedule 12.07.2012
comment
Я с вами не согласен, cuSparse был написан для ускорения операций с разреженными матрицами, а преобразование определенной разреженной матрицы в плотный формат и последующее использование cuBLAS определенно должно быть медленнее, cuSparse более эффективен, когда задействованы разреженные матрицы   -  person Alphajet    schedule 12.07.2012
comment
Вы не то чтобы заставляете меня хотеть помочь... :) Думали ли вы, что, вероятно, существует порог размера матрицы, ниже которого более простые плотные вычисления более эффективны на оборудовании? Линейная алгебра разреженных матриц гораздо больше связана с памятью, чем алгебра плотных матриц. Шаблоны доступа к памяти не так удобны для параллельных процессоров.   -  person harrism    schedule 13.07.2012
comment
@harrism, я очень ценю ваши ответы и комментарии по существу, поэтому я прошу прощения, если я непреднамеренно сказал что-то, из-за чего вы не захотели помочь, надеюсь, вы уточните, имели ли вы в виду, что мой последний комментарий был таким поверхностным или что? :) Все, что я хотел сказать, это то, что матрица из 25 000 000 элементов, содержащая только 35 000 ненулевых элементов, должна выполнять множество ненужных операций при использовании cuBlas, и если эти операции опущены используя разреженные шаблоны памяти, они будут работать быстрее, это все, что я имел в виду, но вы наверняка правы в отношении проблем распараллеливания таких шаблонов.   -  person Alphajet    schedule 13.07.2012