R でインテル® MKL を使用する

インテル® oneMKL

この記事は、インテル® デベロッパー・ゾーンに公開されている「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

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました