この記事は、インテル® デベロッパー・ゾーンに掲載されている「Build R-3.0.1 with Intel® C++ Compiler and Intel® MKL on Linux*」の日本語参考訳です。
CRAN (Comprehensive R Archive Network) から R をダウンロードします。CRAN は、最新の R のコードとドキュメントのダウンロードを提供する Web サーバーです。世界中にミラーが存在します。ネットワークの負荷を最小限に抑えるため、最寄りの CRAN ミラー (http://cran.r-project.org/mirrors.html) を利用してください。
ソースの tar ファイルを展開します。
デフォルトの 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"
パフォーマンスを向上させたい場合は、次のオプションをコマンドラインに追加します。
$ export CFLAGS="-O3 -ipo -openmp -xHost"
$ export CXXFLAGS="-O3 -ipo -openmp -xHost"Linux* オペレーティング・システムの場合、R でインテル® マス・カーネル・ライブラリー (インテル® MKL) のマルチスレッド・バージョンを使用するには、次のコマンドを実行し、コマンドを入力したときに正しいインテル® MKL ライブラリーの場所が表示されることを確認します。
$ MKL="-lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
$ echo $MKLR プログラミング言語用のビルド環境を設定して、R オブジェクトを関連ディレクトリーにインストールします。
$ sudo ./configure --with-blas="$MKL" --with-lapack
$ sudo make && sudo make installR ディレクトリーに移動して R 実行ファイルを起動し、基本的なコマンドを入力して最小限のプログラムの正当性を検証します。
$ file bin/R
$ . bin/R
$ > y <- log(5)
$ > yR で log(5) 関数を実行して値を内部値 ‘y’ に割り当てると、結果が stdout に表示されます。値は ‘[1] 1.609438’ になります。
インテル® コンパイラーを使用して R をコンパイルします。ここでは、「Extending R with Intel MKL」(http://software.intel.com/en-us/articles/extending-r-with-intel-mkl) の記事と同じ R ラッパーコード (pow_wrp.c) を使用します。
インテル® 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インテル® コンパイラーのツール (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
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。