2012-09-23 51 views
5

我可以爲Mac OS X創建一個通用二進制文件,其中包含兩個版本的應用程序,一個使用SSE4.2編譯,一個使用SSE3編譯?不同SSE版本的通用二進制

在這種情況下,我將使用SSE4.2編譯的版本自動加載支持SSE4.2的CPU。

如果不是,我想獲得建議在不支持SSE4.2的舊CPU上運行我的應用程序,但在支持它的CPU上使用SSE4.2。

請注意,如果是這樣的話,我將目標鎖定在Mac AppStore上。 我用Xcode 4.5使用Clang。

+0

您需要做的只是:1)檢測指令集。 2)分支到你想要的版本。 – Mysticial

+0

[我的答案在這裏顯示如何檢測指令集。](http://stackoverflow.com/a/7495023/922184)'__cpuid()'內部特定於MSVC。在GCC中,您可以使用內聯彙編來訪問它。我不確定你在使用什麼,但應該有一種方法來訪問它。 – Mysticial

+0

我不希望更改源代碼文件,因爲某些無法在舊CPU上運行的行來自第三方開源項目。 –

回答

3

這不受Mac OS X使用的Mach-O格式的支持。格式允許不同體系結構的二進制文件。有一個子類型字段,但只有爲不同代的處理器定義的值,而不是他們的能力。

有幾種方法可以解決這個問題。一種方法是將SSE4.2和用於較舊處理器的代碼內置到同一個二進制文件中,並使用不同的函數名稱。你的代碼將決定是否支持SSE4.2,然後調用正確的函數。

另一個選擇是建立兩個庫,一個使用SSE4.2,另一個使用SSE4.2,並且將它們都發布到應用程序捆綁包中,但不鏈接到它們。首次加載時,代碼將確定是否支持SSE4.2,然後加載正確的庫。

使用第一種方法,您不必擔心加載庫和連接所有函數,但是您總是會加載額外的代碼,這些代碼不會被執行,您必須在每個代碼之前檢查一個變量這些函數調用。使用第二種方法,你可以簡單地調用函數而不用每次檢查任何東西,但加載庫和連接所有的函數比每次只比較一個變量更重要。

相關問題