Лучший выбор решателя для большой разреженной симметричной (но не положительно определенной) системы

10

В настоящее время я работаю над решением очень больших симметричных (но не положительно определенных) систем, порожденных некоторыми определенными алгоритмами. Эти матрицы имеют хороший разреженный блок, который можно использовать для параллельного решения. Но я не могу решить, должен ли я использовать прямой подход (например, мультифронтальный) или итеративный (предварительно подготовленный GMRES или MINRES). Все мои исследования показывают, что итерационные решатели (даже при довольно быстрой сходимости из 7 внутренних итераций) не могут превзойти прямой оператор '\' в MATLAB. Но в теории прямые методы должны быть более дорогостоящими. Как это происходит? Есть ли какой-либо современный документ или бумага для такого случая? Могу ли я использовать разреженность блоков в параллельных системах с использованием прямых методов так же эффективно, как гибкие итерационные решатели, такие как GMRES?

Сумядипта Саркар
источник
3
Я не думаю, что люди могут действительно эффективно комментировать это, не зная больше деталей о вашей конкретной матрице. Какие размеры? Как выглядит шаблон разреженности?
Костис
2
Многое зависит от того, что вы подразумеваете под большим. Количество переменных, , в сотнях тысяч? миллионы? N
Брайан Борчерз
2
Этот вопрос значительно совпадает с scicomp.stackexchange.com/q/81/276 ; Вы можете найти полезную информацию там. Кроме того, основываясь на этом вопросе, может быть полезно поговорить о спектре вашего оператора (или о спектре вашего предобусловленного оператора).
Джефф Оксберри

Ответы:

9

Редкий прямой решатель MUMPS может работать с симметричными неопределенными системами и находится в свободном доступе ( http://graal.ens-lyon.fr/MUMPS/ ). Ян Дафф был одним из авторов MUMPS и MA57, поэтому алгоритмы имеют много общего.

MUMPS был разработан для параллельных компьютеров с распределенной памятью, но он также хорошо работает на однопроцессорных компьютерах. Если вы свяжете его с многопоточной библиотекой BLAS, вы сможете добиться разумного ускорения в общей памяти, многоядерных процессорах.

Вы не сказали, насколько велик «очень большой», но MUMPS также имеет функцию «вне ядра» для решения проблем, когда разложенная матрица не помещается в доступную память.

Билл Грин
источник
7

Общая проблема, от которой страдают прямые решатели, - это явление заполнения, означающее, что обратная сторона разреженной матрицы может быть плотной. Это приводит к огромным требованиям к памяти, если структура матрицы не «подходит».

Есть попытки обойти эти проблемы, и в функции MATLAB по умолчанию luиспользуется несколько из них. См. Http://www.mathworks.de/de/help/matlab/ref/lu.html для обзора перестановок, диагонального масштабирования и тому подобного. То же самое относится и к более сложным пакетам, таким как MUMPS ( http://graal.ens-lyon.fr/MUMPS/ ).

В общем, однако, если ваша проблема достаточно велика, вы достигнете этой границы памяти, и вам придется использовать итерационные (крыловские) методы.

Если ваша проблема симметрична и неопределенна, МИНРЕС может быть очевидным выбором. Обратите внимание, однако, что GMRES и MINRES делают то же самое в точной арифметике, если задача симметрична, но GMRES имеет тенденцию меньше страдать от потери ортогональности. Следовательно, некоторые люди считают GMRES «лучшей реализацией MINRES».

В любом случае, вы, вероятно, выиграете от предварительной подготовки вашей системы. Если вы не хотите тратить время на адаптацию прекондиционера, неполный прекондиционер LU-факторизации (ILU) уже может куда-то вас привести.

Нико Шлёмер
источник
2

Любой итерационный решатель может превзойти прямые методы, только если проблема достаточно велика (большая, зависит от нескольких факторов, таких как требуемая память, эффективность реализации). А также любой метод Крылова (например, GMRES) хороши, только если вы используете соответствующую предварительную обработку (на практике). Если вы не используете какие-либо предварительные условия, методы Крылова вообще бесполезны. Я тоже работаю с разреженными блочными матрицами (они исходят из приложений PDE) и заметил, что блочно-обусловленный (перекрывающая добавка schwarz) решатель крылов (либо перезапущенный GMRES, либо BiCG-Stab) в сочетании с грубой сеткой (или многосеткой) масштабируется для этих тип матриц.

user1964178
источник
2

Оператор Matlab '\' очень эффективен благодаря высокому уровню программирования. Вы можете увидеть некоторые идеи и как они использовали все возможные короткие пути в книге Тимоти Дэвиса.

В matlab вы можете использовать gmres, который хорошо развит и стабилен. Вероятно, минеры, которые теоретически должны быть идеальными для вашего случая, могут быть не такими надежными (по крайней мере, мой опыт говорит об этом). Вы должны получать равную или более высокую эффективность от Matlab Gmres, если

  1. Ваша система достаточно велика (по крайней мере, несколько тысяч на несколько тысяч).
  2. Если вы используете правильный тип параметров (RESTART, MAXIT, X0). Для этого нет четких указаний. Используйте свой опыт.
  3. Используйте хороший предварительный кондиционер. Вы можете использовать ILU или даже дешевле, блок Jacobi. Это значительно сократит усилия.
  4. САМОЕ ВАЖНОЕ: Если ваша матрица разрежена, используйте формат Matlab разреженный. Matlab Gmres идеально подходит для этого. Это значительно сократит стоимость.

Для еще больших систем используйте такой инструмент, как PETSc.

Сумядипта Саркар
источник
1

Если ваша матрица имеет размерность в середине десятков тысяч или меньше, используйте прямой метод, хотя не существует много свободно доступных прямых методов для неопределенных симметричных систем (на самом деле ни один из тех, о которых я знаю, не имеет открытого источника). Там есть MA57 от HSL, но это бесплатно только для академического использования. Вы, конечно, можете игнорировать симметрию и использовать UMFPACK .

Приблизительно в десятках сотен измерений использование памяти прямым методом начинает превышать возможности обычного настольного компьютера, поэтому, если у вас нет мощной машины с общей памятью, вам придется перейти к итерационным методам. Для неопределенных задач вы можете специализировать BiCG (двухконъюгатный градиент) для симметричных систем, хотя возможен сбой. Недавно была выпущена MINRES-QLP для симметричных систем, которая обеспечивает большую числовую стабильность.

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

Существует ряд причин, по которым один подход может быть быстрее другого, особенно в зависимости от размерности матрицы. Для сильно больных условных систем итерационные методы могут довольно сильно застаиваться. Для не слишком разреженных матриц прямые методы в конечном итоге создают много заполнений, что сильно замедляет работу. Кроме того, прямые методы в Matlab высоко оптимизированы (он использует UMFPACK или MA57 для внутреннего использования), в то время как итерационные методы обычно кодируются непосредственно в Matlab, и меньше возможностей использовать BLAS уровня 3, поскольку узкие места - это применение matvecs и точечных продуктов.

Виктор Лю
источник