Эффект Unroll и Jam на большом цикле

Когда я скомпилировал свое приложение, производительность оказалась хуже, чем я ожидал, и я понял, что компилятор выдает предупреждение, подобное приведенному ниже.

примечание # 25461: Несовершенный цикл развернутого заклинивания на 2 (перед вектором)

И это мой короткий код.

for(i=0; i<num; i++){
values[i] = func(a, b, c);
}

Индексная переменная, num, всегда 1024. Почему цикл unroll-jammmed несовершенно? Кроме того, когда я изменяю код, как показано ниже, закручивание не происходит! Каково условие возникновения закручивания-заклинивания?

for(i=0; i<num; i++){
value += func(a, b, c);
}

На самом деле, код является частью большого файла, поэтому я не могу написать весь код здесь. Но ниже приведен код, включающий func ().

int values[num];

int func(int a, int b, int c)
{
int i=0;
int total=0;
for(i=0; i<num; i++){
total = a*b+c;
}
return total;
}

int main(void){
int i=0;
int min=0;
for(i=0; i<num; i++){
values[i] = func(a, b, c);
}

for(i=0; i<num; i++){
value = values[i];
}
printf("value: %d\n", value);
return 0;
}

0

Решение

Я создал версию вашего кода, которая на самом деле компилируется:

могло произойти переполнение в математике, но я не проверял это

затем запустил его.

Это бежало в «мгновение ока»

Вот код:

#include <stdio.h>

#define num (1024)

int values[num];
int value;
int a=2;
int b=3;
int c=4;

int func(int a, int b, int c)
{
int i=0;
int total=0;
for(i=0; i<num; i++){
total = a*b+c;
}
return total;
}

int main(void){
int i=0;
//int min=0;
for(i=0; i<num; i++){
values[i] = func(a, b, c);
}

for(i=0; i<num; i++){
value = values[i];
}
printf("value: %d\n", value);
return 0;
}
0

Другие решения


По вопросам рекламы [email protected]