この記事は、インテル® デベロッパー・ゾーンに公開されている「Using Intel® MKL with R」の日本語参考訳です。
概要
R は統計計算向けのプログラミング言語です。オープンソース・パッケージは、R プログラムの作成と実行に必要な環境も提供します。この記事は、インテル® マス・カーネル・ライブラリー (インテル® MKL) の BLAS および LAPACK ライブラリーを使用して R のパフォーマンスを向上する方法を紹介します。ほかのインテル® MKL 関数の使用については、「インテル® MKL で R を拡張する」 (http://software.intel.com/en-us/articles/extending-r-with-intel-mkl) を参照してください。
参考資料: http://www.r-project.org/ (英語)
必要条件:
- インテル® MKL には、高度に最適化された BLAS、LAPACK に加えて、R に直接適用できる統計機能が含まれています。インテル® MKL の詳細は、製品ページを参照してください。
- R パッケージのダウンロードとインストール – http://www.r-project.org/ (英語)
インテル® MKL を使用するように R をビルドする
–with-blas オプションを使用して、インテル® MKL の BLAS と LAPACK を使用するように R を設定できます。
Linux* でインテル® MKL の GNU* OpenMP* によるマルチスレッド・バージョンを使用するため GNU* gcc と GNU* gfortran で R をビルドする場合は、次のように指定します。
source /opt/intel/composer_xe_2015.1.133/mkl/bin/mklvars.sh intel64 MKL="-Wl,--no-as-needed -lmkl_gf_lp64 -Wl,--start-group -lmkl_gnu_thread -lmkl_core -Wl,--end-group -fopenmp -ldl -lpthread -lm" ./configure --with-blas="$MKL" --with-lapack
ライブラリーの指定順序が重要です。–with-lapack オプションを使用すると、インテル® MKL の LAPACK が使用されます。
インテル® MKL のリンク行は、コンパイラーとスレッド化モデルに応じて異なります。インテル® MKL リンクライン・アドバイザー (https://software.intel.com/sites/products/mkl/mkl_link_line_advisor.htm) を利用して、ニーズに合った適切なライブラリーを選択できます。
以下にいくつかの例を示します。
インテル® C/C++ コンパイラー (icc) とインテル® Fortran コンパイラーで R をビルドする場合は、次のように指定します。
source /opt/intel/composer_xe_2015.1.133/mkl/bin/mklvars.sh intel64 MKL=" -Wl,--no-as-needed -Wl,--start-group \ -lmkl_intel_lp64 \ -lmkl_intel_thread \ -lmkl_core \ -Wl,--end-group \ -liomp5 -lpthread -lm" ./configure --with-blas="$MKL" --with-lapack
デフォルトのスレッド数はシステムの物理コアの数と同じですが、環境変数 OMP_NUM_THREADS または MKL_NUM_THREADS を設定して制御できます。
インテル® MKL のシーケンシャル・バージョンを使用する場合は、次のように指定します。
source /opt/intel/composer_xe_2015.1.133/mkl/bin/mklvars.sh intel64 MKL=" -L$(MKLROOT)/lib/intel64 \ -Wl,--start-group \ -lmkl_gf_lp64 \ -lmkl_sequential \ -lmkl_core \ -Wl,--end-group"
最後に、インテル® MKL を GNU* スレッディング・ランタイムに静的にリンクする場合は、次のように指定します。
source /opt/intel/composer_xe_2015.1.133/mkl/bin/mklvars.sh intel64 MKL=" -L$(MKLROOT)/lib/intel64 \ -Wl,--start-group \ ${MKL_LIB_PATH}/libmkl_gf_lp64.a \ ${MKL_LIB_PATH}/libmkl_gnu_thread.a \ ${MKL_LIB_PATH}/libmkl_core.a \ -Wl,--end-group \ -lgomp -lpthread"
インテル® MKL の動作を確認する
config.log を開いて、インテル® MKL が動作していることを確認します。
configure:29075: checking for dgemm_ in -L/opt/intel/composer_xe_2015.1.133/mkl/lib/intel64/ -lmkl_gf_lp64 -lmkl_sequential -lmkl_core
configure:29096: gcc -std=gnu99 -o conftest -g -O2 -I/usr/local/include -L/usr/local/lib64 conftest.c -L/opt/intel/composer_xe_2015.1.133/mkl/lib/intel64/ -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lgfortran -lm -lrt -ldl -lm >&5
conftest.c: In function 'main':
conftest.c:210: warning: implicit declaration of function 'dgemm_'
configure:29096: $? = 0
configure:29103: result: yes
configure:29620: checking whether double complex BLAS can be used
configure:29691: result: yes
configure:29711: checking whether the BLAS is complete
または、インテル® MKL を動的にリンクした場合は、ビルド後に次のコマンドを実行して確認できます。
$ ldd ./bin/exec/R linux-vdso.so.1 => (0x00007fffa45ff000) libmkl_gf_lp64.so => /opt/intel/composer_xe_2015.1.133/mkl/lib/intel64/libmkl_gf_lp64.so (0x00007fe963097000) ......
パフォーマンス結果
インテル® MKL を使用することで得られるパフォーマンスの向上を示すため、R benchmarks (http://r.research.att.com/benchmarks/) にある R-benchmark-25.R を、4 コアのインテル® Core™ i7-975 プロセッサー エクストリーム・エディション (8MB LLC、3.33GHz)、6GB RAM 搭載の RHEL 6 x86_64 システムで実行しました。最初に R-2.15.3 をインストールして、インテル® MKL を使用しないでベンチマークを実行したところ、次の結果が得られました。
175.825 sec
そして、インテル® MKL 11.0 Update 2 をインストールして、前述の方法に従って実行したところ、次のような結果が得られました。
17.289 sec
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。