2015-04-04 29 views
0

對於生成的實際程序集檢查的不足之處,有沒有什麼方法可以確定OpenMP對特定用例將使用哪些特定於平臺的指令?例如,我已經確定pcmpeqq,即64位整數字相等(SSE 4.1)作爲所需的指令而不是pcmpeqd,即32位字相等(SSE 2)。有什麼方法可以知道OpenMP 4.0會生成前者而不是後者? (spec沒有解決這些細節問題。)瞭解OpenMP 4.0將生成哪些SIMD指令?

回答

3

保證任何編譯器永遠發出特定彙編指令的唯一方法是硬編碼它。世界上沒有規範限制編譯器爲給定語言特性生成特定指令。儘管如此,如果在命令行上隱式地或顯式地指定了對SSE4.1或更高版本的支持,那麼如果許多編譯器在稍後的指令可以工作的情況下發出SSE2指令,將會非常驚訝。

檢查裝配並非難事:

$ cat foo.c 
#include <stdio.h> 

int main(int argc, char **argv) { 

    const int n=128; 

    long x[n]; 
    long y[n]; 

    for (int i=0; i<n/2; i++) { 
     x[i] = y[i] = 1; 
     x[i+n/2] = 2; 
     y[i+n/2] = 2; 
    } 

    #pragma omp simd 
    for (int i=0; i<n; i++) 
     x[i] = (x[i] == y[i]); 

    for (int i=0; i<n; i++) 
     printf("%d: %ld\n", i, x[i]); 

    return 0; 
} 

$ icc -openmp -msse4.1 -o foo41.s foo.c -S -std=c99 -qopt-report-phase=vec -qopt-report=2 
icc: remark #10397: optimization reports are generated in *.optrpt files in the output location 
$ icc -openmp -msse2 -o foo2.s foo.c -S -std=c99 -qopt-report-phase=vec -qopt-report=2 -o foo2.s 
icc: remark #10397: optimization reports are generated in *.optrpt files in the output location 

千真萬確:

$ grep pcmp foo41.s 
    pcmpeqq (%rax,%rsi,8), %xmm0       #18.25 

$ grep pcmp foo2.s 
    pcmpeqd (%rax,%rsi,8), %xmm2       #18.25