2013-02-28 119 views
7

我剛剛升級到OS X 10.8「山獅」,我開始後悔做到這一點。OS X 10.8,llvm,OpenMP與CMake

我不再能夠構建使用OpenMP的我的(簡單)並行代碼。

通過看這裏和那裏我瞭解,蘋果是沒有更多的使用「GCC」,而是「LLVM」 - 很可能因爲許可證的相關問題。不幸的是,'llvm'不支持OpenMP。

我不能相信基於OpenMP的不能在OS X上運行更多的程序很多,所以我的問題是:我怎麼能在山獅啓用OpenMP?


閱讀里斯託·利維的出色答卷後,我覺得我缺少的不止我最初以爲。

我沒有使用XCode。該建築基於CMake和make/gcc。昨天我通過macports安裝了gcc 4.2,但是 - 截至今天 - 我的代碼仍然是源碼形式,因爲 - 出於一些奇怪的原因 - 我無法將編譯切換到gcc(與OpenMP相關的錯誤)。

現在的問題是CMake繼續使用llvm編譯器。 在根的CMakeLists.txt添加以下兩行:

set(CMAKE_C_COMPILER "/opt/local/bin/gcc-apple-4.2") 
set(CMAKE_CXX_COMPILER "/opt/local/bin/gcc-apple-4.2") 

而且我還加了兩個環境變量:

export CXX=/opt/local/bin/gcc-apple-4.2 
export CC=/opt/local/bin/gcc-apple-4.2 

當CMake的嘗試尋找的OpenMP(FIND_PACKAGE(OpenMP的))我得到下面的輸出:

-- The compiler is /opt/local/bin/gcc-apple-4.2 
-- Try OpenMP C flag = [-fopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
[...] 
CMake Error at /opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message): 
Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS) 
Call Stack (most recent call first): 
/opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE) 
/opt/local/share/cmake-2.8/Modules/FindOpenMP.cmake:159 (find_package_handle_standard_args) 
demo/CMakeLists.txt:8 (FIND_PACKAGE) 

我想手動運行/opt/local/bin/gcc-apple-4.2和失敗是由於缺少libgomp。

問候

+1

你可以在10.8上簡單安裝gcc:http://stackoverflow.com/questions/9353444/how-to-use-install-gcc-on-mac-os-x-10-8-xcode-4-4 – 2013-02-28 18:22:44

+1

我發現了這個問題,但它與安裝命令行工具有關。現在我已經看到了與安裝真正的gcc有關的答案。謝謝。 – 2013-02-28 18:32:16

+0

您不需要從macports添加GCC 4.2,因爲它附帶了XCode命令行工具。您只需[從GUI安裝](http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_3.html)。儘管如此,由於您不使用XCode,因此我強烈建議您構建自己的GCC 4.7.2--支持OpenMP 3.1功能的最新和最大的功能:) – 2013-03-01 09:49:23

回答

11

LLVM是,蘋果在OS X中廣泛使用(尤其是在OpenGL實現)編譯器框架,而不是一個編譯器本身。在Xcode中有兩個LLVM前端 - 基於舊GCC的llvm-gcc(支持OpenMP 2.5)和新的clang(不支持OpenMP)。 clang具有廣泛的靜態代碼分析功能,並且還有更好的錯誤報告,尤其是使用C++代碼。大多數情況下,這就是蘋果投資它並退出GCC的原因(另一方面,FreeBSD項目正在尋求以純粹與許可證相關的理由取代GCC)。目前有一個正在進行的項目clomp(不要誤以爲英特爾的Cluster OpenMP),該項目試圖創建clang的OpenMP感知版本,但它還遠未成熟。

如果您不需要新的OpenMP構造(如顯式任務),並且可以使用某些bugs,則仍然可以使用舊的GCC前端。只需切換在項目設置到LLVM GCC 4.2編譯器套件:

Compiler suite chooser

這一個是基於真正的古GCC 4.2.1和似乎不再被開發。如果你需要更新版本的GCC,只需build one。不幸的是,我無法向您提供有關如何將其集成到Xcode中的信息。它適用於GCC 4.7.1和OS X 10.8.2的命令行(我不使用Xcode)。

4

只需向優秀的Hristo的答案中添加幾句話:您可以通過MacPorts安裝gcc。這比用手編譯所有東西簡單得多(並且由於依賴關係等原因,從頭開始編譯gcc可能是非常不平凡的任務)。

因此,安裝MacPorts,執行「sudo port install gcc47」,等待幾個小時,然後您將以能夠編譯您的OpenMP代碼的gcc-mp-4.7結束。

+3

它也適用於自制軟件。 – FreeNickname 2013-06-03 16:13:02

+6

for OpenMP支持使用'$ brew install gcc --without-multilib' – 2015-02-27 20:44:25