2014-12-05 4 views
2

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

#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; 
} 

Когда я бег лязга (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 - это константа времени компиляции - для явного указания количества разрозненных.

Дополнительная информация here.

Ваш код переписан в терминах вышеприведенного материала:

#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; 
}