2012-08-04 89 views
2

我有一個關於如何編譯器設置符號,特別是CPU功能標誌(如SSE,AES,AVX)實際設置的問題。例如,如果我用-mavx調用gcc,__AVX__符號集,不管是否代碼即將構建的系統實際上支持AVX指令,還是之前檢查?CPU功能和編譯器符號

我在問,因爲我需要根據CPU功能建立一個特定的代碼路徑,並希望自動執行,以便在編譯時根據構建系統確定正確的路徑,而不是手動啓用所需的功能。但是,因爲我唯一的CPU基本上支持所有功能,我無法測試我的上述假設(第一世界的問題,我知道)

有將是大量的代碼如此簡單藏在心裏,並在運行的分支是無法接受 - 並且假定我的圖書館將在用於特定系統之前建立。

我的意思是,在最壞的情況下,我可以通過將gcc參數包裝在cpuid感知腳本中來強制執行此行爲,但是如果gcc自動執行它,則會更好。那麼是否有人知道它是否?


我最感興趣的是gcc的這個,但我也很想知道其他C編譯器的行爲。

回答

1

如果你通過了-mavx標誌,__AVX__總是來爲生成的彙編集(和生成的代碼可能無法在非AVX機器上運行)。

如果您通過-march=native標誌,gcc將啓用構建機支持的指令集,因此__AVX__只有在構建機支持時纔會被設置。

+0

啊,太棒了,所以我可以使用'-march = native',所有支持的功能的符號都會自動設置,非常整齊。我會閱讀這個國旗,謝謝! – Thomas 2012-08-04 05:11:57

+2

解釋爲什麼編譯器會以這種方式運行:諸如「-mavx」之類的開關告訴編譯器** target **機器將是什麼,編譯器設置預處理器符號以匹配它,以便源代碼可以使用這些符號調整目標機器。您建立的機器可能與目標機器沒有任何關係;它只是一個將C源代碼轉換爲目標機器可執行代碼的通用計算設備。只是因爲我們經常使用編譯器來爲當前機器編譯我們認爲當前機器是編譯器設置的。 – 2012-08-04 10:47:44

+0

@EricPostpischil感謝您的解釋,這是有道理的。我同意這不是很直觀,特別是因爲在Linux中你很少把二進制文件轉出來,所以通常當你編譯一些東西的時候,它會在它被編譯的系統上運行它。但這種方式更靈活合乎邏輯。 – Thomas 2012-08-05 12:01:35