1. 程式人生 > >gcc相關編譯選項總結

gcc相關編譯選項總結

gcc 自動向量化相關指令

gcc -O3級優化已包括 “-ftree-vectorize” 選項對程式進行自動向量化,關閉向量化的選項是-fno-tree-vectorize。使用-ftree-vectorizer-verbose=n選項可以顯示自動向量化的結果,其中n的取值範圍為0到9。對於n的解釋可參考如下網址:http://blog.csdn.net/waverider2012/article/details/8529257

同時還可以通過命令-mavx -msse -msse2 -msse3生成對應指令集的,其中m代表硬體相關。檢視cpu是否支援上述指令集可通過cat /proc/cpuinfo命令。檢視cache大小可通過lscpu命令。給出一個部落格地址,其對於linux系統相關資訊查詢總結較為全面:

http://www.cnblogs.com/lhj588/archive/2012/05/15/2501007.html

對於“ relocation truncated to fit: R_X86_64_32S against `.bss' ”問題的解決方法:

在網上看到的資料顯示是由於陣列過大(超過2G)造成連結失敗,解決方法是通過新增編譯選項“-mcmodel=medium”。

2016/3/29訂正部分內容

在gcc 4.9.2下 “-ftree-vectorize” 與 “-ftree-vectorizer-verbose=n” 編譯選項沒有作用。啟用自動向量化的編譯選項為“ -O3”或“ -Ofast”,向量化過程中相關資訊輸出的選項為“ -fopt-info-vec-missed”。

程式碼如下:

int a[256], b[256], c[256];
foo () {
  int i;

  for (i=0; i<256; i++){
    a[i] = b[i] + c[i];
  }
}

makefile指令碼如下
ex1.o:ex1.c
	gcc -O3 -c -fopt-info-vec-missed ex1.c

輸出如下:
gcc -O3 -c -fopt-info-vec-missed ex1.c
ex1.c:5:3: note: misalign = 0 bytes of ref b[i_11]
ex1.c:5:3: note: misalign = 0 bytes of ref c[i_11]
ex1.c:5:3: note: misalign = 0 bytes of ref a[i_11]
ex1.c:5:3: note: virtual phi. skip.
ex1.c:5:3: note: num. args = 4 (not unary/binary/ternary op).
ex1.c:5:3: note: not ssa-name.
ex1.c:5:3: note: use not simple.
ex1.c:5:3: note: num. args = 4 (not unary/binary/ternary op).
ex1.c:5:3: note: not ssa-name.
ex1.c:5:3: note: use not simple.
ex1.c:2:1: note: not vectorized: not enough data-refs in basic block.
ex1.c:6:13: note: not vectorized: no vectype for stmt: vect__4.5_1 = MEM[(int *)vectp_b.3_9];
 scalar_type: vector(4) int
ex1.c:6:13: note: not vectorized: not enough data-refs in basic block.
ex1.c:2:1: note: not vectorized: not enough data-refs in basic block.
ex1.c:8:1: note: not vectorized: not enough data-refs in basic block.