#c #matrix #cuda #solver
#c #матрица #cuda #решатель
Вопрос:
В рамках более масштабной задачи мне нужно решить небольшие линейные системы (т. е. NxN, где N ~ 10), поэтому использование соответствующих библиотек cuda не имеет никакого смысла с точки зрения скорости.
К сожалению, также неясно, как приступить к решению таких систем, не прибегая к таким мощным инструментам, как GSL, EIGEN и т.д.
Может ли кто-нибудь указать мне в направлении решателя плотных матриц (Ax = B) на прямом C?
Для тех, кому интересно, базовая структура генератора для этого раздела кода является:
ndarray=some.generator(N,N)
for v in range N:
B[v]=_F(v)*constant
for x in range N:
A[v,x]=-_F(v)*ndarray[x,v]
К сожалению, у меня примерно нулевые знания по высшей математике, поэтому я был бы признателен за любой совет.
ОБНОВЛЕНИЕ: я работал над этим, и у меня есть почти готовое решение, которое запускается, но не работает. Любой, кто скрывается, может проверить, что у меня уже есть на pastebin.
Я использую декомпозицию Crout с поворотом, которая кажется наиболее общим подходом. Идея этого теста заключается в том, что каждый поток выполняет одинаковую работу. Скучно, я знаю, но план состоит в том, что переменная matrixcount увеличивается, вводятся фактические данные, и каждый поток решает небольшие матрицы по отдельности.
Спасибо всем, кто проверял это.
ОБНОВЛЕНИЕ ПОСЛЕ ОТВЕТА: Закончил код решения матрицы для работы с процессором и графическим процессором, ознакомьтесь с моей ленивой записью здесь
Комментарии:
1. Какая плотная система вас интересует?
2. @talonmies еще раз здравствуйте! Это проблема многопользовательской связи, где этот небольшой раздел является количественной мерой дополнительной стоимости загрузки битов. В настоящее время я рассматриваю возможность реализации Crout. В основном ищу что-то, что выполняет Ax = B из среды CUDA (py)
3. @Andrew Bolster: Я имел в виду, обладает ли разлагаемая матрица какими-либо свойствами или структурой, которые вы можете использовать, или которые предписывают конкретный численный метод по соображениям стабильности.
4. @Talonmies обновил вопрос, но мои небольшие знания говорят о том, что «используйте общий подход». Может быть, вы сможете найти более разумный способ.
5. В старых добрых книгах по числовым рецептам есть целые главы, посвященные процедурам факторизации матриц. Я предлагаю использовать числовые рецепты в книге Fortran в качестве справочного материала — последовательный Fortran часто легче перенести в код устройства, чем что-то более «навороченное». Наивная факторизация LU (это именно то, что вы хотите), вероятно, составляет всего около 25-30 строк кода. Процедуры обратной и прямой подстановки составляют всего еще по 10 каждая. Оформите их, и пусть компилятор разворачивает циклы.
Ответ №1:
CUDA здесь не поможет, это правда. Подобные матрицы просто слишком малы для этого.
То, что вы делаете для решения системы линейных уравнений, — это разложение LU:
Или, что еще лучше, QR-декомпозиция с отражениями домохозяев, как в процессе Грама-Шмидта.
Впоследствии решение линейного уравнения становится легким, но, боюсь, всегда присутствует некоторая «высшая математика» (линейная алгебра). Это, и их много (many!) Существуют библиотеки C для решения линейных уравнений. Мне не кажется, что это «большие пушки».
Комментарии:
1. Я не собираюсь использовать графический процессор для этого бита; я хочу, чтобы каждый поток выполнял свое собственное решение малой матрицы
2. Было бы лучше, если бы каждый блок решал свою собственную маленькую матрицу. Перебирать поток, решающий одну матрицу, — плохая идея. Если ничего не делать, то падение производительности при асинхронном чтении огромно.