Разматывание петли в лязг

Я пытаюсь выборочно развернуть второй цикл в следующей программе:

#include <stdio.h>

int main()
{
    int in[1000], out[1000]; 
    int i,j;

    #pragma nounroll
    for (i = 100; i < 1000; i++)
    {
       in[i]+= 10;
    }

    #pragma unroll 2
    for (j = 100; j < 1000; j++)
    {
       out[j]+= 10;
    }

    return 1;
}

Когда я запускаю clang (3.5) со следующими параметрами, он развертывает оба цикла 4 раза.

clang -std=c++11 -O3 -fno-slp-vectorize -fno-vectorize -mllvm -unroll-count=4 -mllvm -debug-pass=Arguments -emit-llvm -c *.cpp 

Что я делаю неправильно? Кроме того, если я добавлю -fno-unroll-loopsили пропустите -unroll-count=4 флаг, это не разворачивает любой цикл.

Кроме того, какие-либо советы о том, как отладить прагматические ошибки?

1 ответ

Я думаю, что нет поддержки таких прагм в Clang 3.5.

Однако, начиная с 3.6, вы можете использовать #pragma clang loop unroll(enable | disable) включить или отключить функцию автоматического развертывания на основе диагностики. Если вы хотите полностью развернуть цикл, то #pragma clang loop unroll(full) это сокращение для этого. Вы также можете использовать #pragma clang loop unroll_count(N) - где N - постоянная времени компиляции - чтобы явно указать счетчик развертывания.

Больше информации здесь.

Ваш код переписан с точки зрения вышеупомянутых вещей:

#include <stdio.h>

int main()
{

  int in[1000], out[1000]; 
  int i,j;

  #pragma clang loop unroll(disable)
  for (i = 100; i < 1000; i++)
  {
     in[i]+= 10;
  }

  #pragma clang loop unroll_count(2)
  for (j = 100; j < 1000; j++)
  {
     out[j]+= 10;
  }


  return 1;
}

-unroll-count=4 имеет более высокий приоритет, чем #pragma clang loop unroll_count(2), Вот почему он заканчивает, разверните его на 4. Это означает, что компилятор следует параметру командной строки unroll-count, а НЕ прагме. Также, как упомянуто плазмелом, развертывание #pragma clang loop не поддерживается до clang 3.6.

Другие вопросы по тегам