CUDA łączyła dostęp do pamięci globalnej
Przeczytałem przewodnik programowania CUDA, ale przegapiłem jedną rzecz. Powiedzmy, że mam pamięć 32-bitową w pamięci globalnej i chcę skopiować ją do pamięci współdzielonej z dostępem koalescencyjnym. Globalna tablica ma indeksy od 0 do 1024, i powiedzmy, że mam 4 bloki, każdy z 256 wątkami.
<code>__shared__ int sData[256]; </code>
Kiedy wykonywany jest łączony dostęp?
1
<code>sData[threadIdx.x] = gData[threadIdx.x * blockIdx.x+gridDim.x*blockIdx.y]; </code>
Adresy w pamięci globalnej są kopiowane od 0 do 255, każdy po 32 wątkach w warp, więc tutaj jest ok?
2.
<code>sData[threadIdx.x] = gData[threadIdx.x * blockIdx.x+gridDim.x*blockIdx.y + someIndex]; </code>
Jeśli jakiśIndex nie jest wielokrotnością 32, nie jest połączony? Błędne adresy? Czy to jest poprawne?