Я работаю над большим приложением, для которого мне нужно выполнить развертывание цикла для последующих зависимых циклов для определенной процедуры. Я написал ниже небольшой образец кода, чтобы воспроизвести большую версию.
Рассмотрим исходный код:
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);
Теперь я хочу развернуть цикл i
и j
в 2 раза, но поскольку цикл j
зависит от цикла i
, я немного не уверен, как мне подойти к его написанию. Как я могу переписать код, чтобы развернуть как i
, так и j
с коэффициентом 2. Кроме того, код будет становиться все более неуклюжим по мере увеличения коэффициента развертывания. Есть ли умный способ развернуть его вручную, чтобы код не стал слишком уродливым.
Я не могу использовать флаги компилятора (пример: -funroll-loops) в этом конкретном случае. Я хочу приблизиться к этому путем ручного развертывания цикла.
Спасибо за уделенное время.