Linux* 上でインテル® C++ コンパイラーとインテル® MKL を使用して R-3.0.1 をビルドする

インテル® DPC++/C++ コンパイラーインテル® oneMKL

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Build R-3.0.1 with Intel® C++ Compiler and Intel® MKL on Linux*」の日本語参考訳です。


  1. CRAN (Comprehensive R Archive Network) から R をダウンロードします。CRAN は、最新の R のコードとドキュメントのダウンロードを提供する Web サーバーです。世界中にミラーが存在します。ネットワークの負荷を最小限に抑えるため、最寄りの CRAN ミラー (http://cran.r-project.org/mirrors.html) を利用してください。

  2. ソースの tar ファイルを展開します。

  3. デフォルトの gcc ツールではなく、インテル® C++ コンパイラーのツール (icc、icpc、xiar、xild) を使用して R プロジェクトをビルドするには、次の手順を行います。

    $ source /opt/intel/composerxe/bin/compilervars.sh intel64
    $ export CC="icc"
    $ export CXX="icpc"
    $ export AR="xiar"
    $ export LD="xild"

  4. パフォーマンスを向上させたい場合は、次のオプションをコマンドラインに追加します。

    $ export CFLAGS="-O3 -ipo -openmp -xHost"
    $ export CXXFLAGS="-O3 -ipo -openmp -xHost"

  5. Linux* オペレーティング・システムの場合、R でインテル® マス・カーネル・ライブラリー (インテル® MKL) のマルチスレッド・バージョンを使用するには、次のコマンドを実行し、コマンドを入力したときに正しいインテル® MKL ライブラリーの場所が表示されることを確認します。

    $ MKL="-lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
    $ echo $MKL

  6. R プログラミング言語用のビルド環境を設定して、R オブジェクトを関連ディレクトリーにインストールします。

    $ sudo ./configure --with-blas="$MKL" --with-lapack
    $ sudo make && sudo make install

  7. R ディレクトリーに移動して R 実行ファイルを起動し、基本的なコマンドを入力して最小限のプログラムの正当性を検証します。

    $ file bin/R
    $ . bin/R
    $ > y <- log(5)
    $ > y

    R で log(5) 関数を実行して値を内部値 ‘y’ に割り当てると、結果が stdout に表示されます。値は ‘[1] 1.609438’ になります。

  8. インテル® コンパイラーを使用して R をコンパイルします。ここでは、「Extending R with Intel MKL」(http://software.intel.com/en-us/articles/extending-r-with-intel-mkl) の記事と同じ R ラッパーコード (pow_wrp.c) を使用します。

    $ export LD_LIBRARY_PATH=/opt/intel/composerxe/lib/intel64/:./lib:./:$LD_LIBRARY_PATH
    $ icc -O2 -fPIC -I/home/qiaominq/R-3.0.1/include -c pow_wrp.c -o pow_wrp.o
    $ icc -shared -liomp5 -L/opt/intel/composerxe/mkl/lib/intel64 -lmkl_rt -o pow_wrp.so pow_wrp.o -L./lib -lR

    インテル® 64 プラットフォームでは ‘-fPIC’ オプションが必要です。これを指定しないと、一部の ELF スタンドアロン・オブジェクトを関連する最終 ELF 共有オブジェクトにリンクしたときに、次のエラー・メッセージが表示されます。

    ld: pow_wrp.o: relocation R_X86_64_PC32 against undefined symbol `Rf_coerceVector' can not be used when 
    making a shared object; recompile with -fPIC .ld: final
    link failed: Bad value

  9. インテル® コンパイラーのツール (icc、icpc、xiar、xild) とインテル® MKL の BLAS/LAPACK 関数を用いた R プログラムおよび R ランタイム実行環境のパフォーマンス向上率を測定します。

    最初に、数学関数を呼び出す R テストスクリプトを使って、上記でコンパイルした R 環境で R プログラムの実行時間を出力します。

    dyn.load("pow_wrp.so")
    mkl_pow <- function(n, x, y) .Call("mkl_vdpow", n, x, y)
    n <- 1000000
    x <- runif(n, min=2, max=10)
    y <- runif(n, min=-2, max=-1)
    start <- proc.time()
    z <- mkl_pow(n, x, y)
    end1 <- proc.time() - start
    end1
    ##n <-1000000
    i <- n
    start <- proc.time()
    repeat{ z[i] <- x[i]^y[i] i <- i - 1
    if (i==0) break() }
    end2 <- proc.time() - start
    end2

    結果は、インテル® MKL を使用することで約 25 倍、R プログラムと R ランタイム・フレームワークをインテル® コンパイラーのツール (icc、icpc、xiar、xild、ライブラリー、その他) でコンパイルして最適化することでさらに 5 倍、パフォーマンスが向上しました。テスト・ベンチマークは、Linux* ホスト (4 コア インテル® Core™ i7 プロセッサー 3770K (3.50GHz)、4GB メモリー、Red Hat* Enterprise Linux* Server リリース 6.3) 上で実行されました。

    ////// 1. デフォルトの R フレームワーク/環境でプログラムを実行

       user  system elapsed
      3.842   0.020   2.913

    ////// 2. デフォルトの R フレームワーク/環境 + インテル® MKL で R を拡張してプログラムを実行

       user  system elapsed
      0.115   0.019   0.337

    ////// 3. デフォルトの R フレームワーク/環境 + インテル® MKL で R を拡張 + インテル® コンパイラーで R をコンパイルおよび最適化してプログラムを実行

       user  system elapsed    
      0.019   0.008   0.015

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

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