2012-01-14 9 views
7

Każde urządzenie GPU (AMD, NVidea lub dowolne inne) jest podzielone na kilka jednostek obliczeniowych (MultiProcessors), z których każda ma stałą liczbę rdzeni (VertexShaders/StreamProcessors). Tak więc, ma się do czynienia z równoczesnymi procesorami, które można obliczyć, ale jest tylko mała stała ilość pamięci __local (zwykle 16KB lub 32KB) dostępnej w MultiProcessorze. Dlatego liczy się dokładna liczba tych multiprocesorów.Rozmiar pamięci lokalnej OpenCL i liczba jednostek obliczeniowych

Teraz moje pytania:

  • (a) Jak mogę znać liczbę wieloczynnościowe na urządzeniu? Czy to jest to samo, co CL_DEVICE_MAX_COMPUTE_UNITS? Czy mogę wywnioskować z arkuszy specyfikacji, takich jak http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units?
  • (b) Jak mogę się dowiedzieć, ile pamięci __local na MP jest dostępne na GPU przed jej zakupem? Oczywiście mogę zażądać CL_DEVICE_LOCAL_MEM_SIZE na komputerze, który go obsługuje, ale nie widzę, w jaki sposób mogę wydedukować go z nawet pojedynczego szczegółowego arkusza specyfikacji, takiego jak http://www.amd.com/us/products/desktop/graphics/7000/7970/Pages/radeon-7970.aspx#3?
  • (c) Jaka jest karta z obecnie największą liczbą CL_DEVICE_LOCAL_MEM_SIZE? Cena naprawdę nie ma znaczenia, ale 64KB (lub więcej) dałoby wyraźną korzyść dla aplikacji, którą piszę, ponieważ mój algorytm jest w pełni zsynchronizowany, ale także wysoce intensywnie wykorzystujący pamięć z losowym wzorcem dostępu w każdym MP (iteracja na krawędziach wykresów).
+0

Spróbuj uruchomić zapytanie urządzenia w przykładach podanych przez AMD/NVIDIA w SDK. Jeśli chcesz poznać zapytania urządzenia dotyczące określonego urządzenia, jest wielu, którzy umieścili go w Internecie. – nouveau

Odpowiedz

7
  1. CL_DEVICE_MAX_COMPUTE_UNITS powinno dać liczbę ComputeUnits, w przeciwnym razie można rzut oka z odpowiednich podręcznikach (The AMD opencl programming guide i Nvidia OpenCL programming guide)
  2. prowadzi link przewodnik dla AMD zawiera informacje o availible pamięci lokalnej jednostce obliczeniowej (ogólnie 32kB/CU). W przypadku NVIDII szybkie wyszukiwanie w wyszukiwarce Google ujawniło this document, która daje lokalny rozmiar pamięci jako 16kB/CU dla GPU opartych na G80 i G200. W przypadku kart opartych na fermi (GF100) dostępnych jest 64kB pamięci onchip, która może być skonfigurowana jako pamięć lokalna 48kB i pamięć podręczna LK 16kB lub lokalna pamięć 16kB i pamięć podręczna L1 48kB. Ponadto karty oparte na fermi mają pamięć podręczną L2 o wartości do 768 kB (768 kB dla GF100 i GF110, 512 kB dla GF104 i GF114 i 384 kB dla GF106 i GF116, brak dla GF108 i GF118 według wikipedia).
  3. Z powyższych informacji wynika, że ​​obecne karty Nvidia mają najwięcej pamięci lokalnej na jednostkę obliczeniową. Co więcej, jest to jedyna wersja z ogólną pamięcią podręczną L2 z mojego zrozumienia.

W przypadku korzystania z pamięci lokalnej należy jednak pamiętać, że pamięć lokalna jest przydzielana na grupę roboczą (i jest dostępna tylko dla grupy roboczej), podczas gdy jednostka obliczeniowa może zwykle obsługiwać więcej niż jedną grupę roboczą. Jeśli więc twój algorytm przydzieli całą lokalną pamięć do jednej grupy roboczej, nie będziesz w stanie użyć osiągnąć maksymalnej ilości równoległości. Zauważ też, że skoro pamięć lokalna jest zablokowana, losowy dostęp doprowadzi do wielu konfliktów bankowych i serializacji warp. Więc twój algorytm może nie sparaliżować się tak dobrze, jak myślisz, że to zrobi (a może będzie, po prostu wspominając o możliwości).

Z kartą opartą na Fermi najlepiej postawić na pamięć podręczną zamiast na jawną pamięć lokalną, jeśli wszystkie grupy robocze działają na tych samych danych (nie wiem, jak zmienić konfigurację L1/pamięci lokalnej).

+0

To bardzo interesujący punkt, w którym się rozwijasz, mój algorytm rzeczywiście zużywa całą pamięć lokalną na jednostkę obliczeniową.Ile grup roboczych powinno działać na tej samej jednostce obliczeniowej, aby uruchomić ją z pełną prędkością? – user1111929

+0

Również, że pamięć podręczna L2 brzmi interesująco, ale nie rozumiem. Nowoczesne urządzenia mają 32 jednostki obliczeniowe, a Fermi zapewnia pamięć podręczną L2 768 KB, czyli tylko 24 KB na jednostkę obliczeniową (w porównaniu do LK 64KB)? To znaczy. jest mniej pamięci podręcznej L2 niż L1? Czy nie rozumiem sensu tej pamięci podręcznej? – user1111929

+0

Dodatek do mojego pierwszego komentarza powyżej: każda grupa robocza będzie składać się z kilkuset elementów roboczych. – user1111929

Powiązane problemy