我想指定将在gcc中编译的C代码的编译器选项。我需要在代码中执行此操作,因为代码的部署方式。这是当前似乎成功指定优化标志的代码。
#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 :(得分:3)
所以考虑一下,
VACUUM (VERBOSE)
在gcc / config / i386 / i386.c中造成倒钩-
#pragma GCC target "arch=native"
我在该函数中看不到任何可以将“本机”作为x_ix86_arch_string处理的代码。
相反,它看起来像在gcc / config / i386 / driver-i386.c中的命令行处理序列中更早地处理了“本机”并检测到“实际的CPU”:
3066 /* Override various settings based on options. If MAIN_ARGS_P, the
3067 options are from the command line, otherwise they are from
3068 attributes. */
3069
3070 static void
3071 ix86_option_override_internal (bool main_args_p,
3072 struct gcc_options *opts,
3073 struct gcc_options *opts_set)
3074 {
...
3699 else if (i == pta_size)
3700 error ("bad value (%s) for %sarch=%s %s",
3701 opts->x_ix86_arch_string, prefix, suffix, sw);
3702
因此,总而言之,您要请求的内容需要更改gcc .. gcc中的动态cpu确定似乎只进行了一次,很早就完成,甚至只有在被要求时(由命令行参数触发),在开始任何解析或#pragma处理之前,此操作已完成。
在gcc的#pragma中获得动态cpu确定(也称为“ arch = native”)功能听起来更像是对它们的功能请求,而不是错误修复。
答案 1 :(得分:2)
现在我明白了。据我所知,除了使用#pragma GCC target
例如:
#pragma GCC target ("arch=skylake-avx512")
但它不接受native
作为参数。我已将它添加到你的魔咒
IMO这是错误的方法,因为它们应该使用命令行参数和正确编写的makefile传递给编译器