2017-08-27 12 views
0

gccでコンパイルされるCコードのコンパイラオプションを指定したいと思います。私は、コードの展開方法のためにコード内からこれを行う必要があります。これは現在、最適化フラグを正しく指定しているように見えるコードです。gccでプラグマを使用して-march = nativeを指定する方法

#pragma GCC optimize ("-O3,-ffast-math") 
typedef float v4sf __attribute__ ((vector_size (16))); 
typedef union { 
    v4sf v; 
    float e[4]; 
} float4; 
typedef struct { 
    float4 x; 
    float4 y; 
} complex4; 
static complex4 complex4_mul(complex4 a, complex4 b) { 
    return (complex4){a.x.v*b.x.v -a.y.v*b.y.v, a.y.v*b.x.v + a.x.v*b.y.v}; 
} 
complex4 f4(complex4 x[], int n) { 
    v4sf one = {1,1,1,1}; 
    complex4 p = {one,one}; 
    for (int i = 0; i < n; i++) p = complex4_mul(p, x[i]); 
    return p; 
} 

は、しかし、私はまた-march=nativeを指定したいと思います。これはコード内から何とか が可能ですか?

私は試しました#pragma GCC optimize ("-O3,-ffast-math, -march=native") しかし、-march=nativeの部分は無視されているようです。 https://godbolt.org/g/FjbRcVを参照してください。

+0

は無視されていない、間違っているのです。何をアーカイブしたいですか? '-march'はクロスコンパイル時に実際に使用されます。 Nativeはマシンコンパイラのアーチが実行されることを意味します。 –

+0

@ PeterJ_01 gccが 'gcc -O3 -ffast-math -march = native'を実行したのと同じコードを生成します。 – eleanora

答えて

2

今私は理解しています。 Iこれまで私は、例えば#pragma GCC target

を使用するより他に方法はありません知っている:

#pragma GCC target ("arch=skylake-avx512")

しかし、それはパラメータとしてnative受け付けません。私はあなたのgodboltにそれを追加した

https://godbolt.org/g/vm1ZBa

IMOそれは彼らがコマンドラインパラメータを使用して、コンパイラに渡さなければならないと間違ったアプローチと適切に書かれたメイクファイルが

関連する問題