GCC выводит пустой файл сборки - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь оптимизировать программу на Си. Я хочу, чтобы GCC автоматически векторизовал, если это возможно. Чтобы проверить, что происходит, я генерирую файл сборки программы с опцией «-S», но всякий раз, когда уровень оптимизации превышает 0, GCC выводит почти пустой файл .s. Я использую GCC-7, но я пытался с более старыми версиями, и он делает то же самое.

код C:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define HEIGHT 2000
#define WIDTH 1000

static unsigned int idx(unsigned int x, unsigned int y, unsigned int stride){
  return y * stride + x;
}

static void integral_image(const unsigned char * restrict in, unsigned int * restrict out){
  unsigned int row_sum = 0;
  unsigned char *newin = __builtin_assume_aligned(in, 16);
  unsigned char *newout = __builtin_assume_aligned(out, 16);

  for(unsigned int x = 0; x < WIDTH; ++x){
    row_sum += newin[x];
    newout[x] = row_sum;
  }

  for(unsigned int y = 1; y < HEIGHT; ++y){
    row_sum = 0;

    for(unsigned w = 0; w < WIDTH; w += 4){
      const unsigned int i1 = idx(w, y, WIDTH);
      const unsigned int old1 = idx(w, y - 1, WIDTH);
      const unsigned int i2 = idx(w + 1, y, WIDTH);
      const unsigned int old2 = idx(w, y - 1, WIDTH);
      const unsigned int i3 = idx(w + 2, y, WIDTH);
      const unsigned int old3 = idx(w + 2, y - 1, WIDTH);
      const unsigned int i4 = idx(w + 3, y, WIDTH);
      const unsigned int old4 = idx(w + 3, y - 1, WIDTH);

      row_sum += newin[i1];
      newout[i1] = row_sum + newout[old1];

      row_sum += newin[i2];
      newout[i2] = row_sum + newout[old2];

      row_sum += newin[i3];
      newout[i3] = row_sum + newout[old3];

      row_sum += newin[i4];
      newout[i4] = row_sum + newout[old4];
    }
  }
}

Теперь GCC сгенерировал .s файл:

.file   "thrash.c"
.ident  "GCC: (Ubuntu 7.1.0-10ubuntu1~16.04.york0) 7.1.0"
.section    .note.GNU-stack,"",@progbits

Спасибо!

1 Ответ

0 голосов
/ 09 мая 2018

Обе ваши функции объявлены static, что означает, что ни одна из них не видна другим модулям компиляции (то есть другим .o файлам) во время компоновки.

Когда вы включаете оптимизацию, GCC замечает, что, поскольку функции не видны извне и не вызываются из какой-либо внешне видимой функции, их присутствие не имеет смысла, и поэтому он полностью их исключает, чтобы сэкономить пространство.

Чтобы исправить это, удалите ключевое слово static из сигнатур вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...