【发布时间】:2017-11-12 04:04:10
【问题描述】:
以下代码用于对图像进行卷积。所述图像的每个像素由以下表示:
typedef struct {
unsigned short red; /* R value */
unsigned short green; /* G value */
unsigned short blue; /* B value */
} pixel;
可以看出,RGB 值具有 16 位表示(“16 位颜色”)。图像 I 存储为一维像素数组,其中第 (i, j) 个像素为 I[RIDX(i,j,n)]。这里 n 是图像矩阵的维数,并且 RIDX是一个宏定义如下
#define RIDX(i,j,n) ((i)*(n)+(j))
在大多数情况下,您可以将 I[RIDX(i,j,n)] 视为等效于 I[i][j]。最后,我需要使用代码移动、循环展开和阻塞等技术优化以下代码。
char naive_convolve_descr[] = "naive_convolve: Naive baseline implementation";
void naive_convolve(int dim, pixel *src, pixel *dst)
{
int i, j, ii, jj, curI, curJ;
pixel_sum ps;
for (j = 0; j < dim; j++){
for (i = 0; i < dim; i++){
ps.red = 0.0;
ps.green = 0.0;
ps.blue = 0.0;
ps.weight = 0.0;
for (jj = -2; jj <= 2; jj++){
for (ii = -2; ii <= 2; ii++){
curJ = j+jj;
if(curJ<0 || curJ>=dim){
continue;
}
curI = i+ii;
if(curI<0 || curI>=dim){
continue;
}
ps.red += src[RIDX(curI, curJ, dim)].red * kernel[ii+2][jj+2];
ps.green += src[RIDX(curI, curJ, dim)].green * kernel[ii+2][jj+2];
ps.blue += src[RIDX(curI, curJ, dim)].blue * kernel[ii+2][jj+2];
ps.weight += kernel[ii+2][jj+2];
}
}
dst[RIDX(i,j,dim)].red = (unsigned short)(ps.red/ps.weight);
dst[RIDX(i,j,dim)].green = (unsigned short)(ps.green/ps.weight);
dst[RIDX(i,j,dim)].blue = (unsigned short)(ps.blue/ps.weight);
}
}
}
我的内核是
//emboss top-right kernel
Kernel emboss_tr_kernel =
{
{0.0, -1.0, -1.0, -1.0, -1.0},
{1.0, 0.0, -4.0, -16.0, -1.0},
{1.0, 4.0, 1.0, -4.0, -1.0},
{1.0, 16.0, 4.0, 0.0, -1.0},
{1.0, 1.0, 1.0, 1.0, 0.0}
};
【问题讨论】:
标签: c optimization convolution