我正在使用CUDA對圖像進行線性過濾。我使用2D線程塊和2D網格來使問題變得自然。下面是我的索引:(高度和寬度是圖像尺寸)CUDA內核中的2D圖像索引問題
dim3 BlockDim(16,16);
dim3 GridDim;
GridDim.x = (width + 15)/16;
GridDim.y = (height + 15)/16;
在內核我訪問的地點如下:
unsigned int xIndex = blockIdx.x*16+ threadIdx.x;
unsigned int yIndex = blockIdx.y*16+ threadIdx.y;
unsigned int tid = yIndex * width + xIndex;
而且我想返回四至界線(I」稍後會迎合他們)。我這樣做:
if(yIndex>=height-N || xIndex>=width-N || yIndex<N || xIndex<N)
return;
其中N是每個邊界的像素數目,我不想計算。
問題:
的代碼運行在所有標準圖像尺寸細。但對於一些隨機圖像尺寸,它顯示對角線。例如,在我的情況下,500x333圖像(即使沒有尺寸是16的倍數)顯示正確的輸出,而450x365顯示輸出中的對角線。該問題仍然存在,即使我只返回電網,並沒有其他的額外的線程是這樣的:
if(yIndex>=height || xIndex>=width)
return;
代碼保持不變,一些投入運行良好,而有的則沒有。任何人都可以發現錯誤嗎?我在這裏附上了輸入和輸出示例:IMAGES謝謝!
更新:
內核代碼(簡體返回輸入圖像,但給出了同樣的問題)
__global__ void filter_8u_c1_kernel(unsigned char* in, unsigned char* out, int width, int height, float* filter, int fSize)
{
unsigned int xIndex = blockIdx.x*BLOCK_SIZE + threadIdx.x;
unsigned int yIndex = blockIdx.y*BLOCK_SIZE + threadIdx.y;
unsigned int tid = yIndex * width + xIndex;
unsigned int N = filterSize/2;
if(yIndex>=height-N || xIndex>=width-N || yIndex<N || xIndex<N)
return;
/*Filter code removed, still gives the same problem*/
out[tid] = in[tid];
}
更新2:
我也刪除回報聲明通過逆轉如果條件。但問題依然存在。
if(yIndex<=height-N && xIndex<=width-N && yIndex>N && xIndex>N){
/*Kernel Code*/
}
沒有看到代碼,它將很難回答,但我會非常懷疑在內核中使用return語句。如果代碼中存在內存或指令同步障礙,則很可能是導致問題的返回語句本身。 – talonmies
我在更新中添加了代碼。這跟我之前提到的幾乎一樣。 – jwdmsd
您可以將您正在使用的內核參數和啓動參數添加到失敗的案例中嗎? 'filterSize'現在還未定義,它應該是'fSize'嗎? – talonmies