#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.