gpt4 book ai didi

c - 使用依赖循环展开循环

转载 作者:行者123 更新时间:2023-11-30 17:50:45 25 4
gpt4 key购买 nike

我正在开发一个大型应用程序,我需要对某个过程的后续依赖循环执行循环展开。我在下面编写了一小段示例代码来复制较大的版本。

考虑原始代码:

void main()
{

int a[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int b[20] = {10,9,8,7,6,5,4,3,2,1,20,19,18,17,16,15,14,13,12,11};
int i,j,k,l;
int nab =4, vab =10;
int dimi, dimj, dimij, dimk, diml, dimkl, dimijkl;
int count = 0;

for (i = nab+1; i< nab+vab; i++)
{
dimi = a[i];
for (j = i; j< nab+vab; j++)
{
dimj = b[j];
dimij = dimi*dimj;
count = count +1;

for (k = nab+1; k< nab+vab; k++)
{
dimk = a[k-1];
for (l =k; l< nab+vab; l++)
{
diml = a[l-1];
dimkl = dimk*diml;
dimijkl = dimij * dimkl;
}
}
}
}
printf ("Final dimension:%d \n ", dimijkl);
printf ("Count:%d \n ", count);
}

现在我将循环 i 展开 2 倍:

for (i = nab+1; i< nab+vab; i+=2)
{
dimi = a[i];
for (j = i; j< nab+vab; j++)
{
dimj = b[j];
dimij = dimi*dimj;
count = count +1;

for (k = nab+1; k< nab+vab; k++)
{
dimk = a[k-1];
for (l =k; l< nab+vab; l++)
{
diml = a[l-1];
dimkl = dimk*diml;
dimijkl = dimij * dimkl;
}
}
}

dimi = a[i+1];
for (j = i+1; j< nab+vab; j++)
{
dimj = b[j];
dimij = dimi*dimj;
count = count +1;

for (k = nab+1; k< nab+vab; k++)
{
dimk = a[k-1];
for (l =k; l< nab+vab; l++)
{
diml = a[l-1];
dimkl = dimk*diml;
dimijkl = dimij * dimkl;
}
}
}
}
printf ("Final dimension:%d \n ", dimijkl);
printf ("Count:%d \n ", count);

现在我希望将循环 ij 展开 2 倍,但由于循环 j 取决于循环 ,我有点不确定应该如何编写它。如何重写代码以将 ij 展开 2 倍。此外,当我增加展开因子时,代码将变得越来越笨拙。有没有一种聪明的方法来手动展开它,而不会让代码变得太难看。

在这种特殊情况下,我无法使用编译器标志(例如:-funroll-loops)。我想通过手动循环展开来接近它。

感谢您的宝贵时间。

最佳答案

也许不是最优雅的解决方案,但您可以使用宏:

#define INNER_L_LOOP(l) \
{ \
diml = a[l-1]; \
dimkl = dimk*diml; \
dimijkl = dimij * dimkl; \
}

#define INNER_K_LOOP(k) \
{ \
dimk = a[k-1]; \
for (l =k; l< nab+vab; l++) \
{ \
INNER_L_LOOP(l) \
} \
}

#define INNER_J_LOOP(j) \
{ \
dimj = b[j]; \
dimij = dimi*dimj; \
count = count +1; \
\
for (k = nab+1; k< nab+vab; k += 2) \
{ \
INNER_K_LOOP(k) \
if (k+1 < nab+vab) \
INNER_K_LOOP(k+1) \
} \
}

#define INNER_I_LOOP(i) \
{ \
dimi = a[i]; \
for (j = i; j< nab+vab; j+= 2) \
{ \
INNER_J_LOOP(j) \
if (j+1 < nab+vab) \
INNER_J_LOOP(j+1) \
} \
}

for (i = nab+1; i< nab+vab; i+=2)
{
INNER_I_LOOP(i)
INNER_I_LOOP(i+1)
}

在这里,我将 i、j 和 k 循环分别展开了 2 倍,您会注意到最内层循环的代码不必重复 8 次(这正是您想要的)如果我理解正确的话,请避免)。

您还会注意到,对于 j 和 k 循环,我正在检查索引是否超出数组边界。此检查对性能有轻微影响,我将其留给您进行优化。 ;)

关于c - 使用依赖循环展开循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com