Мертвое кодирование в C - PullRequest
       31

Мертвое кодирование в C

0 голосов
/ 24 декабря 2018

Я анализирую следующий код с различными опциями компилятора (O0 O1 O2 O3 Os).Первая из итераций выходит из цикла «прогрев кеша».С O0 и O1 время эжекций отличается от 0,00 и выше, поскольку входные параметры (N и ITER) больше.

Проблема возникает, когда я использую опции O2, O3 и Os.Время выведения 0,000.Я прочитал и, возможно, это обнаружение мертвого кода.Является ли это возможным?И почему это происходит?

  for(i=0; i<N; i++){
    a = i * 128;
    b = a / 32;
  }

  gettimeofday(&inicio, NULL);

  for(j=0; j<ITER; j++)
   for(i=0; i<N; i++){
     a = i * 128;
     b = a / 32;
   }

  gettimeofday(&final, NULL);

  tiempo = (final.tv_sec-inicio.tv_sec + (final.tv_usec-inicio.tv_usec)/1.e6);
  fprintf(fp,"%lf\n",tiempo);
  printf("%lf\t",tiempo);

  for(i=0; i<N; i++){
     a = i << 7;
     b = a >> 5;
   }

  gettimeofday(&inicio, NULL);

  for(j=0; j<ITER; j++)
   for(i=0; i<N; i++){
     a = i << 7;
     b = a >> 5;
   }

Может ли кто-нибудь мне помочь?Спасибо

1 Ответ

0 голосов
/ 24 декабря 2018

Поскольку переменные, участвующие в вычислениях, не доступны вне цикла, меня не удивит, что компилятор полностью удаляет код.

Два простых способа проверки:

  1. Объявите a и b как volatile.
  2. Посмотрите на полученную сборку с разных уровней оптимизации.
...