如何在gcc中使用pragma(或其他)指定-march = native

时间:2017-08-27 18:47:23

标签: c gcc

我想指定将在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

2 个答案:

答案 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作为参数。我已将它添加到你的魔咒

https://godbolt.org/g/vm1ZBa

IMO这是错误的方法,因为它们应该使用命令行参数和正确编写的makefile传递给编译器