Специальный способ обработки матриц с большим динамическим диапазоном для процедур cuSolverSp?

У меня есть матрицы, подобные той, что по этой ссылке:

https://www.dropbox.com/s/tte3rlfsrprgtt8/ExampleMatrix.txt?dl=0

Этот пример представляет собой разреженную матрицу 9x9, где значения элементов значительно различаются по величине. Например, величина наименьшего элемента составляет 7.130249e-17, а наибольший - 1.944061e-07.

Эта матрица является матрицей A в системе линейных уравнений Ax=b, которую мне нужно решить. В моем приложении A это тип cuDoubleComplex.

В настоящее время я делаю это, используя magma_zgesv_batched (вычисляя много (в настоящее время 25), A и B различны для каждого пакета), который выполняет декомпозицию LU с частичным поворотом и чередованием строк. Это работает и дает правильный вывод, который совпадает с выводом исходного кода, который я пытаюсь ускорить. Я уверен, что это работает.

Тем не менее, в "реальной жизни" матрицы, которые мне нужно найти, будут намного больше, ~2000*2000 и magma_zgesv_batched имеют проблемы с этим, так как он предназначен для использования с небольшими матрицами. Он очень медленный и выдает предупреждения для использования родной версии. Поиск, который я провел, показывает, что люди поднялись до размера матрицы 1024*1024 с помощью magma_zgesv_batched, но я сам еще не проверял это.

Поскольку матрица A является разреженной (и будет более разреженной при увеличении размера), я изучил использование подпрограмм cuSovlerSp, в частности, cusolverSpZcsrlsvluHost (традиционный LU с частичным поворотом), так как это наиболее похоже на magma_zgesv_batched.

Однако это не дает правильных результатов, как magma_zgesv_batched. Но опять же, я уверен, что я правильно закодировал проблему в формате csr и т. Д. Я проверил фиктивную матрицу с "нормальными" (порядок 1) числами в тех же позициях, что и матрица 9*9 выше, и запустил эквивалентный Matlab A\b с теми же (плотными) фиктивными A и b, это дает тот же вывод, что и cusolverSpZcsrlsvluHost для фиктивных данных. Поэтому я убежден, что это проблема с конкретными данными, которые у меня есть в моей проблеме с большим динамическим диапазоном.

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

В чем разница между процедурами magma_zgesv_batched и cusolverSp? Они делают инверсию матрицы и т. Д. По-другому?

Должен ли я просто использовать magma_zgesv_batched с проблемами уменьшенного размера, поскольку я знаю, что это работает?

Любой совет высоко ценится!

Спасибо

1 ответ

Обратите внимание, что в MAGMA вы должны определить область вычислений.

Например, 2^-1 в GF(5) равно 3, но в реальном поле равно 0,5.

Недавно для моего вычисления я столкнулся с 58000*58000 матриц, которые были матрицами смежности графа. После 4 часов вычислений с MAGMA я не могу найти решение, поэтому я использовал sage. Мудрец решил мою проблему за считанные минуты.

Я предлагаю для больших матриц использовать шалфей.

Другие вопросы по тегам