Разматывание петли в лязг
Я пытаюсь выборочно развернуть второй цикл в следующей программе:
#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.