GCC的參數-march=native是如何獲取cpu類型和指令集的?
如題,手上有半個gentoo(liveCD),加march=core2參數把gcc從4.5.3升級到4.6.3之後打算加march=corei7-avx重新編譯之,報錯,加此參數編譯任何東西都報錯【本人的cpu是core i7-2600】,將此參數改為march=native後不再報錯,請問march=native獲取的march是否會是corei7-avx?這個參數獲取cpu信息的原理又是什麼?是不是cpuinfo?
- 報錯應該是別的原因。編譯器只是一個「翻譯器」,-march=corei7-avx 並不會阻止你在不支持 AVX 的 CPU 上面編譯使用了 AVX 指令的代碼。如果 CPU 不能執行翻譯出來的指令,最終操作系統會把進程殺死:SIGILL illegal instruction。
- gcc 內部使用 CPUID 指令獲取 CPU 信息,所以你不用懷疑 -march=native 沒給你最優選擇。相關代源碼:
// see gcc-4.8.5/gcc/config/i386/driver-i386.c
const char *
host_detect_local_cpu (int argc, const char **argv);// see gcc-4.8.5/gcc/config/i386/cpuid.h
static __inline unsigned int
__get_cpuid_max (unsigned int __ext, unsigned int *__sig);
- 我看 gentoo wiki 上不是教你用類似下面的命令獲得 march 了嘛:
gcc -c -Q -march=native --help=target | grep march
GCC optimization
- Linux /proc/cpuinfo 本質上也是用了 CPUID 指令。
GCC 4.2 introduces a new -march option, -march=native, which automatically detects the features your CPU supports and sets the options appropriately. If you have an Intel or AMD CPU and are using &>=sys-devel/gcc-4.2.3, using -march=native is recommended. Do not use -march=native if you use distcc on nodes with different architectures as this may produce unusable code.
所以一般建議使用 -march=native,GCC會自動檢測你的CPU支持的指令集。
編譯報錯有可能是你的CPU不支持 -march=corei7-avx包含的所有指令集。關於各個參數的意義可以參見這兒: http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html 摘錄了你可能關注的部分在下邊:`corei7"
Intel Core i7 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 instruction set support. `corei7-avx"Intel Core i7 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES and PCLMUL instruction set support.
推薦閱讀:
※在使用coroutine+asio多線程框架的時候,如何維護連接池復用連接?
※Linux C++怎麼做框架的性能調優?