我正在CUDA中編寫一個圖像子採樣器,並使用這些線程來執行平均操作。但是,如果我在不調用內核的情況下執行此操作,與實際調用CUDA內核相比,運行速度要快得多。圖像大小現在爲1280x1024。 內核調用是否需要大量時間,或者我的實現有問題嗎?CUDA版本比CPU版本慢嗎?
P.S我試着只調用內核(代碼被移除),它與內核的代碼幾乎是同一時間。另外我的內核調用代碼運行大約350毫秒,而內核調用運行時間接近1000毫秒。
__global__ void subsampler(int *r_d,int *g_d,int *b_d, int height,int width,int *f_r,int*f_g,int*f_b){
int id=blockIdx.x * blockDim.x*blockDim.y+ threadIdx.y*blockDim.x+threadIdx.x+blockIdx.y*gridDim.x*blockDim.x*blockDim.y;
if (id<height*width/4){
f_r[id]=(r_d[4*id]+r_d[4*id+1]+r_d[4*id+2]+r_d[4*id+3])/4;
f_g[id]=(g_d[4*id]+g_d[4*id+1]+g_d[4*id+2]+g_d[4*id+3])/4;
f_b[id]=(b_d[4*id]+b_d[4*id+1]+b_d[4*id+2]+b_d[4*id+3])/4;
}
}
我定義blockSizeX和blockSizeY爲1和1(我試圖使它們4,16),但不知何故,這是最快的
dim3 blockSize(blocksizeX,blocksizeY);
int new_width=img_width/2;
int new_height=img_height/2;
int n_blocks_x=new_width/blocksizeX+(new_width/blocksizeY == 0 ?0:1);
int n_blocks_y=new_height/blocksizeX+(new_height/blocksizeY == 0 ?0:1);
dim3 gridSize(n_blocks_x,n_blocks_y);
,然後我打電話跟gridSize,BLOCKSIZE內核。
線程數/塊數?你爲什麼不指定線程的數量,這樣你可以擺脫if()? – 2011-02-05 21:44:02
我編輯上面的線程/塊。我不知道我該如何擺脫'如果',如果它傷害了性能(因爲我測量性能刪除那塊,並調用空內核,它幾乎需要相同的時間) – Manish 2011-02-06 00:14:02