Як LAPACK вирішує тридіагональні системи і чому?


9

У моєму проекті я маю вирішувати пару тридіагональних матриць на кожному кроці, тому для них важливо мати гарне рішення. Я зробив власну реалізацію, просто класичний спосіб зробити це описаний у Вікіпедії. Потім я спробував використати Lapack, і, на мій подив, це було повільніше!

Тепер усередині Lapack здається, що це робить рішення за допомогою LU-факторизації, і мені цікаво, чому це не складніше, ніж могло б бути?

Крім того, я знайшов алгоритм у книзі "Числові рецепти" від nr.com, який рекурсивно ділить систему на менші тридіагональні проблеми. Це виглядало перспективно. Є якісь інші смаколики там?

Оновлення: розмір проблеми становить близько 1000x1000. Я використовував GotoBLAS, він також дає вам бібліотеку Lapack 3.1.1. Проблема не симетрична. Я використовував процедуру Lapack для загальних тридіагональних матриць.


2
Вам доведеться вказати, які програми LAPACK ви використовували для цього. Зауважте, що dgtsv виконує часткове повороти , але ваш код може цього не робити. Будь ласка, вкажіть, з якою тестовою реалізацією LAPACK ви протестували та з якими розмірами проблеми ви орієнтувались. Також, чи визначена ваша проблема симетричним позитивним?
Джед Браун

Я додав інформацію у формулювання запитання.
Тіам

Ваша програма чимось пов’язана з методами кінцевих обсягів?
Запит

Це кінцеві відмінності, але в цій перспективі я думаю, більш-менш однаковий.
Тіам

Відповіді:


7

Ви використовуєте опорну реалізацію, яка робить часткове поворот. Тридіагональні рішення дуже мало працюють і не дзвонять в BLAS. Це, швидше, повільніше, ніж ваш код, тому що він робить часткове повороти. Вихідний код dgtsv простий.

Якщо ви вирішите з однією і тією ж матрицею кілька разів, можливо, захочете зберігати фактори, використовуючи dgttrf та dgttrs . Можливо, що в оптимізованому LAPACK, такому як MKL, ACML або ESSL, реалізація буде більш ефективною.


Я трохи цікавий. Gaussian Elim з PP працював би для всіх матриць, включаючи TriDiagonal. У CFD ми використовуємо спеціальний метод для випадків FD 1D, який називається TDMA . Що, на вашу думку, було б швидше для справи, яку він обговорює? Хоча, я не зовсім впевнений, його матриці є діагонально домінуючими.
Запит

TDMA - це те, що я реалізував у своєму коді. Питання полягає в тому, чому б супершвидкий Lapack використовував процедуру часткового повороту в такій конкретній матриці, яка швидше вирішується таким простим методом, як TDMA.
Тіам

1
Це точно той же алгоритм (Гауссова елімінація, спеціалізована для тридіагональної матриці), але ваша реалізація не робить часткового повороту, тому може бути чисельно нестабільною. Таке перемикання не є безкоштовним, і ви порівнюєте їх із еталонною реалізацією. Реалізація посилань не оптимізована для продуктивності, а часткове перемикання не є безкоштовним.
Джед Браун

Я бачу, що ви маєте на увазі, я отримую перевагу від своїх знань про системи, які я вирішую. Чи надають інші реалізації LAPACK підвищення продуктивності завдяки адаптації до конкретної архітектури чи це виходить за рамки цього?
Тіам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.