2015-09-27 52 views
1

我一直在撓頭,超過一個星期,沒有回答我的問題。 我想構建R來自cran源與英特爾MKL1作爲共享庫。下面是我用它來測試我的配置小腳本:從源代碼構建R:指向共享庫的鏈接失敗

#! /bin/sh 
export MKL=/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl 
MKL=" -L${_mkllibpath} \ 
-Wl,--start-group \ 
    -lmkl_gf_lp64 \ 
    -lmkl_gnu_thread \ 
    -lmkl_core \ 
-Wl,--end-group \ 
-lgomp -lpthread" 

./configure --prefix=/usr \ 
--libdir=/usr/lib \ 
--datarootdir=/usr/share \ 
rsharedir=/usr/share/R/ \ 
rincludedir=/usr/include/R/ \ 
rdocdir=/usr/share/doc/R/ \ 
--with-blas="${MKL}" \ 
--with-lapack \ 
--enable-R-shlib 

make -j4 

這個小腳本執行以下操作:在x86_64用gcc和gfortran

  1. 構建[R
  2. 構建R 2與GNU螺紋
  3. 導出英特爾MKL庫的路徑
  4. 將BLAS動態鏈接到英特爾MKL

現在我開始生氣的部分。 在一個系統上,的Archlinux,構建會讓我用下面的輸出LDD build目錄

$ ldd bin/exec/R 
..... 
libmkl_gf_lp64.so => /opt/intel/mkl/lib/intel64/libmkl_gf_lp64.so (0x00007f7707797000) 
libmkl_core.so => /opt/intel/mkl/lib/intel64/libmkl_core.so (0x00007f7705c2a000) 
libmkl_gnu_thread.so => /opt/intel/mkl/lib/intel64/libmkl_gnu_thread.so (0x00007f7704ed3000) 
libimf.so => /opt/intel/lib/libimf.so (0x00007f7704814000) 
libintlc.so.5 => /opt/intel/lib/libintlc.so.5 (0x00007f770284b000) 
....... 

這正是我期待的衝了進去。現在,與安裝在同一路徑上的英特爾MKL相同的腳本,運行在Fedora22上。

$ ldd bin/exec/R 
linux-vdso.so.1 (0x00007ffe9a9c5000) 
libR.so => /usr/lib64/R/lib/libR.so (0x00007f45d9b69000) 
libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f45d9947000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f45d972a000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f45d936a000) 
libblas.so.3 => /lib64/libblas.so.3 (0x00007f45d9111000) 
libgfortran.so.3 => /lib64/libgfortran.so.3 (0x00007f45d8de5000) 
...... 

正如所看到的,根本不是鏈接到英特爾MKL。

我玩過各種make選項,帶LD_PATHS,帶連接器選項等;我檢查了環境變量;我檢查過ldconfig緩存;等等。仍然無法與Fedora正確連接。

我將不勝感激任何提示,在哪裏尋找我的問題的根源。

回答

1

多次嘗試後,下面是正確的腳本構建R-CRAN採用Intel MKL和ICC:

#! /bin/sh 

source /opt/intel/compilers_and_libraries_2016.0.109/linux/bin/mklvars intel64 
source /opt/intel/bin/compilervars.sh intel64 
_icclibpath=/opt/intel/compilers_and_libraries_2016.0.109/linux/compiler/intel64/      
_mkllibpath=${MKLROOT}/lib/intel64/ 
MKL=" -L${_mkllibpath} -lmkl_rt -lpthread" 

export CC="icc" 
export CXX="icpc" 
export AR="xiar" 
export LD="xild" 
export F77="ifort" 

export CFLAGS="-g -O3 -xHost -I${MKLROOT}/include" 
export CXXFLAGS="-g -O3 -xHost -I${MKLROOT}/include" 
export FFLAGS="-I${MKLROOT}/include" 
export FCFLAGS="-I${MKLROOT}/include" 

# shared libs 
./configure --with-blas="${MKL}" --enable-R-shlib --enable-BLAS-shlib 
# static libs 
#./configure --with-blas="${MKL}" --with-lapack 

make -j4 

注:

  1. 腳本writen並行工作室2016年更改路徑 因此如果composerxe 2015.
  2. libRlib和libRblas可以構建爲共享或靜態庫。
  3. 可以添加更多選項進行配置。
  4. 最好的方法是在腳本中輸入mklvars和compilervars,這樣一旦構建完成,它就不會污染你的shell環境。