2015-05-05 40 views
4

我需要在$ HOME(群集应用程序,并且不能在每个计算节点上安装)作为本地库的armadillo(当前版本为5.100.1)但$ HOME是共享文件夹)。我使用cmake来管理应用程序,并且已经能够将cmake链接到$ HOME中的本地库(例如boost),而不是其他地方。犰狳需要BLAS和LAPACK,尽管它可以使用(并且实际上建议这样)OpenBLAS。但是,我不明白如何强制犰狳使用OpenBLAS,即使它自己的cmake .configure确认它已经找到OpenBLAS。下面是从运行./configure在一个纯净的犰狳文件夹中的输出:如何在编译过程中强制armadillo库链接到本地​​OpenBLAS

$ ./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的副本,而不是BLAS的标准拷贝,并在/ usr/lib64下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. 

但是从上面的结果,这似乎并不如此。任何人都可以指出我在这里做错了吗?

+0

嗯,我没有找到一个答案,OpenBLAS问题,但因为我有股票libblas .so和liblapack.so放在$ {HOME}/lib中我至少可以通过在armadillo源文件夹中向cmake提供以下内容:cmake -DLAPACK_LIBRARY =“$ {HOME} /lib/liblapack.so”-DBLAS_LIBRARY =“$ {HOME} /lib/libblas.so”。 – Rolf

+0

如果我移动$ {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

回答

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} 

或者,你可以在编译期间链接静态(见克-static开关++)

相关问题