C ++ / CUDA усеченный SVD для большой матрицы (желательно на GPU) - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть гигантская матрица (A) на графическом процессоре, которая мне нужна, ортогонально разложенная (A = U * V ^ T). Использование SVD пришло на ум, но, возможно, вы, ребята, направите меня в другом направлении. Я пишу на C ++ / CUDA.

A - 131262 на 1380 в памяти, что означает, что, если я использую полное разложение SVD, матрица U не поместится на моем GPU. Один U будет занимать 131262 ^ 2 * 4 = 68918850576 байт.

Я надеялся, что cuSOLVER cusolverDnSgesvd может создать усеченный SVD, учитывая только достаточно памяти для усеченного SVD, но, похоже, это не так. Документация для cusolverDnSgesvd предполагает, что для mxn mtx A значение U должно быть mxm в памяти, даже если вы используете опцию jobu = 'S'.

Может кто-нибудь предложить альтернативный стабильный и, надеюсь, быстрый подход, учитывая размер моего mtx A? Я действительно ценю всю помощь!

Я надеялся, что cuSOLVER cusolverDnSgesvd сможет создать усеченный SVD, учитывая только достаточно памяти для усеченного SVD, но, похоже, это не так. Документация для cusolverDnSgesvd предполагает, что для mxn mtx A значение U должно быть mxm в памяти, даже если вы используете опцию jobu = 'S'.

...