简体   繁体   中英

Compiling R 3.1.1 using Intel MKL: --enable-R-shlib triggers undefined reference to symbol error

Problem

I need to compile R 3.1.1 with shared library (--enable-R-shlib) with ICC/MKL (Composer XE 2013 SP 1.3.174) in order to use a specific IDE (rstudio) and I am running into trouble.


Context

Some information about my platform:

OS: Ubuntu 14.04.1 LTS
Kernel: 3.13.0-30
Compiler: Intel ICC (Composer XE 2013 SP 1.3.174)
MKL: Intel MKL (Composer XE 2013 SP 1.3.174)

I previously had a working installation of R 3.1.1 (without shared library) compiled with ICC/MKL (Composer XE 2013 SP 1.3.174) as follows:

$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 -multiple-processes"
$export CXXFLAGS="-O3 -ipo -openmp -xHost -multiple-processes"
$export MKL="-lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
$./configure --with-lapack --with-blas="$MKL" --build="x86_64-linux-gnu" --host="x86_64-linux-gnu" > log_cfg
$make > log_make_out 2> log_make_err
#make install

When I run the commands above the compilation is successful and log_make_err is empty at the end of the process.


As I said in the beginning, I now need to compile R with shared library (--enable-R-shlib). Therefore, I tried to use the exact same commands as before (same computer) and changed the configure line to:

$./configure --with-lapack --with-blas="$MKL" --build="x86_64-linux-gnu" --host="x86_64-linux-gnu" --enable-R-shlib

This gives the following output:

  R is now configured for x86_64-pc-linux-gnu

  Source directory:          .
  Installation directory:    /usr/local

  C compiler:                icc -std=gnu99  -O3 -ipo -openmp -xHost -multiple-processes
  Fortran 77 compiler:       gfortran  -g -O2

  C++ compiler:              icpc  -O3 -ipo -openmp -xHost -multiple-processes
  C++ 11 compiler:           icpc  -std=c++11 -O3 -ipo -openmp -xHost -multiple-processes
  Fortran 90/95 compiler:    x86_64-linux-gnu-gfortran -g -O2
  Obj-C compiler:        x86_64-linux-gnu-gcc 

  Interfaces supported:      X11, tcltk
  External libraries:        readline, BLAS(generic), LAPACK(in blas), lzma
  Additional capabilities:   PNG, JPEG, TIFF, NLS, cairo
  Options enabled:           shared R library, R profiling

  Recommended packages:      yes

In this case, the compilation is not successful and log_make_err contains the following :

ld: /tmp/ipo_iccUpPSPh.o: undefined reference to symbol '__kmpc_end@@VERSION'
/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/libiomp5.so: error adding symbols: DSO missing from command line
make[3]: *** [R.bin] Error 1
make[2]: *** [R] Error 2
make[1]: *** [R] Error 1
make: *** [R] Error 1

When I run diff on the output of the configure script for each case, nothing strange shows up:

753c753
<   Options enabled:           R profiling
---
>   Options enabled:           shared R library, R profiling

I tried to include the full output of the make command but it exceeds the maximum number of characters allowed and using pastebin is not a good practice at SO.

Let me know if you feel like there is information missing that could help you lead me in the right direction.

Thanks!

I've been compiling R against MKL, and its a challenge. I haven't been doing it on ubuntu, but from your configuration four things leap out at me:

  1. Using icc to compile against mkl, you usually have to source a shell script in one of the mkl directories to set a bunch of environment variables to the correct dynamic library search paths. I don't see that you're doing this?

  2. You can make your life a lot easier by linking against libmkl_rt. My configure line (which is for gcc) uses

    --with-blas="mkl_rt" --with-lapack BLAS_LIBS="-lmkl_rt -liomp5 -lpthread"

  3. You're trying to enable openmp with compiler directives without sending --enable-openmp to configure.

  4. You're mixing icc with gfortran, and not setting a link directive or library list for gfortran. MKL may not link against gfortran unless its recompiled -- some of Intel's documentation says recompilation is necessary; I can't get a straight answer from them. gfortran with your directives doesn't seem to know that you want it to be multi-threaded, and it may not know how to find libraries.

Adding the following to the script solved it for me:

export MAIN_LDFLAGS='-openmp'

Everything else stayed the same.

Hopefully this will be useful to someone else.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM