2011-08-30 15 views
13

Znalazłem jedynie uwagę, że pamięć lokalna jest wolniejsza niż pamięć rejestrów, typy dwóch na wątek.Czy pamięć lokalna jest wolniejsza niż pamięć współdzielona w CUDA?

Pamięć współdzielona ma być szybka, ale czy jest szybsza niż pamięć lokalna [wątku]?

To, co chcę zrobić, to rodzaj filtra medianowego, ale z danym percentylem zamiast mediany. Dlatego muszę wziąć fragmenty listy, posortować je, a następnie wybrać odpowiedni. Ale nie mogę rozpocząć sortowania listy pamięci współdzielonej lub coś pójdzie nie tak. Czy stracę dużą wydajność, po prostu kopiując do lokalnej pamięci?

+0

To tak naprawdę nie jest związane z programowaniem, prawda? Nie widzę też silnego linku do tagu Mathematica. –

+7

@Sjoerd C. de Vries: w kontekście CUDA jest to pytanie związane z programowaniem - architektura ma nierównomierną przestrzeń pamięci, a programista musi jawnie wybrać, które typy pamięci i metody dostępu powinny być używane w dowolnym kodzie, który on lub ona pisze. Jest to podstawowa zasada programowania CUDA. – talonmies

+0

@talonmies Rozumiem to, ale wciąż to pytanie nie dotyczy programowego wybierania pamięci, różnic w API, programowania rejestrów vs programowania pamięci współdzielonej itp. Zasadniczo chodzi o to, który typ pamięci jest szybszy. To jest pytanie sprzętowe. Uważam, że PO powinien przeformułować pytanie, na przykład w kierunku jego problemu znalezienia określonego percentyla danych przy użyciu pamięci współdzielonej w CUDA. –

Odpowiedz

23

Pamięć lokalna jest po prostu wątku lokalnej pamięci globalnej. Jest znacznie, dużo wolniej (zarówno pod względem przepustowości, jak i opóźnień) niż rejestry lub pamięć dzielona. Zużywa także przepustowość kontrolera pamięci, która w przeciwnym razie byłaby dostępna dla transakcji globalnej pamięci. Wpływ wydajności na rozlanie lub celowe korzystanie z pamięci lokalnej może być dowolny od mniejszego do poważnego, w zależności od używanego sprzętu i użycia pamięci lokalnej.

Według badań Wasilij Volkov - patrz Better performance at lower occupancy (pdf) - jest o współczynnik 8 różnicy efektywnej przepustowości pomiędzy wspólną pamięcią i zarejestrować się na Fermi GPU (około 1000 Gb/s dla wspólnej pamięci i 8000 Gb/s dla rejestrów). Jest to nieco sprzeczne z dokumentacją CUDA, co oznacza, że ​​pamięć współdzielona jest porównywalna z szybkością do rejestrów.

+0

Tak, dziękuję, skarbie, do dalszego opracowania z moimi doświadczalnymi odkryciami wspierającymi te informacje: Praca w lokalnej pamięci z moim problemem była rzeczywiście wolniejsza o rząd wielkości. Ponieważ mój program działa już na ograniczeniach mojego rozmiaru pamięci dzielonej sprzętowo w jednym bloku, nie mogłem używać pamięci współdzielonej do ponownego obliczania, więc musiałem użyć jakichś niezbyt inteligentnych algorytmów pamięci rejestru w celu wyszukania mojego percentyla, co okazało się dość szybkie tak czy inaczej. – JohnKay

Powiązane problemy