Найшвидший спосіб знайти власні пари невеликої несиметричної матриці на графічному процесорі у спільній пам'яті


9

У мене є проблема, коли мені потрібно знайти всі позитивні (як у власній значенні позитивні) власні пари невеликої (зазвичай менше 60x60) несиметричної матриці. Я можу припинити обчислення, коли власне значення менше певного порогу. Я знаю, що власні значення справжні. Будь-які пропозиції щодо алгоритмів я міг би використати, щоб спробувати витіснити найкращі показники? Я повинен зробити кілька тисяч цих розкладу, тому важлива швидкість.

Спасибі заздалегідь.

EDIT: Мені потрібно це зробити на графічному процесорі у спільній пам'яті. Матриці також не обов'язково однакового розміру. Я не знаю жодної бібліотеки, яка займається цим на даний момент. Будемо вдячні пропозиції алгоритмів, які добре підходили б до проблеми.


1
Якщо я правильно зрозумів, у вас є ядро ​​CUDA, яке обчислює тисячі малих матриць у спільній пам'яті, і ви не готові копіювати їх у глобальну пам'ять. Перш ніж спробувати дати відповідь, є деякі моменти, які слід уточнити. У CUDA тривалість життя спільної пам'яті обов'язково блокує час життя: скільки потоків у вас має для кожної матриці розкласти? Чи справді важлива екстремальна продуктивність? (Як очікувані часи вилучення власних значень порівняно з часом генерації матриці?) Виходячи з того, з якого аргументу ви знаєте, що власна система є реальною? Чи може власна система несправності?
Стефано М

Привіт Стефано і дякую за Ваш коментар. На даний момент у мене буде найближчий кратний розмір основи до розміру матриці, яку я хотів би розкласти. Часи генерації матриць сильно відрізняються, і бувають випадки, коли час генерації матриць дорожчий, але існує багато ситуацій, коли час генерації матриць менше, ніж розкладання. Я знаю, що власні значення справжні через те, як формується матриця. Я б краще не вдавався в деталі тут, оскільки це призведе до погіршення оригінального питання. Нарешті, так, система може бути несправною.
Кантоку

Відповіді:


3

Не займаючись великим пошуком, рекомендую вам переглянути бібліотеку MAGMA . Вільно доступний код з постійною підтримкою. NVIDIA визнала MAGMA "проривом у вирішенні проблем власного значення".

Існує також бібліотека CULA , яка, як правило, є комерційним продуктом, хоча останнім часом вона стала безкоштовною для академічного використання (детальну інформацію тут ).


Дякую за вашу відповідь Олександр. Раніше я заглянув у обидві бібліотеки, і, наскільки я знаю, функції викликаються з хоста, і пам'ять повинна бути в глобальній пам'яті. Я вважаю, що накладні витрати будуть занадто великими, щоб виправдати використання. Усі ці матриці формуються в спільній пам'яті, використовуються в ядрі, а потім відкидаються. Я хотів би зберегти їх там, не потребуючи того, щоб повернути їх у глобальну пам’ять. Навіть якби я натиснув їх туди, все одно виникне проблема виклику багатьох функцій ядра від хоста (хоча і в декількох потоках).
Кантоку

1
@Kantoku, так, ці бібліотеки є загальнішими, і вони зберігають всю матрицю в глобальній пам'яті. Якщо ваші матриці знаходяться у спільній пам'яті, то лише одна SM може працювати на них, чи не так? Таким чином, впровадження EVD має бути досить простим.
Олександр

Так, я би так собі уявляв, саме тому я полював на алгоритми, які були б відповідні ситуації. Я не надто знайомий із несиметричним евдом, тому шукав пропозиції.
Kantoku

@Kantoku (та Олександр). Несиметричні EVD далеко не просто, навіть у послідовному випадку. Це досі активна область досліджень.
Джек Поульсон

@JackPoulson Ах, так, ви праві, але я (і я вважаю, що Олександр також) мав на увазі, що було б просто застосувати встановлений алгоритм до проблеми, враховуючи, що існує багато спрощень, які можна зробити, коли ми візьмемо розмір і характер матриці до уваги. Проблема полягає в тому, який алгоритм.
Kantoku

2

Використовуйте функції в LAPACK, навряд чи ви зможете перемогти їх у власній реалізації.


Привіт Вольфганг. Дякую за відповідь, але я маю намір реалізувати це на графічному процесорі за допомогою CUDA та для декількох тисяч цих крихітних матриць (де кожен блок обробляє декомпозицію однієї матриці), і матриці необов'язково мають однаковий розмір, тому реалізація щось, що використовує спільну пам'ять, здається, єдиним моїм вибором. Будь-яка ідея, який алгоритм найкраще підходить для цих типів матриць? PS Дякую за угоду. II лекції, які ви читали в останньому семестрі KAUST. Мені сподобалось :)
Kantoku

2
@Kantoku Ви повинні додати ці дані у своє запитання, інакше це вводить в оману.
Олександр

@Alexander Я оновив питання з більш детальною інформацією. Дякую за пропозицію!
Кантоку

1
@Kantoku: Графічні процесори трохи виходять за межі моєї сфери, але я впевнений, що там уже є бібліотеки, які роблять те, що ти хочеш (і насправді я бачу, що інші відповіді вже посилаються на них). Радий почути, що вам сподобалися мої заняття!
Вольфганг Бангерт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.