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.
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.
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.
źródło