以下代码是边缘检测程序的一部分:
void detect_optimized(int width, int height, int threshold)
{
int x, y;
int tmp;`
int w = width--;
int h = height--;
for (y = 1; y < w; y++)
for (x = 1; x < h; x++)
{
tmp = mask_product(mask,a,x,y,0);
if (tmp>255)
tmp = 255;
if (tmp<threshold)
tmp = 0;
c[x][y][0] = 255-tmp;
tmp = mask_product(mask,a,x,y,1);
if (tmp>255)
tmp = 255;
if (tmp<threshold)
tmp = 0;
c[x][y][1] = 255-tmp;
tmp = mask_product(mask,a,x,y,2);
if (tmp>255)
tmp = 255;
if (tmp<threshold)
tmp = 0;
c[x][y][2] = 255-tmp;
}
}
我一直在尝试使用以下代码实现阻止,但在这种情况下我不确定如何使用它。
答案 0 :(得分:2)
您可以交换循环以获得更好的缓存利用率。这应该会显着加快代码速度(特别是对于大数据)。
for (x = 1; x < h; x++)
for (y = 1; y < w; y++)
通过在多个线程上分布循环迭代来利用多核架构,可以实现另一个实质性好处。使用OpenMP
可以使用单个编译器指令达到此目的。
#pragma omp parallel for private(y, tmp)
for (x = 1; x < h; x++)
for (y = 1; y < w; y++)
其他优化通常由编译器完成。确保使用-O2
之类的适当编译器标志,并且不要自己进行低级别调整。
答案 1 :(得分:1)
提供以下候选人
if()
的价格避免*
。各种流水线平台将受益。 x,y
订单c[x][y]
假设需要浏览所有颜色。
当然,YMMV。
for (x = h-1; x > 0; x--) {
byte *p = &c[x][w-1][NUM_COLORS-1];
for (y = w-1; y > 0; y--) {
for (int z = NUM_COLORS-1; z >= 0; z--) {
int tmp = mask_product(mask,a,x,y,z);
*p = (255 - tmp*(tmp>=threshold))*(tmp <=255);
p--;
}
}
}