自分のMacBookPro(MacOS Sierra 10.12.1)でopenMPを使うことになったので、その手順をまとめます。初めは公式ホームページを参照しながら試みたのですが、ビルドができず失敗しました。 そこでHomebrewで構築することにしました。 追記:LLVM 8.1から公式のclangがOpenMPに対応したため、以下で紹介するclang-omp
を導入するより最新のLLVMを導入したほうがいいです。(追記参照)
Getting the source code, Building
Homebrewをつかってclang-ompをインストールします。
$ brew tap homebrew/boneyard
$ brew install clang-omp
Using
PATHを通すために.zshrc等に環境変数を設定します。!date!の部分はインストールされた最新のフォルダ名を入れてください。
export C_INCLUDE_PATH=/usr/local/Cellar/libiomp/!date!/include/libiomp:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/local/Cellar/libiomp/!date!/include/libiomp:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=/usr/local/Cellar/libiomp/!date!/lib:$LIBRARY_PATH
試しにサンプルを動かします。
test_omp.cpp
#include <iostream>
#include <omp.h>
int main() {
#pragma omp parallel
{
// ここがコア数分だけ並列に実行される。1コアだと1つです。
printf("Hello, World ! %d of %d\n", omp_get_thread_num(), omp_get_num_threads());
}
return 0;
}
$ clang-omp++ -fopenmp test_omp.cpp -o test_omp
$ ./test_omp
Hello, World ! 3 of 4
Hello, World ! 0 of 4
Hello, World ! 2 of 4
Hello, World ! 1 of 4
成功です。ちなみに僕のMacBookProのコア数は
$ system_profiler SPHardwareDataType | grep Cores
Total Number of Cores: 2
2つですが、4並列されているのはHyper-threadingが有効になっているかららしいです。無効にしたい方は、
$ sudo nvram SMT=0
で無効にできます。
追記:2016/11/09
EqualL2さんからより良い方法を教えていただきました。ありがとうございます!
LLVM 8.1から公式のclangがOpenMPに対応したため、clang-omp
はこれ以上更新されないそうです。そのため最新のLLVMを導入したほうがいいです。僕のMac上でも動作を確認できました。
1.llvm
をインストール
$ brew install llvm
2.(.bashrcなどに)エイリアスを設定
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'