2016年現在、OpenMPに対応したclangをビルドする方法をまとめます。ググると OpenMP®/Clang を使えという情報がいくつか見つかるのですが、llvm 3.7.0 から clang は OpenMP を公式サポートしているので、公式のclangを使いましょう。
現在のllvmの最新リリースバージョンは 3.7.1で、trunkは 3.8.0 になっています 1/14(この記事を書いた翌日)には 3.9.0 になっていました… (a07c74e)
clang ビルド手順まとめ
- 適当な場所に
build
ディレクトリを作成(この記事では、llvm の top-level ディレクトリとします) cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
make -j4 install
安定版を使う場合は、適当にtagが付いたものを使えばOKだと思います。
clang+openmp が使えるかどうか確認
コード
test.cpp
#include <iostream>
#include <omp.h>
int main() {
#pragma omp for simd
for (int i = 0; i < 10; ++i) {
std::cout << i << std::endl;
}
return 0;
}
Building the OpenMP Branch of LLVM/Clang で紹介されていたサンプルコードを拝借しました。
コンパイル
-v
をつけた結果を貼っておきます。
% clang++ -fopenmp -v test.cpp
clang version 3.8.0 (https://github.com/llvm-mirror/clang.git 1f54fb1b5a76d0fa9d956baa523845b4861c0915) (https://github.com/llvm-mirror/llvm.git 805ea3283576c755fc1e8bf19872dbb1c8436fca)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
InstalledDir: /usr/local/bin
"/usr/local/bin/clang-3.8" -cc1 -triple x86_64-apple-macosx10.10.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 242.2 -v -dwarf-column-info -debugger-tuning=lldb -resource-dir /usr/local/bin/../lib/clang/3.8.0 -stdlib=libc++ -fdeprecated-macro -fdebug-compilation-dir /Users/ryuyamamoto/Dropbox/llvm/clang -ferror-limit 19 -fmessage-length 205 -fopenmp -stack-protector 1 -fblocks -fobjc-runtime=macosx-10.10.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/ph/mss0_ys92f9fw0nt9c1qswy40000gq/T/test-727998.o -x c++ test.cpp
clang -cc1 version 3.8.0 based upon LLVM 3.8.0svn default target x86_64-apple-darwin14.4.0
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/bin/../include/c++/v1
/usr/local/include
/usr/local/bin/../lib/clang/3.8.0/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.10.0 -o a.out /var/folders/ph/mss0_ys92f9fw0nt9c1qswy40000gq/T/test-727998.o -lomp -lc++ -lSystem /usr/local/bin/../lib/clang/3.8.0/lib/darwin/libclang_rt.osx.a
実行結果
% ./a.out
0
1
2
3
4
5
6
7
8
9
雑記
-
-DCMAKE_BUILD_TYPE=Release
を指定しないとデバッグモードでビルドされるため、clang++ のコンパイル時間が激重になる。参考までに、上記のコードで約5秒(リリースだと0.4秒)。 - libcxx/libcxxabi を一緒にビルド & インストールしないと、
iosteam
が見つかりません、のように標準ライブラリが見つからない旨のエラーがでる。Macでclang+OpenMP
にあるように、include pathを追加することで解決可能だが、libcxx も一緒にインストールすることでも解決可能 - OSX 10.10 で試しましたが、他の環境でも同じ方法で問題ないと思います。