2013-04-04 80 views
1

如果我啓動一個2D內核,其中每個線程都在2D數組的單個元素上運行,哪種訪問元素的方式是合併的?是數組[x] [y]還是數組[y] [x]?CUDA 2D內核合併內存

回答

7

如果x = threadIdx.xy = threadIdx.y然後

array[y][x] 

將被合併,但

array[x][y] 

沒有。原因是C使用row-major order,即最後一個索引是運行速度最快的索引,因此array[y][x]array[y][x+1]會轉到內存中的相鄰位置。並且CUDA塊內的線程被安排成使得threadIdx.x運行最快,然後y和最後z。

+0

對於非CUDA代碼,使用緩存一致性,只需添加這一點即可。http://supercomputingblog.com/optimization/taking-advantage-of-cache-coherence-in-your-programs/ – Seltymar 2013-04-10 04:18:22