【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)

リンクがないとか言われてますね...そりゃそうだ()

参考

qiita.com

clang-omp.github.io