Using Intel® MKL with R


R is a programming language for statistical computing. The open source package also provides an environment for creating and running R programs. This guide will show how to use the BLAS and LAPACK libraries within Intel® Math Kernel Library (Intel® MKL) to improve the performance of R. To use other Intel MKL functions, you read this article on Extending R with Intel MKL.



Build R use with Intel MKL

R can be configured to use the Intel MKL BLAS and LAPACK by using --with-blas.

If you are building R with GNU gcc and GNU gfortran, to use the GNU OpenMP* threaded version of Intel MKL in R on a Linux operating system add the following:

source /opt/intel/mkl/bin/ 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

The order of the libraries is important. --with-lapack will cause the LAPACK from Intel MKL to be used as well.

The intel MKL libraries link line actually is varied based on different compiler and threading model.  Developer can select the right libraries by the tool named Intel MKL Link Advisor to suit their own needs

( MKL Link Advisor webpage version:

Here are some other variations:

A: If you are building R with Intel C/C++ Compiler icc and Intel Fortran Compiler ifort, then please use 

source /opt/intel/ intel64/ 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 


source /opt/intel/ intel64/ intel64

MKL="-Wl,--no-as-needed   -lmkl_rt  -liomp5 -lpthread  -lm"

	./configure --with-blas="$MKL" --with-lapack 

The default number of threads will equal the number of physical cores on the system, but can be controlled by setting OMP_NUM_THREADS or MKL_NUM_THREADS.

B. You can use the following if you want to use a sequential version of Intel MKL and GNU GFORTRAN and GCC:

source /opt/intel/ intel64

MKL=" -L$(MKLROOT)/lib/intel64                       \

      -Wl,--start-group                         \

          -lmkl_gf_lp64       \

          -lmkl_sequential    \

          -lmkl_core          \



C. The following will link Intel MKL statically the GNU threading runtime:

source /opt/intel/ 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"

Check if MKL is working

Check the config.log to see if MKL was working, 

configure:29075: checking for dgemm_ in -L/opt/intel/compilers_and_libraries_2018.0.128/linux/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/compilers_and_libraries_2018.0.128/linux/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

Or after build, If MKL library was dynamically linked in the R, type the simple command to verify this


$ ldd  ./R-3.4.2/lib/
 =>  (0x00007fffa45ff000)
 => /opt/intel/compilers_and_libraries_2018.0.128/linux/mkl/lib/intel64/ (0x00007fe963097000)


Performance Results

To provide some indication of the performance improvements that this can provide, I ran R-benchmark-25.R found on the R benchmarks site on a system with a 32-core Intel® Core™ i7-975 processor Extreme Edition processor (8MB LLC, 3.33GHz) with 6GB of RAM and running RHEL 6 x86_64. I first installed R-2.15.3 and ran the benchmark without Intel MKL. to get:

175.825 sec

After installing Intel MKL 11.0 update 2, and following the methods above I was able to get:

17.289 sec

Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.