What exactly “-march=native” means
By chys on April 12th, 2010
GCC 4.2 introduced “-march=native”. With this option, GCC automatically optimizes for local computer.
I used to think GCC would simply replace it with an appropriate “-march=....” based on results of CPUID, so, for example, it would be equivalent to “-march=core2” on a Core 2 CPU.
Actually GCC does more than I guessed. We can observe what GCC actually replaces it with:
- Run
gcc -march=native -c -o /dev/null -x c -in one terminal;
- Open another terminal and type
ps af | grep cc1Then we will see how carefully GCC detects our CPU.
I tried this using GCC 4.4.1 on a computer equipped with a Core i3 CPU, and it turns out “-march=native” means
-march=core2 -mcx16 -msahf -mpopcnt -msse4.2 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=256 -mtune=core2
on this computer. It says:
- We can use SSE4.2 instructions,
CMPXCHG16B,SAHF/LAHF(in 64-bit mode),POPCNT, in addition to all instructions available on a Core 2; - The size of L1 and L2 caches are 32KiB and 256KiB, respectively; each L1 cache line is 64 bytes;
- Use instructions that are most suitable for Core 2 (Sure Core i3 is different from Core 2, but it is too new to have specific optimization support in compilers).
So, the conclusion: always use “-march=native” when compiling codes for local use.
No related posts.
Tags: GCC

$ gcc -march=native -Q -v –help=target
En…
[...] something about en[...]…
[...] compiling for a dedicated box, but the fine detail that -march=native is going to as indicated in this article makes me extremely wary of using [...]
I have been browsing online more than three hours today, yet
I never found any interesting article like yours.
It’s pretty worth enough for me. In my view, if all web owners and bloggers made good content as you did, the internet will be much more useful than ever before.