The following code is taken from https://software.intel.com/en-us/code-samples/intel-c-compiler/application-domains/finance/averaging-filter
here is the serial code which is not hard to explain
Linear Version of the code
for(int i = 1; i < (h+1); i++) { int x = ((resized_width * i) + 1); for(int j = x; j < (x + w); j++) { unsigned int red = 0, green = 0, blue = 0; for(int k1 = (-1); k1 <= 1; k1++) { int pos = j + (k1 * resized_width); for(int k2 = (-1); k2 <= 1; k2++) { red += resized_indataset[(pos + k2)].red; green += resized_indataset[(pos + k2)].green; blue += resized_indataset[(pos + k2)].blue; } } resized_outdataset[j].red = red/9; resized_outdataset[j].green = green/9; resized_outdataset[j].blue = blue/9; } }
Array Notation
for(int i = 1; i < (h+1); i++) { int x = ((resized_width * i) + 1); for(int j = x; j < (x + w); j+=8) { int row2index = 3*j - 3; int jump = (resized_width * 3); int row1index = row2index - jump; int row3index = row2index + jump; out[(row2index + 3):24] = (in[row1index:24] + in[row1index+3:24] + in[row1index+6:24] + in[row2index:24] + in[row2index+3:24] + in[row2index+6:24] + in[row3index:24] + in[row2index+3:24] + in[row2index+6:24])/9; } }
I'm trying to understand the code but I do not understand that basics assumption here.
In the following code
for(int j = x; j < (x + w); j+=8) { int row2index = 3*j - 3; int jump = (resized_width * 3); int row1index = row2index - jump; int row3index = row2index + jump; out[(row2index + 3):24] = (in[row1index:24] + in[row1index+3:24] + in[row1index+6:24] + in[row2index:24] + in[row2index+3:24] + in[row2index+6:24] + in[row3index:24] + in[row3index+3:24] + in[row3index+6:24])/9; }
a.how do you decide that j needs to jump to j+=8 ? why 8?
b.why does jump = (resized_width * 3)?
c.why do we have index +0, index+3 ,index +6 ??