如何在编译期间强制armadillo库链接到本地​​OpenBLAS

时间:2015-05-05 16:32:05

标签: armadillo openblas

我需要将armadillo(当前版本为5.100.1)作为$ HOME(集群应用程序中的本地库)提供,并且无法在每个计算节点上安装,但$ HOME是共享文件夹。我使用cmake来管理应用程序,并且能够让cmake链接到$ HOME中的本地库(例如,boost),而不是其他地方。犰狳需要BLAS和LAPACK,虽然它可以使用(并且事实上建议)OpenBLAS。但是,我不明白如何强迫犰狳使用OpenBLAS,即使它自己的cmake .configure确认它已经找到了OpenBLAS。这是在pristine armadillo文件夹上运行./configure的输出:

$ ./configure
-- Configuring Armadillo 5.100.1
-- CMAKE_SYSTEM_NAME          = Linux
-- CMAKE_CXX_COMPILER_ID      = GNU
-- CMAKE_CXX_COMPILER_VERSION = 4.9.1
-- CMAKE_COMPILER_IS_GNUCXX   = 1
-- Found MKL libraries: /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_rt.so
-- Found OpenBLAS: /home/rolf/lib/libopenblas.so
-- Found BLAS: /usr/lib64/libblas.so
-- Found LAPACK: /usr/lib64/liblapack.so
--      MKL_FOUND = YES
--   ACMLMP_FOUND = NO
--     ACML_FOUND = NO
-- OpenBLAS_FOUND = YES
--    ATLAS_FOUND = NO
--     BLAS_FOUND = YES
--   LAPACK_FOUND = YES
-- 
-- *** If the MKL or ACML libraries are installed in non-standard locations such as
-- *** /opt/intel/mkl, /opt/intel/composerxe/, /usr/local/intel/mkl
-- *** make sure the run-time linker can find them.
-- *** On Linux systems this can be done by editing /etc/ld.so.conf
-- *** or modifying the LD_LIBRARY_PATH environment variable.
-- 
-- *** On systems with SELinux enabled (eg. Fedora, RHEL),
-- *** you may need to change the SELinux type of all MKL/ACML libraries
-- *** to fix permission problems that may occur during run-time.
-- *** See README.txt for more information
-- 
-- Found ARPACK: /usr/lib64/libarpack.so
-- ARPACK_FOUND = YES
-- Could not find SuperLU
-- SuperLU_FOUND = NO
-- 
-- *** Armadillo wrapper library will use the following libraries:
-- *** ARMA_LIBS = /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_rt.so;/usr/lib64/libarpack.so
-- 
-- Detected gcc 4.8.3 or later. Added '-std=c++11' to compiler flags
-- Copying /home/rolf/work/pdefect/armadillo/include/ to /home/rolf/work/pdefect/armadillo/tmp/include/
-- Generating /home/rolf/work/pdefect/armadillo/tmp/include/config.hpp
-- Generating /home/rolf/work/pdefect/armadillo/examples/Makefile
-- CMAKE_CXX_FLAGS           =  -std=c++11 -O2
-- CMAKE_SHARED_LINKER_FLAGS =  -Wl,--no-as-needed
-- CMAKE_REQUIRED_INCLUDES   = 
-- *** CMAKE_INSTALL_PREFIX was initalised by cmake to the default value of /usr/local
-- *** CMAKE_INSTALL_PREFIX changed to /usr
-- *** Detected 64 bit system
-- *** /usr/lib64/ exists, so destination directory for the run-time library changed to /usr/lib64/
-- *** Your system and/or compiler must search /usr/lib64/ during linking
-- CMAKE_INSTALL_PREFIX = /usr
-- INSTALL_LIB_DIR      = /usr/lib64
-- INSTALL_INCLUDE_DIR  = /usr/include
-- INSTALL_DATA_DIR     = /usr/share
-- INSTALL_BIN_DIR      = /usr/bin
-- Generating '/home/rolf/work/pdefect/armadillo/ArmadilloConfig.cmake'
-- Generating '/home/rolf/work/pdefect/armadillo/ArmadilloConfigVersion.cmake'
-- Generating '/home/rolf/work/pdefect/armadillo/InstallFiles/ArmadilloConfig.cmake'
-- Generating '/home/rolf/work/pdefect/armadillo/InstallFiles/ArmadilloConfigVersion.cmake'
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rolf/work/pdefect/armadillo

所以它成功地在$ HOME中找到它,但是如果我在

之后查询库的共享库链接
$ cmake .
$ make

我发现它已链接到登录节点的BLAS和LAPACK的标准副本,但没有使用OpenBLAS:

$ ldd libarmadillo.so.5.100.1
        linux-vdso.so.1 =>  (0x00007fff05b9b000)
        libmkl_rt.so => /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_rt.so (0x00007f14d2558000)
        libarpack.so.2 => /home/rolf/lib/libarpack.so.2 (0x00007f14d230a000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f14d1fe9000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f14d1d64000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f14d1b4e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f14d17ba000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003d83400000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f14d15b5000)
        libblas.so.3 => /usr/lib64/libblas.so.3 (0x00007f14d135e000)
        liblapack.so.3 => /usr/lib64/atlas/liblapack.so.3 (0x00007f14d0b3d000)
        libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007f14d084a000)
        libf77blas.so.3 => /usr/lib64/atlas/libf77blas.so.3 (0x00007f14d062d000)
        libcblas.so.3 => /usr/lib64/atlas/libcblas.so.3 (0x00007f14d040c000)
        libatlas.so.3 => /usr/lib64/atlas/libatlas.so.3 (0x00007f14cfcfe000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f14cfae1000)

不幸的是,libblas.so.3和liblapack.so.3在节点上不可用:

$ ssh node01 'ldd  /home/rolf/work/pdefect/armadillo/libarmadillo.so.5.100.1 | grep "not found" '
    libblas.so.3 => not found
    liblapack.so.3 => not found

如何强制犰狳编译并链接到我的本地OpenBLAS副本,而不是/ usr / lib64中BLAS和LAPACK的标准副本。 faq中有一条说明

的说明
*  For Linux-based systems the automatic installer can figure out that
OpenBLAS, MKL, ACML or ATLAS are installed, and will use them instead of
the standard LAPACK and BLAS libraries. See README.txt within the Armadillo
archive for more information. 

但从上述结果来看,情况似乎并非如此。谁能指出我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

你可以告诉犰狳直接使用你想要的任何BLAS和LAPACK,以及它们的位置。在包含armadillo标题之前,您需要定义ARMA_DONT_USE_WRAPPER,然后链接到您拥有的任何BLAS和LAPACK。

例如:

g++ code.cpp -o code -O3 -DARMA_DONT_USE_WRAPPER -L/home/abc/libs -lmyblas -lmylapack

/home/abc/libs替换为包含您的库的目录。将-lmyblas -lmylapack更改为任何库/库实现BLAS和LAPACK函数(例如:-lopenblas

请记住,系统链接器还需要找到您的库。您可能需要设置LD_LIBRARY_PATH环境变量。例如:

export LD_LIBRARY_PATH=/home/abc/libs:${LD_LIBRARY_PATH}

或者,您可以在编译期间静态链接(请参阅g ++中的-static开关)