如何在编译时强制使用本地OpenBLAS库链接Armadillo库

6

我需要将armadillo(当前版本为5.100.1)作为本地库在$HOME中使用(集群应用程序,无法在每个计算节点上安装,但$HOME是共享文件夹)。 我正在使用cmake管理应用程序,并已成功使cmake链接到$HOME中的本地库(例如boost),而不是其他位置。 Armadillo需要BLAS和LAPACK,尽管它可以使用(实际上建议如此)OpenBLAS来执行两者。 但是,我不知道如何强制armadillo即使其自己的cmake .configure确认已找到OpenBLAS,也要使用OpenBLAS。 以下是在原始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

我该如何强制 Armadillo 编译并链接到我本地的 OpenBLAS,而不是 /usr/lib64 中的标准 BLAS 和 LAPACK 副本?在 常见问题解答 中有一条注释提到了这一点。
*  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. 

但是从上面的结果来看,似乎并不是这种情况。有人可以指出我在这里做错了什么吗?

好的,我没有找到关于OpenBLAS问题的答案,但是由于我在${HOME}/lib中有库存的libblas.so和liblapack.so,因此我至少可以通过在armadillo源文件夹中提供以下内容来指向这些内容:cmake -DLAPACK_LIBRARY="${HOME}/lib/liblapack.so" -DBLAS_LIBRARY="${HOME}/lib/libblas.so"。 - Rolf
如果我将 ${HOME}/libblas* 移开,然后执行 cmake -DLAPACK_LIBRARY="${HOME}/lib/liblapack.so" -DOpenBLAS_LIBRARY="${HOME}/lib/libopenblas_sandybridgep-r0.2.14.so" -DBLAS_LIBRARY="${HOME}/lib/libopenblas_sandybridgep-r0.2.14.so" . ,cmake 将会在 ${HOME}/lib/libopenblas.so 的形式下找到 BLAS 和 OpenBLAS,但是它会使用系统的 BLAS... - Rolf
1个回答

3
您可以要求 Armadillo 直接使用您想要的 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开关)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接