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?

questionAnswers(4)

yourAnswerToTheQuestion