Вот некоторые результаты, которые я получил с LAPACK на моем ноутбуке.
Для факторизации обычной матрицы в LAPACK используется подпрограмма
dgetrf, которая основана на использовании BLAS уровня 3. В то же время для
той же цели можно воспользоваться dgetf2, где уже будет использоваться
только BLAS 2.
Как точку отсчета я взял LAPACK с BLAS, который вложен в LAPACK
(неоптимизированный BLAS). Для случайно сгенерированной матрицы 2000x2000
время факторизации составило
dgetf2 13.6 секунды
dgetrf 4.2 секунды
Видно, что переход с уровня BLAS2 на BLAS3 дает существенное ускорение.
Еще раз, в обоих случаях использовался неоптимизированный BLAS, просто
компиляция LAPACK и BLAS - того, что есть.
Следующий шаг - это использование ATLAS вместо BLAS. ATLAS также меняет
некоторые программы в LAPACK, скажем подпрограмму, где определяется размер
блока. С ATLAS результаты получились следующие
dgetf2 13.6 секунды
dgetrf 2.7 секунды
То есть, на уровне dgetf2 все осталось без изменений, а вот для dgetrf
заметно ускорение.
Это показывает, что наибольшее изменение приносит замена алгоритма, в
данном случае переход к блочным алгоритмам. Аппаратное ускорение также
важно, то эффект уже меньше.
Евгений
Мне кажется, что все зависит от цели. Так, я не хочу сказать, что
невозможно сделать новую библиотеку, которая будет быстрее LAPACK.
Скажем, ссть интересное альтернативное развитие в рамкам проекта FLAME
http://www.cs.utexas.edu/users/flame/
Хотя, должен сказать, я так и не нашел времени более внимательно
посмотреть на это.
Я практик, моя цель не разработка новых решателей для системы линейный
уравнений, а использование готовых библиотек в ходе решения моих
практических задач.
Я помню, одно время я использовал библиотеку GNUSSL на C++, поскольку я
сам пишу уже давно на C++
http://ftp.gnu.org/pub/old-gnu/gnussl/
Все было очень итересно - крутые шаблоны, но затем я как-то сравнил ее
производительность с LAPACK. После этого я окончательно перешел на LAPACK.
Вот сейчас мне надо найти хороший решатель для разреженных
несимметричных матриц большой размерности (около 1 миллиона). UMFPACK,
который я использую, уже не тянет. Я списался с автором UMFPACK и он
сказал, что программа AMD, которая у него переупорядочивает матрицу, для
больших размерностей делает это уже не эффективно.
К слову сказать он сказал, что его CHOLMOD быстрее чем TAUCS и дал ссылку
http://portal.acm.org/citation.cfm?id=1236465
но у меня нет к ней доступа.
Так что мой план на ближайшее будущее - это попробовать MUMPS и PARDISO.
С MUMPS я уже работал для симметричных матриц - впечателение было
хорошее. MUMPS поддерживает также параллельные вычисления:
http://modelreduction.com/doc/papers/rudnyi06tam.pdf
С другой стороны Intel лицензировал PARDISO
http://www.intel.com/cd/software/products/asmo-na/eng/266853.htm
Это говорит, что должен быть неплохой решатель.
Евгений
Правильно. Про это написано в самом начале этой подпрограммы
http://www.netlib.org/lapack/double/dgetrf.f
и также можно увидеть, что она вызывает dgetf2 для блоков.
А здесь коротко написано про блочные алгоритмы
http://www.netlib.org/lapack/lug/node60.html
Block Algorithms and their Derivation