【OpenMP】MacでLLVMを使ってOpenMPの環境を作った
OpenMPの環境構築に手間取った
数値計算を行う上で必ずいつか必要になる並列計算ライブラリであるOpenMPとMPI. このうち,今回はOpenMPの環境を作ろうとして非常に手間取ったので,そのまとめを行う.
LLVMを使う
参考記事によれば,「LLVM 8.1から公式のclangがOpenMPに対応した」そうです.
2018/11/14現在,”OpenMP Mac” と検索すると2017年頃の記事が大量にヒットするのですが,
そのどれもがほとんどclang-omp
を導入した記事になっています.
しかし,LLVMが公式にOpenMPに対応したことでclang-omp
は更新されなくなりました.
導入
homebrew
を使うと簡単です.
$ brew install llvm
これでインストールは完了です.
そして,次のようにエイリアスを作ることでOpenMPをビルドする時のコマンドを作ってしまいます.
次のテキストを.bash_profile
や.zshrc
に追記してください.自分はbash
を昔捨ててzsh
を使ってますので
.zshrc
への記述が必要になりました.
#OpenMP alias clang-omp='/usr/local/opt/llvm/bin/clang -fopenmp -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib' alias clang-omp++='/usr/local/opt/llvm/bin/clang++ -fopenmp -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib'
以上でもう使えるようになっています.
使い方
サンプルとして次のようなファイルを作って見ましょう.
#include <omp.h> #include <stdio.h> int main() { #pragma omp parallel printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); }
そして,次のようなコマンドを使います.
$ clang-omp -fopenmp hello.c -o hello
これで実行ファイルができますので,それを実行した結果が次になります.
$ ./hello Hello from thread 0, nthreads 8 Hello from thread 6, nthreads 8 Hello from thread 2, nthreads 8 Hello from thread 1, nthreads 8 Hello from thread 7, nthreads 8 Hello from thread 4, nthreads 8 Hello from thread 3, nthreads 8 Hello from thread 5, nthreads 8
実は自分はここでハマってました.恥ずかしい...
clang
だけで普通のコンパイラが起動してしまうので,そこを勘違いすると,次のようなエラーが出ます.
$ clang -fopenmp hello.c -o hello ld: library not found for -lomp clang-7: error: linker command failed with exit code 1 (use -v to see invocation)
リンクがないとか言われてますね...そりゃそうだ()