2012-07-29 25 views
8

Próbuję zoptymalizować aplikację w czasie rzeczywistym modelowania 3D. Część obliczeniowa aplikacji działa prawie wyłącznie na GPU w CUDA. Aplikacja wymaga rozwiązania małego (6x6) podwójnej precyzji, symetrycznego, dodatniego, określonego układu liniowego Ax = b 500+ razy na sekundę. Obecnie odbywa się to przy użyciu wydajnej biblioteki Algebra Linear Algebra z wykorzystaniem Cholesky, ale wymaga ona kopiowania danych z procesora - GPU i z powrotem na GPU setki razy na sekundę, a narzut kernela uruchamia się za każdym razem itd.Rozwiąż małe, symetryczne, pozytywne, określone Ax = b tylko na GPU

Jak czy mogę obliczyć rozwiązanie do układu liniowego na GPU wyłącznie bez konieczności pobierania danych na procesor? Czytałem trochę o bibliotece MAGMA, ale wydaje się, że używa ona raczej algorytmów hybrydowych niż algorytmów GPU.

Jestem przygotowany na to, że rozwiązanie pojedynczego systemu liniowego na GPU będzie dużo wolniejsze niż w przypadku istniejącej biblioteki opartej na CPU, ale chcę sprawdzić, czy można to naprawić poprzez usunięcie komunikacja danych między hostem a urządzeniem i narzut kernela uruchamia się itd. setki razy na sekundę. Jeśli nie ma tam GPU, jedynej alternatywy LAPACK-a, to w jaki sposób chciałbym wdrożyć coś, aby rozwiązać ten konkretny przypadek 6x6 tylko na GPU? Czy można to zrobić bez ogromnej inwestycji w biblioteki GPAS BLAS?

+0

System liniowy 6x6 jest tak mały, że można napisać równania w kodzie CUDA ... Oczywiście dla takiego małego systemu byłoby bardzo trudno uzyskać jakiekolwiek korzyści z równoległego charakteru CUDA, ale pozbycie się komunikacja GPU-CPU dałaby rzeczywiście ogromną korzyść. Czy to możliwe, że paralelizujesz w inny sposób? Rozwiąż system na pojedynczym rdzeniu GPU, a następnie używaj wielu rdzeni dla 500+ rozwiązań. Byłoby najlepiej, chyba że potrzebujesz wyników z poprzedniego systemu, aby rozpocząć pracę nad następnym. – Eiver

+1

@Eiver jest na pieniądze. czy możesz zrobić te 500 równolegle, czy są one od siebie zależne? dla 6x6 to podejście http://en.wikipedia.org/wiki/Cholesky_decomposition#Block_variant wygląda ręcznie kodowalne ... –

Odpowiedz

3

NVIDIA opublikowała kod dla batched Axe = b solver do zarejestrowanej strony dewelopera zeszłej jesieni. Ten kod działa dla ogólnych macierzy i powinien działać wystarczająco dobrze dla twoich potrzeb, pod warunkiem, że możesz rozszerzyć macierze symetryczne do pełnych macierzy (to nie powinno być problemem dla 6x6?). Ponieważ kod wykonuje ruchy obrotowe, co nie jest konieczne dla pozytywnych, określonych matryc, nie jest optymalny dla twojego przypadku, ale możesz go zmodyfikować do swoich celów, ponieważ kod znajduje się pod licencją BSD.

Na standardowej stronie dewelopera NVIDIA występują obecnie pewne problemy. Oto w jaki sposób można pobrać batched kod solver w tym czasie:

(1) Idź do http://www.nvidia.com/content/cuda/cuda-toolkit.html

(2) Jeśli masz już konto NVdeveloper (np poprzez partners.nvidia.com) kliknij zielony "Zaloguj się do nvdeveloper" link na prawej połowie ekranu. W przeciwnym razie kliknij "Dołącz do nvdeveloper", aby ubiegać się o nowe konto; wnioski o nowe konta są zazwyczaj zatwierdzane w ciągu jednego dnia roboczego.

(3) Zaloguj się w wierszu z adresu e-mail i hasło

(4) Nie ma sekcji na prawej stronie zatytułowanej „Nowe Pliki”. Piąta pozycja od góry to "Batched Solver". Kliknij na to i przeniesie cię do strony pobierania kodu.

(5) Kliknij link "pobierz", a następnie "Akceptuj", aby zaakceptować warunki licencji. Twoje pobieranie powinno się rozpocząć.

+0

Dziękuję bardzo, od pierwszego spojrzenia na Batched Solver wygląda na to, że zrobi to, co ja szukam. –

+0

Właśnie zadałem kolejne pytanie dotyczące algebry liniowej i procesorów graficznych, o których być może wiesz! http://stackoverflow.com/questions/11778981/code-library-to-calculate-determinant-ofa-a-small-6x6-matrix-solely-on-gpu –