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?


  1. 報錯應該是別的原因。編譯器只是一個「翻譯器」,-march=corei7-avx 並不會阻止你在不支持 AVX 的 CPU 上面編譯使用了 AVX 指令的代碼。如果 CPU 不能執行翻譯出來的指令,最終操作系統會把進程殺死:SIGILL illegal instruction。

  2. 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);

  3. 我看 gentoo wiki 上不是教你用類似下面的命令獲得 march 了嘛:

    gcc -c -Q -march=native --help=target | grep march

    GCC optimization

  4. Linux /proc/cpuinfo 本質上也是用了 CPUID 指令。

BTW:

Gentoo 最大的優點就是方便隨時查看任何程序的源代碼。

要是你不怎麼看源碼,還不如用 Arch 之類的發行版算了……


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++怎麼做框架的性能調優?

TAG:Linux | Gentoo | GCC | 編譯 |