寻找优化此代码的方法

时间:2016-04-08 16:54:16

标签: c loops optimization

以下代码是边缘检测程序的一部分:

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;
    }
}

我一直在尝试使用以下代码实现阻止,但在这种情况下我不确定如何使用它。

2 个答案:

答案 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)

提供以下候选人

  1. if()的价格避免*。各种流水线平台将受益。
  2. 交换x,y订单
  3. 递减,因此循环测试结束时为0.
  4. 避免重新计算c[x][y]
  5. 假设需要浏览所有颜色。

    当然,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--;
         }
      }
    }