What are the differences and tradeoffs between -march=haswell, -march=core-avx2, and -mavx2 for compiling avx2 intrinsics? I know that -mavx2 is a flag and -march=haswell/core-avx2 are architectures which just translate to a bunch of flags. So -mavx2 is a subset of the other two. But beyond that, how do I choose the right one for my application?

How does -march=native choose which instruction sets to enable and which to disable? I have the following conjecture: -march=native will be using CPUID instructions to calculate supported instruction sets etc in order to detect the processor variant -march=foobar will use a hardcoded list of instruction sets which processor foobar supports.

unrecognized command-line option '-arch'; did you mean '-march='? Asked 4 years, 10 months ago Modified 1 year, 11 months ago Viewed 3k times

Using Clang 16.0 or later, I would like to know what values could be used for the -march argument. The command clang --print-supported-cpus shows for -mcpu=, but I see no alternative for -march.

-march=foo implies -mtune=foo unless you also specify a different -mtune. This is one reason why using -march is better than just enabling options like -mavx without doing anything about tuning. Caveat: -march=native on a CPU that GCC doesn't specifically recognize will still enable new instruction sets that GCC can detect, but will leave -mtune=generic. Use a new enough GCC that knows about ...