2013-07-19 32 views
0

我正在編寫一個程序將rgba圖像轉換爲灰度。我在這方面做了很多工作,並正確地實現了內核。然而,網格大小可能是錯誤的,即使它的邏​​輯是正確的。CUDA:無法計算網格大小

內核:

__global__ 
void rgba_to_greyscale(const uchar4* const rgbaImage, 
        unsigned char* const greyImage, 
        int numRows, int numCols) 
{ 
    int x = (blockIdx.x * blockDim.x) + threadIdx.x; 
    int y = (blockIdx.y * blockDim.y) + threadIdx.y; 

    if(x >= numCols || y >= numRows) 
     return; 

    uchar4 rgba = rgbaImage[x+y]; 
    float channelSum = 0.299f*rgba.x + 0.587f*rgba.y + 0.114f*rgba.z; 

    greyImage[x+y] = channelSum; 
} 

和內核啓動:

const dim3 blockSize(10, 10, 1); //TODO 
    size_t gridSizeX, gridSizeY; 
    gridSizeX = numCols + (10 - (numCols % 10)); //adding some number to make it multiple of 10 
    gridSizeY = numRows + (10 - (numRows % 10)); //adding some number to make it multiple of 10 

    const dim3 gridSize(gridSizeX, gridSizeY, 1); //TODO 
    rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols); 

我創建多個線程則需要數,然後應用在內核綁定檢查。

+2

這是一個廣泛使用的邏輯,用於創建更多數量的線程並在內核中執行綁定檢查。這是計算網格大小的通用公式。 'gridSizeX =(numCols + blockSize.x - 1)/blockSize.x;' – sgarizvi

+0

[this]的可能重複(http://stackoverflow.com/questions/14711668/colored-image-to-greyscale-image-using- cuda並行處理)。我認爲它的標準問題來自udacity當然.. –

+0

@SagarMasuti;我也讀過這篇文章,但是我無法弄清楚我的代碼中出現了什麼問題。如果您可以將錯誤指向我的(邏輯上正確的)代碼,這將會很有幫助。 –

回答

4

您正在訪問您的圖片使用x+y。但想想這個,你能以這種方式獲得的最大圖像尺寸是numRows+numCols。你不能只添加這兩個座標,因爲那意味着例如(1,2)(3,0)是一樣的圖像元素,它是普通的垃圾。相反,對於每個y座標,您必須跳過整行圖像,因此它應該是rgbaImage[x+y*numCols](當然,greyImage也是如此)。但請注意,根據圖像數據的佈局,它可能也是其他方式(x*numRows+y),但我在此假設通常的圖像佈局(並且在您的內核中它無所謂,因爲所有像素都是平等對待)。

+0

謝謝你。也許我被存儲在一維數組中的圖像弄糊塗了。它就像計算二維數組中單元的內存地址一樣。我確定調試器和本地CUDA環境的可用性可能有所幫助。順便說一句,你知道Windows中的CUDA emalation環境,或者可以指向gpuocelot for Windows的一些文檔嗎? –

+0

@HarshilSharma不,對不起。 –