Projektuję zestaw funkcji matematycznych i implementuję je w wersjach zarówno CPU, jak i GPU (z CUDA).Pamięć CUDA do tablic przeglądowych
Niektóre z tych funkcji są oparte na tabelach odnośników. Większość stołów zajmuje 4KB, niektóre nieco więcej. Funkcje oparte na tabelach odnośników pobierają dane wejściowe, wybierają jeden lub dwa wpisy tabeli odnośników, a następnie obliczają wynik przez interpolację lub zastosowanie podobnych technik.
Moje pytanie brzmi teraz: gdzie powinienem zapisać te tabele odnośników? Urządzenie CUDA ma wiele miejsc do przechowywania wartości (pamięć globalna, stała pamięć, pamięć tekstur, ...). Pod warunkiem, że każda tabela może być odczytywana jednocześnie przez wiele wątków i że wartości wejściowe, a zatem i indeksy odnośników, mogą być całkowicie nieskorelowane pomiędzy wątkami każdej osnowy (powodując nieskorelowane dostępy do pamięci), która pamięć zapewnia najszybszy dostęp?
Dodam, że zawartość tych tabel jest wstępnie obliczona i całkowicie stała.
EDIT
prostu do wyjaśnienia: muszę przechowywać około 10 różnych tabel 4KB odnośników. W każdym razie byłoby wspaniale wiedzieć, że rozwiązanie jest takie samo jak w przypadku z np. 100 tabel 4KB lub np. 10 tabel wyszukiwania 16 KB.
Stała pamięć podręczna jest przeznaczona dla przypadku rozgłoszeniowego, tj. Dostęp przez osnowę jest jednolity. Będzie działać, jeśli wszystkie wątki w warpie uzyskają dostęp do różnych lokalizacji, ale wydajność spada. Pamięć współdzielona jest szybka i ma rozmiar 48 KB, więc jest dobrze dopasowana, ale może być potrzebna do innych celów lub twój kod jest częścią biblioteki, w której to nie działa dobrze. Jeśli nie możesz używać pamięci współdzielonej, proponuję tekstury. Najlepiej nie używać żadnych tabel na GPU (zobacz także bibliotekę matematyczną CUDA), ponieważ FLOPS rosną szybciej niż przepustowość pamięci w procesorach GPU. – njuffa
Dzięki, njuffa, za jasne wyjaśnienie. Moje jedyne pytanie dotyczy wspólnej pamięci. Jeśli dobrze pamiętam, pamięć ta jest dzielona między wątki w tej samej osnowie. Czy powinienem powielać moje tabele na wszystkich osnowach? Czy tabele będą trwałe po zakończeniu jądra? – Spiros
Pamięć współdzielona jest dzielona między wszystkie wątki w bloku wątków. Tak więc obawiam się, że w sumie 40KB pamięci podręcznej Twój kod będzie ograniczony do pojedynczego bloku wątków na SM.W większości przypadków lepiej jest mieć uruchomione co najmniej dwa bloki wątków, więc warto rozważyć zastosowanie mieszanego schematu, w którym niektóre tabele są przechowywane w pamięci współdzielonej (te z największymi dostępami) i inne w pamięci tekstury. Pamięć tekstur ma także tę zaletę, że można uzyskać liniową interpolację (o niskiej dokładności) za darmo. Jakie funkcje matematyczne implementujesz, które wymagają dużych tabel? – njuffa