Каков наиболее эффективный способ вычисления обратной общей матрицы с помощью cuSolver?

Я имею в виду использовать getrf и getrs из пакета cuSolver и решить AB=X с помощью B=I.

  • Это самый лучший способ решить эту проблему?

  • Если да, то как лучше всего создать идентификационную матрицу col-major B в памяти устройства? Это можно сделать тривиально, используя цикл for, но это 1. займет много памяти и 2. будет довольно медленным. Есть ли более быстрый способ?

Обратите внимание, что cuSolver, к сожалению, не предоставляет getri. Поэтому я должен использовать getrs.


person avgn    schedule 17.06.2018    source источник
comment
Не могли бы вы добавить методы, которые вы уже использовали, к своему вопросу, пожалуйста? Спасибо!   -  person David    schedule 17.06.2018
comment
Безусловно. Я слишком поспешно задал вопрос. Теперь я добавил больше деталей. Пожалуйста, дайте мне знать, если вам нужно больше.   -  person avgn    schedule 17.06.2018


Ответы (1)


Пока CUDA не предоставит LAPACK API getri, я думаю, что getrf и getrs — лучший выбор для инверсии больших матриц.

Матрица B имеет тот же размер, что и A, поэтому я не думаю, что выделение B заставляет эту задачу потреблять намного больше памяти, чем ее входные/выходные данные.

Сложность getrf и getrs равна O(n^3) и O(n^2) соответственно, а настройка B=I равна O(n^2) + O(n). Я не думаю, что это должно быть узким местом всей процедуры. Вы можете поделиться своей реализацией, чтобы мы могли проверить, в чем может быть проблема.

person kangshiyin    schedule 25.08.2018
comment
Я хочу указать всем, кто что-то спрашивает, что у Magma есть getrf и getri. Это то, что я сейчас использую. - person avgn; 27.08.2018