В моем проекте мне нужно решать пару трехдиагональных матриц на каждом временном шаге, поэтому очень важно иметь хороший решатель для них. Я сделал свою собственную реализацию, просто классический способ сделать это, описанный в Википедии. Затем я попытался использовать Lapack вместо этого, и, к моему удивлению, это было медленнее!
Теперь внутри Лапака кажется, что он решает с помощью факторизации LU, и я удивляюсь, почему, разве это не сложнее, чем могло бы быть?
Кроме того, я нашел алгоритм в книге «Численные рецепты» с сайта nr.com, который рекурсивно делит систему на более мелкие трехдиагональные задачи. Это выглядело многообещающе. Есть ли еще какие-нибудь вкусности?
Обновление: размер проблемы около 1000х1000. Я использовал GotoBLAS, он также предоставляет библиотеку Lapack 3.1.1. Проблема не симметрична. Я использовал процедуру Лапака для общих трехдиагональных матриц.
источник
Ответы:
Вы используете эталонную реализацию, которая выполняет частичное вращение. Трехдиагональные решения делают очень мало работы и не вызывают BLAS. Это, вероятно, медленнее, чем ваш код, потому что он делает частичное вращение. Исходный код dgtsv прост.
Если вы решите одну и ту же матрицу несколько раз, вы можете сохранить коэффициенты, используя dgttrf и dgttrs . Возможно, что реализации в оптимизированном LAPACK, таком как MKL, ACML или ESSL, будут более производительными.
источник