2012-03-30 19 views
5

Pamięć __shared__ w CUDA wydaje się wymagać znanego rozmiaru podczas kompilacji. Jednak w moim problemie, wielkość pamięci __shared__ jest znany tylko w czasie wykonywania, tjJak zdefiniować pamięć współużytkowaną CUDA o rozmiarze znanym w czasie wykonywania?

int size=get_size(); 
__shared__ mem[size]; 

Pozwoli to skończyć z „Błąd: stała wartość nie jest znana”, i nie jestem pewien, jak obejść ten problem.

+0

możliwe duplikat [przydzielanie pamięci współdzielonej] (http://stackoverflow.com/questions/5531247/allocating-shared-memory) – talonmies

Odpowiedz

5

Celem pamięci współdzielonej jest umożliwienie współpracy wątków w bloku. Kiedy deklarujesz tablicę jako __shared__, każdy wątek w bloku widzi tę samą pamięć, więc nie ma sensu, aby dany wątek mógł ustawić swój własny rozmiar dla tablicy we wspólnej pamięci.

Jednak obsługiwany jest specjalny przypadek dynamicznego określania rozmiaru pojedynczej tablicy __shared__, która ma taki sam rozmiar dla wszystkich wątków. Zobacz allocating shared memory.

Jeśli potrzebujesz dynamicznie alokować pamięć dla każdego wątku, możesz użyć new lub malloc wewnątrz jądra (na Fermi), ale alokują pamięć globalną, która prawdopodobnie będzie wolna.

+0

Właściwie starałem się uczynić blockDim.x jak wielkość pamięci __shared__, która będzie taki sam dla wszystkich wątków w tym samym bloku, ale nadal nie działa (z innym błędem). –

+0

@HailiangZhang: Możesz nie chcieć planować rozwiązania problemu poprzez dynamiczne zmienianie wymiarów bloku. Zwykle uzyskasz najlepszą wydajność, uważnie rozważając wykorzystanie zasobów jądra i ustawiając na podstawie tego stały, optymalny wymiar bloku. Na przykład za pomocą arkusza kalkulacyjnego CUDA Occupancy Calculator. Ponadto wymiary powinny zwielokrotniać się do wielokrotności rozmiaru osnowy, aby uzyskać najlepszą wydajność. Dynamiczne dopasowywanie wymiarów siatki było możliwe tylko w celu dopasowania do danych. –

+0

@RogerDahl: Ta odpowiedź jest niepoprawna. Użytkownik __can__ dynamicznie określa pamięć dzieloną jądra w czasie wykonywania - jest to cecha CUDA od wersji 1.0. Zobacz [tę odpowiedź] (http://stackoverflow.com/a/5531640/681865), w jaki sposób. – talonmies

Powiązane problemy