f3434s 0 23 апреля, 2021 Опубликовано 23 апреля, 2021 · Жалоба Реализация алгоритма SVD на CUDA для простых матриц, т.е. которые хранятся построчно в виде массива. Количество столбцов не должно превышать количество строк. Размерности матрицы должны быть кратны 16. Реализован алгоритм, описанный в работе "SVD-разложение и его практические приложения, Колесников Е.В.". Сначала проводится бидиагонализация матрицы. Затем запускается итерационный алгоритм, состоящий из QR-поворотов. Разница только в том, что в данной программе по диагонали бегут сразу несколько потоков. Программа не использует никаких дополнительных библиотек. Из-за проблемы остановки долго работающих ядер драйвером приходится разбивать задачи на части. Например, функции перемножения матриц запускаются в тройных циклах. Первый цикл соответствует группам строк, второй - группам столбцов, а третий разбивает перемножение строки на столбец на части. Программа отлаживалась на видеокарте GTX 280. В алгоритме бидиагонализации используется преобразование Хаусхолдера, матрица которого равна своей обратной и транспонированной. Для отладки раскомментируйте строки с PrintCudaMatrixToFile(). Главный файл - svd.cu Архив с программой тут: https://disk.yandex.ru/d/XORcDdt3SJbJSg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться