我正在尝试使用4向循环展开来优化此c代码

I'm*_*too 2 c

我正在尝试做的是使用这个C代码并使用一种称为循环展开的技术对其进行优化,但在这种情况下,我想使用四向循环展开.现在,我理解了这项技术,并且我理解了我不知道如何将其应用于此代码的概念.我是否需要添加一些额外的变量?在每个循环之后或者只是在所有循环结束时,我是否必须有一些代码?此代码是8x8块代码,用于处理像素并逆时针旋转90度.任何帮助将不胜感激.谢谢.

/* 
 * rotate8 - rotate with 8x8 blocking
 */

char rotate8_descr[] = "rotate8: rotate with 8x8 blocking";

void rotate8(int dim, pixel *src, pixel *dst) 
{

int i, j, ii, jj;

for(ii = 0; ii < dim; ii += 8)
       for(jj = 0; jj < dim; jj += 8)
              for (i = ii; i < ii + 8; i++)   
                  for (j = jj; j < jj + 8; j++)
                      dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
}
Run Code Online (Sandbox Code Playgroud)

djn*_*jna 5

您可以使用8行显式代码替换内部循环

          dst[RIDX(dim-1-jj, i, dim)] = src[RIDX(i, jj, dim)];
          dst[RIDX(dim-1-(jj+1), i, dim)] = src[RIDX(i, (jj+1), dim)];
          ...
          dst[RIDX(dim-1-(jj+7), i, dim)] = src[RIDX(i, (jj+7), dim)];
Run Code Online (Sandbox Code Playgroud)

所以你要通过为每个值显式写一行代替循环变量.

现在你可以重复下一个循环的8个值,​​你将有8 x 8行代码,依此类推.

除了理解练习之外,这对我来说似乎毫无意义,编译器非常有效地完成这些工作,他们会在合理的地方进行优化.手动滚动很少产生最佳代码.