I've been trying to optimize this piece of code:void detect_optimized(int width, int height, int threshold){  int x, y, z;  int tmp;  for (y = 1; y < width-1; y++)    for (x = 1; x < height-1; x++)      for (z = 0; z < 3; z++)      {    tmp = mask_product(mask,a,x,y,z);    if (tmp>255)          tmp = 255;        if (tmp<threshold)          tmp = 0;        c[x][y][z] = 255-tmp;      }  return;}So far I've tried Blocking and a few other things, but I can't seem to get it to run any faster.Blocking resulted in:   for(yy = 1; yy<height-1; yy+=4){    for(xx = 1; xx<width -1; xx+=4){        for (y = yy; y < 4+yy; y++){            for (x = xx; x < 4+xx; x++){                for (z = 0; z < 3; z++)                      {                         tmp = mask_product(mask,a,x,y,z);                         if (tmp>255)                          tmp = 255;                         if (tmp<threshold)                          tmp = 0;                         c[x][y][z] = 255-tmp;                      }}}}}Which ran at the same speed as the original program.Any suggestions would be great.mask_function cannot be changed, but here is its code:int mask_product(int m[3][3], byte bitmap[MAX_ROW][MAX_COL][NUM_COLORS], int x, int y, int z){  int tmp[9];  int i, sum;// ADDED THIS LINE (sum = 0) TO FIX THE BUG  sum = 0;  tmp[0] = m[0][0]*bitmap[x-1][y-1][z];  tmp[1] = m[1][0]*bitmap[x][y-1][z];  tmp[2] = m[2][0]*bitmap[x+1][y-1][z];  tmp[3] = m[0][1]*bitmap[x-1][y][z];  tmp[4] = m[1][1]*bitmap[x][y][z];  tmp[5] = m[2][1]*bitmap[x+1][y][z];  tmp[6] = m[0][2]*bitmap[x-1][y+1][z];  tmp[7] = m[1][2]*bitmap[x][y+1][z];  tmp[8] = m[2][2]*bitmap[x+1][y+1][z];  for (i=0; i<9; i++)    sum = sum + tmp[i];  return sum;}
Detect optimized
optimization;c;image
Do not expect much:void detect_optimized(int width, int height, int threshold){  int x, y, z;  int tmp;  int widthM1= width-1;  int heightM1=height-1;  for (y = 1; y < widthM1; y++){    for (x = 1; x < heightM1; x++){      for (z = 0; z < 3; z++){        tmp = mask_product(mask,a,x,y,z);        if (tmp>255)          c[x][y][z] = 0;        else if (tmp<threshold)          c[x][y][z] = 255;        else          c[x][y][z] = 255 ^ tmp;  // in this case xor is the same as -      }    }   }  return;}You can also unroll the z- loop, by copying the inner body 2 more times.If you can manage to change the mask_function:int mask_product(int m[3][3], byte bitmap[MAX_ROW][MAX_COL][NUM_COLORS], int x, int y, int z){  int xp1=x+1;  int xm1=x-1;  int yp1=y+1;  int ym1=y-1;  return  m[0][0]*bitmap[xm1][ym1][z];    + m[1][0]*bitmap[x][ym1][z];    + m[2][0]*bitmap[xp1][ym1][z];    + m[0][1]*bitmap[xm1][y][z];    + m[1][1]*bitmap[x][y][z];    + m[2][1]*bitmap[xp1][y][z];    + m[0][2]*bitmap[xm1][yp1][z];    + m[1][2]*bitmap[x][yp1][z];    + m[2][2]*bitmap[xp1][yp1][z]; }Also have a look if you can make your compiler inline the mask_product method.