2014-12-05 100 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; 
}