2010-05-31 3 views
7

Я пытаюсь ускорить некоторые вычисления с помощью OpenCL, а часть алгоритма состоит в инвертировании матрицы. Есть ли библиотека с открытым исходным кодом или свободно доступный код для вычисления lu-факторизации (lapack dgetrf и dgetri) матрицы или общей инверсии, написанной в OpenCL или CUDA? Матрица вещественна и квадратна, но кроме этого не имеет никаких других специальных свойств. До сих пор мне удалось найти только основные операции с матричными векторами blas на gpu.Матричная инверсия в OpenCL

Матрица довольно маленькая, всего около 60-100 строк и столбцов, поэтому ее можно вычислить быстрее на процессоре, но она используется в середине алгоритма, поэтому мне пришлось бы перенести ее на хост, вычислить обратно, а затем передать результат обратно на устройство, где оно затем используется при гораздо больших вычислениях.

+0

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

ответ

5

У меня нет реализации в Open CL, но у "Numerical Recipes" и у Gil Strang's "Into to Applied Math" есть замечательные объяснения, которые было бы легко кодировать. «NR» имеет код C, который вы можете адаптировать.

вычислить обратные

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

11

Посмотрите на ViennaCL: http://viennacl.sourceforge.net/

+0

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

1

Я знаю, что это своего рода поздно, но если вы пытаетесь сделать какие-либо вычисления матрицы на матрицу, которая является то, что (60-100 строк), то вычисления будут намного быстрее на процессоре, чем на графическом процессоре, из-за времени, необходимого для копирования информации из основной памяти в память графического процессора. Если вы хотите сделать это, я бы предложил изучить использование параллельного языка, такого как OpenMP или MPI, поскольку это позволит вам распараллелить свой код, чтобы ускорить вычисления на CPU.

0

Оригинальный вопрос (сейчас 7 лет) фактически был решен через 4 года в paper describing matrix inversion in CUDA based on Gauss-Jordan. Он пытается распределить вычисления по различным потокам и дает подробные показатели производительности для матриц размером до 2048.

Хотя не OpenCL, общие идеи будут переведены из CUDA довольно легко.

Смежные вопросы