Ограничить ключевое слово предоставляют значительные преимущества в gcc/g ++?

Изображение слишком большое. Многие устройства будут выбрасывать это исключение. Уменьшите размер изображения, изменив размер ресурса примерно до 1000x800.

46
задан Francesco Boi 4 December 2018 в 16:21
поделиться

4 ответа

Ключевое слово limit does a difference.

Я видел улучшения коэффициента 2 и более в некоторых ситуациях (обработка изображений). Однако в большинстве случаев разница не так велика. Около 10%.

Вот небольшой пример, иллюстрирующий разницу. В качестве теста я написал очень простое матричное преобразование 4x4 вектора *. Обратите внимание, что я вынужден заставить функцию не встраиваться. Иначе GCC обнаружит, что в моем бенчмаркере нет указателей на псевдонимы, и ограничение не даст разницы из-за встраивания.

Я мог бы перенести функцию преобразования и в другой файл.

#include <math.h>

#ifdef USE_RESTRICT
#else
#define __restrict
#endif


void transform (float * __restrict dest, float * __restrict src, 
                float * __restrict matrix, int n) __attribute__ ((noinline));

void transform (float * __restrict dest, float * __restrict src, 
                float * __restrict matrix, int n)
{
  int i;

  // simple transform loop.

  // written with aliasing in mind. dest, src and matrix 
  // are potentially aliasing, so the compiler is forced to reload
  // the values of matrix and src for each iteration.

  for (i=0; i<n; i++)
  {
    dest[0] = src[0] * matrix[0] + src[1] * matrix[1] + 
              src[2] * matrix[2] + src[3] * matrix[3];

    dest[1] = src[0] * matrix[4] + src[1] * matrix[5] + 
              src[2] * matrix[6] + src[3] * matrix[7];

    dest[2] = src[0] * matrix[8] + src[1] * matrix[9] + 
              src[2] * matrix[10] + src[3] * matrix[11];

    dest[3] = src[0] * matrix[12] + src[1] * matrix[13] + 
              src[2] * matrix[14] + src[3] * matrix[15];

    src  += 4;
    dest += 4;
  }
}

float srcdata[4*10000];
float dstdata[4*10000];

int main (int argc, char**args)
{
  int i,j;
  float matrix[16];

  // init all source-data, so we don't get NANs  
  for (i=0; i<16; i++)   matrix[i] = 1;
  for (i=0; i<4*10000; i++) srcdata[i] = i;

  // do a bunch of tests for benchmarking. 
  for (j=0; j<10000; j++)
    transform (dstdata, srcdata, matrix, 10000);
}

Результаты: (на моем 2 ГГц Core Duo)

nils@doofnase:~$ gcc -O3 test.c
nils@doofnase:~$ time ./a.out

real    0m2.517s
user    0m2.516s
sys     0m0.004s

nils@doofnase:~$ gcc -O3 -DUSE_RESTRICT test.c
nils@doofnase:~$ time ./a.out

real    0m2.034s
user    0m2.028s
sys     0m0.000s

Over the thumb 20% faster execution, на системе that.

Чтобы показать, насколько это зависит от архитектуры, я позволил одному и тому же коду запускаться на встроенном процессоре Cortex-A8 (немного скорректировал счетчик циклов, потому что не хочу так долго ждать):

root@beagleboard:~# gcc -O3 -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp test.c
root@beagleboard:~# time ./a.out

real    0m 7.64s
user    0m 7.62s
sys     0m 0.00s

root@beagleboard:~# gcc -O3 -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -DUSE_RESTRICT test.c 
root@beagleboard:~# time ./a.out

real    0m 7.00s
user    0m 6.98s
sys     0m 0.00s

Здесь разница всего 9% (тот же компилятор btw.)

.
46
ответ дан 26 November 2019 в 20:38
поделиться

Статья «Демистификация ключевого слова Restrict» относится к статье , почему псевдоним, заданный программистом, является плохой идеей (pdf), в котором говорится, что в общем случае это не помогает, и обеспечивает измерения для поддержки это вверх.

6
ответ дан unthought 26 November 2019 в 20:38
поделиться

Обратите внимание, что компиляторы C ++, которые допускают ключевое слово restrict, могут все еще игнорировать его. Это имеет место, например, здесь .

0
ответ дан Clifford 26 November 2019 в 20:38
поделиться

Я протестировал эту C-Program. Без ограничения это заняло 12.640 секунд, с ограничением 12.516. Похоже, что может сэкономить некоторое время.

.
-2
ответ дан 26 November 2019 в 20:38
поделиться