Специальный способ обработки матриц с большим динамическим диапазоном для подпрограмм 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 с проблемами уменьшения размера, поскольку я знаю, что это работает?

Любые советы очень ценятся!

Спасибо


person JozzaChozza    schedule 15.04.2016    source источник


Ответы (1)


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

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

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

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

person Meysam Ghahramani    schedule 26.04.2016