Решение линейных уравнений во время обратной итерации

#opencl #linear-algebra #eigenvector

#opencl #линейная алгебра #собственный вектор

Вопрос:

Я использую OpenCL для вычисления собственных векторов матрицы. У AMD есть пример вычисления собственных значений, поэтому я решил использовать обратную итерацию для получения собственных векторов.

Я следовал алгоритму, описанному здесь, и я заметил, что для решения шага 4 мне нужно решить систему линейных уравнений (или вычислить обратную матрицу).

Обратная итерация

Каков наилучший способ сделать это на графическом процессоре с использованием OpenCL? Есть ли какие-либо примеры / ссылки, на которые я должен обратить внимание?


РЕДАКТИРОВАТЬ: извините, я должен был упомянуть, что моя матрица симметричная трехдиагональная. Из того, что я читал, это может быть важно и, возможно, значительно упрощает весь процесс

Ответ №1:

Тот факт, что матрица является трехдиагональной, ОЧЕНЬ важен — это снижает сложность задачи с O (N ^ 3) до O (N). Вероятно, вы можете получить некоторое ускорение из-за того, что он тоже симметричен, но это будет не так драматично.

Метод решения трехдиагональной системы здесь: http://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm .

Также обратите внимание, что вам не нужно хранить все N ^ 2 элемента матрицы, поскольку почти все они будут равны нулям. Вам просто нужен один вектор длины N (для диагонали) и два вектора длины N-1 для суб- и супердиагоналов. И поскольку ваша матрица симметрична, суб- и супердиагоналы одинаковы.

Надеюсь, это полезно…

Комментарии:

1. Спасибо. Кажется, это работает, и это действительно просто. Я перенесу его на OpenCL.

2. @nmat просто интересно, добились ли вы успеха в написании своего трехдиагонального решателя в OpenCL? Я также хочу решить трехдиагональную систему. На данный момент, похоже, не существует канонического способа выполнения линейной алгебры (BLAS и LAPACK) на графическом процессоре. Поскольку прошло несколько лет с тех пор, как я задал вам вопрос, есть ли у вас какие-либо предложения по наилучшему пути продвижения вперед?

3. @boyfarrell Извините, но я не могу вам помочь. Я не начинал его писать. Удачи с вашей проблемой

Ответ №2:

Я предлагаю использовать разложение LU. Вот пример.

Это написано на CUDA, но я думаю, что не так сложно переписать его на OpenCL.