2014-12-05 104 views
2

我试图选择性地展开第二循环在下面的程序:循环展开在铛

#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

我认为在叮当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; 
}