【发布时间】:2012-04-15 07:09:47
【问题描述】:
我正在 CUDA 中编写图像子采样器并使用线程来执行平均操作。但是,如果我在不调用内核的情况下执行此操作,与实际调用 CUDA 内核时相比,它的运行速度要快得多。现在的图像大小为 1280x1024 . 内核调用通常需要大量时间还是我的实现有问题?
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() ?
-
我在上面编辑了线程/块。我不确定如何摆脱“if”以及它是否会损害性能。(因为我测量了移除该部分并调用空内核的性能,并且几乎需要相同的时间)
-
好吧,我还运行了另一个简单的程序来添加 2 个数组,因此 CPU 版本的线程执行速度似乎比 GPU 版本快。
标签: cuda