1
如果我啓動一個2D內核,其中每個線程都在2D數組的單個元素上運行,哪種訪問元素的方式是合併的?是數組[x] [y]還是數組[y] [x]?CUDA 2D內核合併內存
如果我啓動一個2D內核,其中每個線程都在2D數組的單個元素上運行,哪種訪問元素的方式是合併的?是數組[x] [y]還是數組[y] [x]?CUDA 2D內核合併內存
如果x = threadIdx.x
和y = threadIdx.y
然後
array[y][x]
將被合併,但
array[x][y]
沒有。原因是C使用row-major order,即最後一個索引是運行速度最快的索引,因此array[y][x]
和array[y][x+1]
會轉到內存中的相鄰位置。並且CUDA塊內的線程被安排成使得threadIdx.x
運行最快,然後y和最後z。
對於非CUDA代碼,使用緩存一致性,只需添加這一點即可。http://supercomputingblog.com/optimization/taking-advantage-of-cache-coherence-in-your-programs/ – Seltymar 2013-04-10 04:18:22