сборка R из исходного кода: ссылки на разделяемые библиотеки не удались

Уже больше недели ломаю голову, ответа на свой вопрос нет. Я хочу собрать R из крана с помощью Intel MKL1 в качестве общей библиотеки. Вот небольшой скрипт, который я использую для проверки своей конфигурации:

#! /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

Этот небольшой скрипт делает следующее:

  1. собрать R с gcc и gfortran на x86_64
  2. собрать R с потоками gnu
  3. экспортировать путь к библиотекам Intel MKL
  4. динамически связать BLAS с Intel MKL

Теперь та часть, где я начинаю злиться. В одной системе, Archlinux, сборка позволит мне получить следующий вывод из ldd, запущенного внутри каталога сборки.

$ 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)
.......

Это именно то, что я ищу. Теперь тот же скрипт с Intel 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)
......

Как видно, вообще не ссылки на Intel MKL.

Я играл со всеми видами опций make, с LD_PATHS, с опциями компоновщика и т. д.; Я проверил переменные среды; Я проверил кеш ldconfig; и т.д. По-прежнему невозможно получить правильную связь с Fedora.

Буду признателен за любые подсказки, где искать причину моей проблемы.


person gabx    schedule 27.09.2015    source источник


Ответы (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. скрипт написан для Parallel studio 2016. Измените путь соответственно, если composerxe 2015.
  2. libRlib и libRblas могут быть собраны как общие или статические библиотеки.
  3. Дополнительные параметры могут быть добавлены для настройки.
  4. Лучше всего использовать mklvars и компиляторы в скрипте, чтобы он не загрязнял вашу среду оболочки после завершения сборки.
person gabx    schedule 01.10.2015