我正在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