Как __promise в ARM-компиляторе повышает эффективность - PullRequest
0 голосов
/ 04 мая 2018

Я прочитал здесь (стр. 14), что одним из способов повышения эффективности кода для ARM-устройств было бы использование определенных ключевых слов ARM_compiler, таких как __promise, и приведен следующий пример кода:

void f(int *x, int n)
{
  int i;
  __promise((n > 0) && ((n & 7) == 0));   /* My Question: How this line improves efficiency */ 

  for(i = 0; i < n; i++)
  {
    x[i]++;
  }
}

Но я не понимаю, как эта дополнительная информация (индекс цикла положительный и делится на 8) повышает эффективность!

Может кто-нибудь объяснить, как?

1 Ответ

0 голосов
/ 04 мая 2018
__promise((n > 0) && ((n & 7) == 0));

Двоичное представление 7 равно 0b111. Это говорит о том, что последние 3 бита n всегда будут равны нулю. Следовательно, n должно быть кратно 8. Furtermore n также будет больше, чем 0.

Таким образом, вы обещаете компилятору, что он может безопасно развернуть ваш цикл в блоки 8 и выполнить хотя бы одну итерацию.

Компилятор может , поэтому решите переписать ваш код как:

int i = 0;
do
  {
    x[i+0]++;
    x[i+1]++;
    x[i+2]++;
    x[i+3]++;
    x[i+4]++;
    x[i+5]++;
    x[i+6]++;
    x[i+7]++;
  } while ((i+=8) != n);

Что пропустит кучу сравнений.

NEONs VADD инструкция даже позволит вам оптимизировать это еще дальше: vaddq_s32 позволит вам добавить вектор (1,1,1,1) в группы из четырех элементов вашего массива одновременно. Таким образом, ваш компилятор может заменить этот блок двумя инструкциями vadd (если вам кажется, что вы могли бы извлечь из этого пользу).

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