【问题标题】:Compiling R 3.1.1 using Intel MKL: --enable-R-shlib triggers undefined reference to symbol error使用英特尔 MKL 编译 R 3.1.1:--enable-R-shlib 触发未定义的符号引用错误
【发布时间】:2014-09-04 15:19:08
【问题描述】:

问题

我需要使用 ICC/MKL (Composer XE 2013 SP 1.3.174) 编译带有共享库 (--enable-R-shlib) 的 R 3.1.1,以便使用特定的 IDE (rstudio),并且我正在运行遇到麻烦了。


上下文

关于我的平台的一些信息:

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)

我之前有一个使用 ICC/MKL (Composer XE 2013 SP 1.3.174) 编译的 R 3.1.1(没有共享库)的工作安装,如下所示:

$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

当我运行上面的命令时,编译成功并且在进程结束时 log_make_err 为空。


正如我一开始所说,我现在需要使用共享库(--enable-R-shlib)编译 R。因此,我尝试使用与以前完全相同的命令(同一台计算机)并将配置行更改为:

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

这给出了以下输出:

  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

在这种情况下,编译不成功,log_make_err 包含以下内容

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

当我对每种情况的配置脚本的输出运行 diff 时,没有什么奇怪的现象出现:

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

我尝试包含 make 命令的完整输出,但它超过了允许的最大字符数,并且在 SO 中使用 pastebin 不是一个好习惯。

如果您觉得缺少可以帮助您引导我走向正确方向的信息,请告诉我。

谢谢!

【问题讨论】:

    标签: r openmp icc intel-mkl


    【解决方案1】:

    我一直在针对 MKL 编译 R,这是一个挑战。我没有在 ubuntu 上做过,但是从你的配置中我突然想到了四件事:

    1. 使用 icc 针对 mkl 进行编译,您通常必须在其中一个 mkl 目录中获取 shell 脚本,以将一堆环境变量设置为正确的动态库搜索路径。我没看到你在做这个?

    2. 您可以通过链接 libmkl_rt 让您的生活变得轻松很多。 我的配置行(用于 gcc)使用

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

    3. 您正在尝试使用编译器指令启用 openmp,而不发送 --enable-openmp 进行配置。

    4. 您将 icc 与 gfortran 混合使用,而不是为 gfortran 设置链接指令或库列表。除非重新编译,否则 MKL 可能不会链接到 gfortran——英特尔的一些文档说重新编译是必要的;我无法从他们那里得到直接的答案。带有指令的 gfortran 似乎不知道您希望它是多线程的,并且它可能不知道如何查找库。

    【讨论】:

      【解决方案2】:

      在脚本中添加以下内容为我解决了这个问题:

      export MAIN_LDFLAGS='-openmp'
      

      其他一切都保持不变。

      希望这对其他人有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多