7

OS X 10.8 "Mountain Lion" にアップグレードしたばかりですが、アップグレードしたことを後悔し始めています。

OpenMP を使用する (単純な) 並列コードをビルドできなくなりました。

あちらこちらを見て、Apple はもはや「gcc」ではなく「llvm」を使用していることを理解しました。これはおそらくライセンス関連の問題によるものです。残念ながら、'llvm' は (まだ?) OpenMP をサポートしていません。

OpenMP に基づく多くのプログラムが OS X で動作しなくなるとは信じられません。そこで私の質問は、Mountain Lion で OpenMP を有効にするにはどうすればよいですか?


Hristo Iliev の優れた回答を読んだ後、最初に思っていたよりも多くのことを見逃していると思います。

私はXCodeを使用していません。建物は CMake と make/gcc に基づいています。昨日、macports 経由で gcc 4.2 をインストールしましたが、今日の時点では、私のコードはまだソース形式のままです。これは、いくつかの奇妙な理由により、コンパイルを gcc に切り替えることができないためです (OpenMP に関連する同じエラー)。

現在の問題は、CMake が llvm コンパイラを使用し続けることです。ルート CMakeLists.txt に、次の 2 行を追加しました。

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

また、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 がないために失敗しました。

よろしく

4

2 に答える 2

11

LLVM は、Apple が OS X (特に OpenGL 実装) で広く使用しているコンパイラ フレームワークであり、コンパイラ自体ではありません。Xcode で使用できる 2 つの LLVM フロントエンドがあります。古い GCC ベースのものllvm-gcc(OpenMP 2.5 をサポートする) と新しいものclang(OpenMP をサポートしない) です。clangには、広範な静的コード分析機能があり、特に C++ コードのエラー レポートがより優れています。これが、Apple が GCC に投資し、GCC から離れようとしている理由のほとんどです (一方、FreeBSD プロジェクトは、純粋にライセンス関連の理由から、GCC を clang に置き換えようとしています)。clompの OpenMP 対応バージョンを作成しようとする進行中のプロジェクト (Intel の Cluster OpenMP と間違わないでください) がありますclangが、成熟にはほど遠い状態です。

明示的なタスクのような新しい OpenMP コンストラクトを必要とせず、いくつかのバグに耐えられる場合は、古い GCC フロントエンドを引き続き使用できます。プロジェクト設定のコンパイラ スイートを LLVM GCC 4.2 に切り替えるだけです。

コンパイラスイートの選択

これは本当に古い GCC 4.2.1 に基づいており、もはや開発されていないようです。GCC の新しいバージョンが必要な場合は、単純にビルドしてください。残念ながら、Xcode に統合する方法に関する情報を提供することはできません。GCC 4.7.1 と OS X 10.8.2 のコマンド ラインで動作します (Xcode はあまり使用しません)。

于 2013-02-28T20:59:36.853 に答える
4

優れたHristoの答えにいくつかの単語を追加するだけです.MacPorts経由でgccをインストールできます. これは、すべてを手作業でコンパイルするよりもはるかに簡単です (また、gcc をゼロからコンパイルすることは、依存関係などにより、非常に簡単な作業になる場合があります)。

そのため、MacPorts をインストールし、「sudo port install gcc47」を実行して数時間待つと、OpenMP コードをコンパイルできる gcc-mp-4.7 で終了します。

于 2013-03-02T05:59:32.800 に答える