0
我目前正在處理作爲二進制文件讀入的圖像(二維數組),並且應該是CUDA的512x4096。我的問題是如何處理特定的索引(關於塊和線程),當一切都真正存儲爲一維數組時。作爲一個例子,我試圖創建一個函數,讓每一個細節都向右移動。我的代碼是如何使用塊和螺紋尺寸來處理2D圖像
//CircShift, without scaling
__global__ void circShift(cufftComplex* input, cufftComplex* output, int numK, int numA) {
int w = blockDim.x * blockIdx.x + threadIdx.x;
int h = blockDim.y * blockIdx.y + threadIdx.y;
if ((h < numA) && (w < numK)) {
int idx = h * numK + w;
if (w+1<numK) {
output[h*numK+w+1].x = input[idx].x;
output[h*numK+w+1].y = input[idx].y;
} else {
output[h*numK].x = input[idx].x;
output[h*numK].y = input[idx].y;
}
}
}
我目前的blockdim是(256,64),我的threaddim是(16,8)。
我想知道如果這是正確的方式來實現這樣的索引方面的東西。我的w等於列#,我的h等於行號。讓我們說我正在使用類似python的東西,並將圖像加載爲二維數組M.在CUDA中通過h * numK + w進行索引以嘗試訪問M [h] [w]。
感謝您的回覆!你能詳細說明一下附註嗎? – Jason
@Jason當然,我的意思是隻讀一次'cufftComplex',而不是兩次訪問'x'和'y'的同一位置。這可能會保證更好的內存合併並避免一些不必要的讀數(儘管編譯器可能會優化它)。 –
嗯,這是有道理的。謝謝! – Jason