Цикл разворачивается в clang

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

#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, цикл не разворачивается.

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


person k01    schedule 05.12.2014    source источник


Ответы (2)


Я думаю, что в 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;
}
person plasmacel    schedule 07.04.2016

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

person jtony    schedule 01.04.2019