CUDA verschmolz den Zugriff auf den globalen Speicher
Ich habe die CUDA-Programmieranleitung gelesen, aber eine Sache habe ich verpasst. Angenommen, ich habe ein Array mit 32-Bit-Int im globalen Speicher und möchte es mit zusammengeführtem Zugriff in den gemeinsamen Speicher kopieren. Globales Array hat Indizes von 0 bis 1024, und sagen wir, ich habe 4 Blöcke mit jeweils 256 Threads.
<code>__shared__ int sData[256]; </code>
Wann wird ein kombinierter Zugriff durchgeführt?
1.
<code>sData[threadIdx.x] = gData[threadIdx.x * blockIdx.x+gridDim.x*blockIdx.y]; </code>
Adressen im globalen Speicher werden von 0 auf 255 kopiert, jeweils um 32 Threads in Warp, also ist es hier in Ordnung?
2.
<code>sData[threadIdx.x] = gData[threadIdx.x * blockIdx.x+gridDim.x*blockIdx.y + someIndex]; </code>
Wenn someIndex nicht ein Vielfaches von 32 ist, wird es nicht zusammengeführt? Falsche Adressen? Ist das korrekt?