2011-10-18 17 views
6

Moje wywołanie jądra kończy się niepowodzeniem z "brakującą pamięcią". Znacząco wykorzystuje ramkę stosu i zastanawiałem się, czy to jest powód jej niepowodzenia.Gdzie CUDA przydziela ramkę stosu dla jądra?

Kiedy powołując nvcc z --ptxas-options = -v drukować następujące informacje o profilu:

150352 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 
ptxas info : Used 59 registers, 40 bytes cmem[0] 

sprzętem: GTX480, SM20, 1,5GB pamięci urządzenia, 48KB współdzielonej pamięci/wieloprocesorowych.

Moje pytanie brzmi: gdzie jest przydzielona ramka stosu: we współużytkowanej pamięci globalnej, stałej pamięci ...?

Próbowałem z 1 wątkiem na blok, a także z 32 wątkami na blok. Taki sam "brak pamięci".

Kolejna kwestia: Można zwiększyć tylko liczbę wątków rezydujących na jednym multiprocesorze, jeśli całkowita liczba rejestrów nie przekracza liczby dostępnych rejestrów w multiprocesorze (32 k na moją kartę). Czy coś podobnego ma zastosowanie do rozmiaru ramki stosu?

Odpowiedz

8

Stos jest przydzielany w pamięci lokalnej. Przydział dotyczy jednego wątku fizycznego (GTX480: 15 wątków SM * 1536/wątków SM = 23040). Żądasz 150,352 bajtów/wątek => 3,4 GB miejsca na stosie. CUDA może zmniejszyć maksymalną liczbę fizycznych wątków podczas uruchamiania, jeśli rozmiar jest tak duży. Język CUDA nie został zaprojektowany, aby mieć duży stos wątków.

Pod względem rejestrów GTX480 jest ograniczony do 63 rejestrów na wątek i rejestrów 32K na SM.

+3

Poprawne jest przydzielenie ramki stosu w pamięci lokalnej. Pamięć lokalna znajduje się w pamięci urządzenia, która sprawia, że ​​dostęp do niej (jeśli nie jest buforowany) jest powolny. Jednak podanie liczby 1536 wątków/SM nie jest poprawne w tych okolicznościach i wprowadza w błąd. Łączna ilość wymaganej pamięci lokalnej do uruchomienia jądra zależy od całkowitej liczby wątków w siatce, a nie od maksymalnej liczby dozwolonych wątków na SM, a zatem zależy od czasu wykonywania. – ritter

+0

@wpunkt Cytowanie 1536 wątków/SM jest rzeczywiście poprawne dla gf100 (gtx480), a pamięć lokalna jest absolutnie przydzielana na podstawie całkowitych rezydentnych wątków, a nie na wszystkich wątkach podczas uruchamiania. Nierezydentny wątek nie potrzebuje pamięci lokalnej. Wątek wycofany nie wymaga lokalnej pamięci. Pamięć lokalna jest zależna od czasu wykonywania, ponieważ sterownik CUDA odkłada zmiany w alokacji pamięci lokalnej do czasu uruchomienia. –

0

Ramka stosu jest najprawdopodobniej w pamięci lokalnej.

Wierzę, że istnieje pewne ograniczenie zużycia pamięci lokalnej, ale nawet bez niego, myślę, że sterownik CUDA może przydzielić więcej pamięci lokalnej niż tylko jednego wątku w konfiguracji uruchomić < < < 1,1 >>>.

Tak czy inaczej, nawet jeśli uda ci się uruchomić kod, obawiam się, że może to być całkiem powolne ze względu na wszystkie operacje na stosie. Spróbuj zmniejszyć liczbę wywołań funkcji (np. Przez wstawienie tych funkcji).

Powiązane problemy