Когда я скомпилировал свое приложение, производительность оказалась хуже, чем я ожидал, и я понял, что компилятор выдает предупреждение, подобное приведенному ниже.
примечание # 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;
}
Я создал версию вашего кода, которая на самом деле компилируется:
могло произойти переполнение в математике, но я не проверял это
затем запустил его.
Это бежало в «мгновение ока»
Вот код:
#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;
}