2012-12-29 9 views
6

W "CUDA C Programming Guide 5.0", p73 mówi: "Dowolny adres zmiennej rezydującej w pamięci globalnej lub zwracanej przez jedną z procedur alokacji pamięci sterownika lub interfejsu API środowiska wykonawczego jest zawsze wyrównany do co najmniej 256 bajtów". Nie znam dokładnego znaczenia tego zdania. Czy ktoś może pokazać mi przykład? Wielkie dzięki.Wyrównanie cuda 256 bajtów na poważnie?

Pytanie pochodne: A co z przydziałem jednowymiarowej tablicy podstawowych elementów (takich jak int) lub własnych? Adres początkowy tablicy będzie wielokrotnością 256B, podczas gdy adres każdego elementu w tablicy niekoniecznie będzie wielokrotnością 256B?

+2

Adres początkowy każdego cudaMalloc będzie wielokrotnością 256. 256 jest dwoma symbolami w hex, będą one równe zero w addrexx; więc możesz uzyskać adres taki jak 0x0456ad00, ale nie 0x0456ad80. – osgx

Odpowiedz

8

Wskaźniki, które są przydzielone przy użyciu dowolnej z funkcji alokacji pamięci urządzenia CUDA Runtime za np cudaMalloc lub cudaMallocPitch są gwarantowane do 256 bajty, czyli adres jest wielokrotnością 256.

Rozważmy następujący przykład:

char *ptr1, *ptr2; 

int bytes = 1; 

cudaMalloc((void**)&ptr1,bytes); 
cudaMalloc((void**)&ptr2,bytes); 

Załóżmy, że adres zwrócony w ptr1 pewne wielokrotnością 256, to adres zwrócone ptr2 będzie conajmniej (ptr1 + 256).

Jest to ograniczenie nałożone przez urządzenie, na które jest przydzielana pamięć. Przeważnie wskaźniki są wyrównane ze względu na wydajność. (Niektóre osoby z NVIDIA powinny być w stanie powiedzieć, czy jest jakiś inny powód).

Ważne:

wyrównanie wskaźnika nie zawsze jest 256. Na moim urządzeniu (GTX460M) jest to 512. Możesz uzyskać wyrównanie wskaźnika urządzenia przez pole cudaDeviceProp::textureAlignment.

Wyrównanie wskaźników jest również wymagane do powiązania wskaźnika z teksturami.

+2

Zapewnienie wygodnego powiązania tekstur z pamięcią przydzieloną przez cudaMalloc() bez konieczności uciekania się do korekcji tekstur jest kolejnym powodem poza wydajnością wyrównania wskaźnika zapewnioną przez cudaMalloc(). – njuffa

+0

Dodałem pytanie pochodne. pomóż mi to rozgryźć @ sgar91. – Rock

+0

Czy jesteś pewien, że jakikolwiek wynik 'cudaMalloc()' ma wyrównanie nie mniejsze niż 'cudaDeviceProp :: textureAlignment'? – einpoklum

Powiązane problemy