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?
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
@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. –