2015-04-06 5 views
1

Недавно я разработал новый метод. Новый метод отлично работает с CUDA (от 20 до 40FPS), и я уже успешно его тестировал. Проблема возникает, когда я пытаюсь провести сравнение со старым методом. Старый метод был реализован на процессоре. Это делает разложение LU = LU первым, а затем бежит вперед + назад шаги для решения (LU) х = б. Очень хорошая вещь о старом методе заключается в том, что A не изменяется, поэтому разложение LU может выполняться только один раз, а накладные расходы - это просто вперед + назад. A является редкий и симметричный положительный положительный. (Я считаю, что это довольно распространенная практика во многих проблемах, например, в моделировании жидкостей в фиксированном домене.)Как повторить поиск вперед и назад с помощью cuSolver от CUDA?

Чтобы сделать сравнение справедливым, я хочу реализовать старый метод на графическом процессоре. Но я не нашел разреженной LU-разложения в cuSolver или cuSparse. Должен ли я рассчитать его другими библиотеками? Должен ли я использовать cusolverRfSolve() для решения? Если да, то почему л и U не поступают, но Р и Q поступают на вход этой функции? Есть ли какой-нибудь рабочий пример, похожий на то, что я пытаюсь сделать?

Даже если старый метод работает медленнее на графическом процессоре, мне бы очень хотелось его увидеть, что делает мой новый метод действительно полезным.

ответ

1

Из документации, это выглядит как планируемое использование cusolverRfSolve требует следующих предыдущих вызовов:

  • cusolverRfCreate
  • cusolverRfSetup[Host/Device] < - это принимает в качестве входных уже матрицы L, U, P и Q
  • cusolverRfAnalyze
  • cusolverRfRefactor

, а затем вы звоните только cusolverRfSolve (опять же с P и Q). Предыдущие вызовы анализируют данные матрицы и определяют стратегию параллелизма.

Учитывая примеры из документации cuSOLVER, похоже, что они преднамеренно передали факторию LU, поэтому вам необходимо предоставить факторизованные матрицы в библиотеку.

В настоящее время я работаю над интерфейсом scipy в python (scipy.sparse.linalg.splu) с cuSOLVER, чтобы обеспечить факторизацию LU Pr * A * Pc = L * U. cuSOLVER потребуется P = Pr.T и Q = Pc.T. Вы можете использовать функцию cusolverRfSetupHost, чтобы позволить cuSOLVER заботиться о распределении и передаче памяти GPU.

В качестве альтернативы можно было использовать suiteparse (http://faculty.cse.tamu.edu/davis/suitesparse.html) на C++.