我提供了一个通过灰度图像并应用 sobel 过滤器的代码:(Sobel 是一个类似于你的邻居(A,B,C,D)函数的过滤器)
#define QUANTUM_TYPE short
__global__ void sobel_gpu(QUANTUM_TYPE *img_out, QUANTUM_TYPE *img_in, int WIDTH, int HEIGHT){
int x,y;
x=blockDim.x*blockIdx.x+threadIdx.x;
y=blockDim.y*blockIdx.y+threadIdx.y;
QUANTUM_TYPE LUp,LCnt,LDw,RUp,RCnt,RDw;
int pixel;
if(x<WIDTH && y<HEIGHT){
LUp = (x-1>=0 && y-1>=0)? img_in[(x-1)+(y-1)*WIDTH]:0;
LCnt= (x-1>=0)? img_in[(x-1)+y*WIDTH]:0;
LDw = (x-1>=0 && y+1<HEIGHT)? img_in[(x-1)+(y+1)*WIDTH]:0;
RUp = (x+1<WIDTH && y-1>=0)? img_in[(x+1)+(y-1)*WIDTH]:0;
RCnt= (x+1<WIDTH)? img_in[(x+1)+y*WIDTH]:0;
RDw = (x+1<WIDTH && y+1<HEIGHT)? img_in[(x+1)+(y+1)*WIDTH]:0;
pixel = -1*LUp + 1*RUp +
-2*LCnt + 2*RCnt +
-1*LDw + 1*RDw;
pixel=(pixel<0)?0:pixel;
pixel=(pixel>MAXRGB)?MAXRGB:pixel;
img_out[x+y*WIDTH]=pixel;
}
}
该代码适用于全局内存并安全地处理边界。我的完整代码读取 BMP 图像并对其应用过滤器并将生成的 BMP 存储回磁盘。它可在此处获得(集成了 CPU 和 GPU 实现,适用于 Linux 和 Windows)。
您可以通过一些工作将其转换为共享内存样式。首先,您应该决定给每个块分配多少任务。然后将任务分解为多个共享内存接收器/排水管。CUDA SDK 中的矩阵乘法示例为您提供了一个完美的想法。