関連リンク:OTFFT -- FFTW より速い FFT ライブラリ

macOS への GCC と Intel OpenMP Runtime の導入

 このページの情報は既に古くなっており、現状を反映していません。 参考のために残してあるページです。

 私は普段 Mac で OTFFT の開発等を行っています。 Mac は MacPorts などを使えば簡単に最新の GCC を導入できたりして便利なのですが、 AVX や AVX2 を使おうとするとそのままではエラーになってしまいます。 また、GCC の OpenMP はどうやら Linux に最適化されているようで、 macOS で GCC デフォルトの libgomp を使うと Linux ほど性能が出ません。

 そこで、このページでは macOS の GCC で AVX/AVX2 を使うための設定や、 macOS で libgomp より性能が上がる Intel OpenMP Runtime の導入方について説明します。

【macOS の GCC で AVX/AVX2 を使う】

 macOS での GCC の導入自身は MacPorts を使えば説明するまでもなく簡単にできます。 問題は、コンパイルオプションに -march=native や -mtune=native をつけて、 AVX や AVX2 が使える CPU に対して最適化しようとするとエラーになることです。 これを回避するには以下の設定を行います。

    cd /opt/local/bin
    sudo ln -s /usr/bin/clang

 この設定をしてから g++ 等でコンパイルするとき -Wa,-q オプションをつければエラーは出なくなります。 具体的には以下のようにします。

    g++-mp-6 -Ofast -Wa,-q -march=native hello.cpp -o hello

【macOS で Intel OpenMP Runtime を使う】

 まずは、 こちらのページ から Intel OpenMP Runtime をダウンロードしておきましょう。

 次に、Intel OpenMP Runtime をビルドするために cmake をインストールします。 MacPorts にありますのでインストールしてください。続いて、 先ほどダウンロードした Intel OpenMP Runtime を展開したフォルダに移動して、 以下のコマンドを実行します。

    cmake CMakeLists.txt
    make

 たぶん正式には、この後 make install 等を行ってインストールするのでしょうが、 私は Mac のデフォルト環境をできるだけ汚したくないのでやりませんでした。 そこで、 手動で自分が開発のために準備したフォルダに必要なファイルを配置しました。

 ビルドされたライブラリ libiomp5.dylib は、 Intel OpenMP Runtime を展開したフォルダが $iomp5 だとすれば、 $iomp5/exports/mac_32e/lib.thin フォルダに入っています。 mac_32e の部分はアーキテクチャによって変化するようです。 その他、$iomp5/src にも入っています。 これを自分の使うフォルダへコピーしておきましょう。 私は $HOME/lib フォルダに配置しました。 このフォルダは魔法のフォルダです。 詳しくは man dyld の DYLD_FALLBACK_LIBRARY_PATH の説明を参照してください。

 OpenMP のヘッダファイルは、$iomp5/exports/common/include に入っています。これも自分の使うフォルダへコピーしておきましょう。 これで GCC で libgomp の代わりに libiomp5 を使う準備が整いました。

 最後にコンパイル方についてですが、以下のように2段階でコンパイルします。 $iomp5include は Intel OpenMP Runtime のヘッダファイルを配置したフォルダです。

    g++-mp-6 -Ofast -Wa,-q -fopenmp -I$iomp5include -c hello.cpp
    g++-mp-6 hello.o -L$HOME/lib -liomp5 -o hello

 余談ですが、Intel OpenMP Runtime は macOS の場合、 デフォルトでは clang でビルドされます。GCC でビルドしたい場合は、 cmake コマンドを実行するとき以下のようにします。

    cmake -DCMAKE_C_COMPILER=gcc-mp-6 -DCMAKE_CXX_COMPILER=g++-mp-6 CMakeLists.txt

 また、コンパイルオプションを変更したい場合などは ccmake コマンドを使います。 以下のようにします。

    ccmake .

関連リンク:OTFFT -- FFTW より速い FFT ライブラリ