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