Jakie są najszybsze dostępne implementacje BLAS / LAPACK lub innych procedur algebry liniowej w systemach GPU?


11

Na przykład nVidia ma CUBLAS, który obiecuje 7-14-krotne przyspieszenie. Naiwnie nie jest to teoretyczna przepustowość żadnej z kart GPU nVidii. Jakie są wyzwania związane z przyspieszaniem algebry liniowej na GPU i czy są już dostępne szybsze trasy algebry liniowej?

Odpowiedzi:


9

Nie potrafię odpowiedzieć na drugą część twojego pytania, jeśli chodzi o inne wdrożenia, ale mogę zapewnić wgląd w wyzwania. Dla porównania, osobiście użyłem ViennaCL na nVidii GTX 560 Ti z 2 GB pamięci dla moich testów.

W porównaniu z kodem szeregowym na i5 w średnim zakresie widziałem przyspieszenie dla gęstych multiplikacji macierzy około 40x. W przypadku operacji takich jak wielokrotność wektora skalarnego widziałem nawet 1000-krotne przyspieszenie. 800 funtowy goryl w pokoju to jednak przepustowość pamięci. W przypadku większości komercyjnych układów GPU będziesz używać czegoś takiego jak PCIe, co ogranicza przepustowość do około 6 GB / s. W moim przypadku, podczas gdy obliczenia były 40 razy szybsze, każda z trzech kopii macierzy (dwie na GPU i jedna z tyłu) zajmowała tyle samo czasu, co samo obliczenie na procesorze.

Problemem w przypadku dowolnej ogólnej biblioteki algebry liniowej GPU jest to, że tak naprawdę nie mogą ponownie używać obiektów na GPU, ponieważ nie wiedzą, co z nimi zrobisz. Dlatego każde wywołanie jądra obliczeniowego będzie prawdopodobnie wymagało skopiowania do GPU, a następnie skopiowania wyniku z powrotem. Spowoduje to pochłonięcie dużej części zysków.

Jeśli możesz ponownie wykorzystywać obiekty, takie jak macierze, możesz napisać algorytmy wyższego poziomu, aby uniknąć jak największej ilości zarządzania pamięcią, ale biblioteka byłaby zmuszona zrobić to skutecznie.

Mam nadzieję, że to pomoże, i jestem pewien, że są tu inni ludzie, którzy są w tym dużo bardziej doświadczeni, ale takie są doświadczenia i wrażenia, które otrzymałem podczas mojej krótkiej wyprawy do obliczeń na GPU.


3
Dlatego chcesz, aby obiekty, które żyją w GPU przez dłuższy czas, nie były chętnie kopiowane z powrotem do procesora. Na przykład macierze i wektory PETSc zawierają flagę wskazującą, czy procesor i / lub procesor graficzny są aktualne. Operacja na GPU oznacza wersję procesora jako brudną i odwrotnie. Kopia jest wykonywana w sposób transparentny, jeśli zażądasz pamięci w brudnym miejscu, ale jest to rzadkie, jeśli wszystkie elementy algorytmiczne, które dotykają dużych struktur danych, mogą być wykonywane w tym samym miejscu.
Jed Brown

5

Skupię się tylko na CUDA i BLAS.

Przyspieszenie nad implementacją BLAS hosta nie jest dobrym miernikiem do oceny przepustowości, ponieważ zależy od zbyt wielu czynników, chociaż zgadzam się, że zwykle chodzi o przyspieszenie.

Jeśli spojrzysz na testy porównawcze opublikowane przez NVIDIA i weźmiesz pod uwagę, że Tesla M2090 ma 1331 Gigaflopów (pojedyncza precyzja) i 665 Gigaflopów (podwójna precyzja), zobaczysz, że dla SGEMM i DGEMM mamy zmierzoną przepustowość prawie na poziomie 60% teoretycznej, co jest całkiem niezłe.

2mnkm×kk×n

Co się tyczy trwałej przepustowości zmiennoprzecinkowej, uważam, że flopy powinny być obliczane bez uwzględnienia danych i czasów transferu wyników, co utrudnia porównywanie przyspieszeń. Ponadto należy wziąć pod uwagę rozmiar matrycy, ponieważ najlepsza wydajność dotyczy dużych matryc.

Podsumowując: przyspieszenie rzeczywistej aplikacji może się bardzo różnić od szczytowej wydajności mierzonej w procedurach algebry liniowej, ponieważ należy wziąć pod uwagę inicjalizację GPU, czasy przesyłania danych itp. Itp.

Nie odpowiem więc na twoje pytanie dotyczące najszybszej biblioteki, ponieważ pytanie nie ma sensu, chyba że zdefiniowana zostanie precyzyjna metryka i problem. Wszystko to mówi, myślę, że cuBLAS i MAGMA są bardzo dobrym punktem wyjścia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.