2016-12-02 96 views
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]。

回答

1

你的索引似乎是正確的假設圖像矩陣具有行主要排序:w會給你絕對X圖像中的座標(或列數)和h*numK+w相當於y * imageWidth + x這是在訪問細胞中常見的成語在CUDA中。只要確保你的整個圖像網格覆蓋(你只寫了512x4096,我假設4096是圖像寬度)。

作爲旁註,您應該每個線程訪問您的cufftComplex元素一次,而不是複製您的operator[]訪問代碼(也作爲重構點)。

+0

感謝您的回覆!你能詳細說明一下附註嗎? – Jason

+0

@Jason當然,我的意思是隻讀一次'cufftComplex',而不是兩次訪問'x'和'y'的同一位置。這可能會保證更好的內存合併並避免一些不必要的讀數(儘管編譯器可能會優化它)。 –

+0

嗯,這是有道理的。謝謝! – Jason