问题
我需要使用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
当我在每个案例的configure脚本的输出上运行diff时,没有出现任何奇怪的内容:
753c753
< Options enabled: R profiling
---
> Options enabled: shared R library, R profiling
我试图包含make命令的完整输出,但它超出了允许的最大字符数,并且使用pastebin在SO时不是一个好习惯。
如果您觉得缺少信息可以帮助您引导我朝着正确的方向发展,请告诉我。
谢谢!
答案 0 :(得分:0)
我一直在编译R对抗MKL,这是一个挑战。我还没有在ubuntu上做过,但是从你的配置中我发现了四件事:
使用icc针对mkl进行编译,通常需要在其中一个mkl目录中获取shell脚本,以将一堆环境变量设置为正确的动态库搜索路径。我不明白你在做这个吗?
通过链接libmkl_rt,您可以更轻松地实现 lot 。 我的配置行(用于gcc)使用
- 与-BLAS =&#34; mkl_rt&#34; --with-lapack BLAS_LIBS =&#34; -lmkl_rt -liomp5 -lpthread&#34;
您尝试使用编译器指令启用openmp而不发送--enable-openmp进行配置。
您正在将icc与gfortran混合,而不是为gfortran设置链接指令或库列表。除非重新编译,否则MKL可能不会与gfortran链接 - 英特尔的一些文档说重新编译是必要的;我无法从他们那里得到答案。 gfortran与你的指令似乎并不知道你希望它是多线程的,它可能不知道如何找到库。
答案 1 :(得分:0)
将以下内容添加到脚本中为我解决了这个问题:
export MAIN_LDFLAGS='-openmp'
其他一切都保持不变。
希望这对其他人有用。