在 Linux/Windows 上快速轻松地安装和使用 IT++ 库?

Lov*_*ity 1 installation numerical-computing

IT++是一个流行的 GPL 库(建议是 LGPL,但目前没有迹象)用于科学计算,尤其是在电信领域。这是同事推荐给我的。

在我的 Linux/Windows 系统上安装这个库看起来很难。和安装指南似乎很难。

除了花时间在这个安装上之外,我还有很多事情要做。任何人都可以通过一些快速安装来节省我的时间,如果可能的话,一些你好,世界!输入说明?

Lov*_*ity 5

TL; 博士

 $ wget https://sourceforge.net/projects/itpp/files/latest -O itpp.tar.bz2
 $ tar -xjvf itpp.tar.bz2 && cd itpp-*
 $ sudo apt-get install liblapack-dev libblas-dev libfftw3-dev
                 # Note: This is basic and recommended. MKL/ATLAS etc are
                 # platform-specialized, can give slightly better perf.

 $ mkdir build1 build2

 $ cd build1                   # DYNAMIC (*.so file)  
 $ cmake ..  
 $ make  
 $ make install  

 $ cd bulid2                   # STATIC (*.a file)
 $ cmake .. -DITPP_SHARED_LIB=off
 $ make
 $ make install

 # Note: The library installation is complete and is ready for both
 # static and dynamic compilations. But the subsequent run of a 
 # *static compilation* is relatively more difficult, see details below.
Run Code Online (Sandbox Code Playgroud)

介绍

IT++,是一个功能强大的数值计算库,深受通信理论研究人员的欢迎,提供与矩阵相关的结构。虽然其他矩阵库相对较新的 Eigen 等越来越受欢迎,但与 MATLAB 相比,它仍然因其美观优雅的界面而继续使用。它还通过 Mex 例程提供与 MATLAB 的接口。我用它所有的时间。

安装 - 序幕

不幸的是,即使安装说明看起来足够完整,但我在我自己的同事中发现,对于初学者来说,这是非常痛苦的。我认为的原因是它不适合初学者。我真诚地希望这篇文章能够弥合差距。

我认为安装中的主要混淆源是由于它对 BLAS、LAPACK 和 FFTW 的依赖,与可选的、供应商特定版本的 BLAS/LAPACK/FFTW(例如 MKL、ATLAS、ACML 库)一起被提及增加了对实际要做的事情的困惑。

事实是,这些令人困惑的位中的大多数都是可选的!

我建议先尝试以下快速说明,然后忽略其他所有内容。

ubuntu 安装说明

  1. 下载 IT++ 存档文件
    $ wget https://sourceforge.net/projects/itpp/files/latest -O itpp.tar.bz2

  2. 提取和更改目录
    $ tar -xjvf itpp.tar.bz2 && cd itpp-*

  3. 创建新的子目录“build1”和“build2”(我们将cd在接下来的步骤中创建它们) $ mkdir build1 build2

  4. 确保你有 LAPACK、BLAS、FFTW 库。顺便说一句,这不应该影响后面的阶段。
    $ sudo apt-get install liblapack-dev libblas-dev libfftw3-dev

这里有一个重要的警告:通常所说的更有效的选择是使用处理器的供应商特定库,例如Intel 的 MKLAMD 的 ACMLATLAS。但是这种效率是有代价的——您需要花费大量时间来注册(对于 MKL)、下载、安装,并最终调整链接器开关以在每次编译和运行时包含它们。

  1. 主要安装步骤:
    执行以下两个步骤。没有坏处,而且我个人认为 IT++ 应该将两者都安装为默认选项。仅仅是因为,您永远不知道将来什么时候需要静态编译。这就是为什么几乎所有其他库都在您的 PC 上安装这两个版本的原因。

    A.作为共享库 (*.so 文件)

      $ cd build1  
      $ cmake ..  
      $ make  
      $ make install  
    
    Run Code Online (Sandbox Code Playgroud)

    B.作为静态库 (*.a 文件)

      $ cd bulid2
      $ cmake .. -DITPP_SHARED_LIB=off
      $ make
      $ make install
    
    Run Code Online (Sandbox Code Playgroud)

在 cmake 期间,您可能会遇到以下错误,但在成功运行单个 IT++ 程序之前,它们不会影响后期阶段。所以请忽略它们。将来,更高版本可能会将它们声明/更正为错误。当前版本是 4.3.1。

     CMake Warning at CMakeLists.txt:192 (message):
        BLAS library not found.

     CMake Warning at CMakeLists.txt:196 (message):
        LAPACK library not found.

     CMake Warning at CMakeLists.txt:200 (message):
        FFT library not found.
Run Code Online (Sandbox Code Playgroud)

使用 Hello,World! 测试您的安装!

考虑下面的示例程序 testITPP.cpp

  #include<iostream>
  using namespace std;
  #include<itpp/itbase.h>
  using namespace itpp;

  int main()
  {
    vec x(100); // vec == Vec<double>
    double y;
    x=linspace(1,100,100);
    y=sum(x);
    cout<<"Hello, World! \n The sum of first 100 integers is: "<<y<<endl;
  }
Run Code Online (Sandbox Code Playgroud)

现在编译过程中最重要的事情是-litpp在所有文件之后一直使用switch。

$ g++ testITPP.cpp -litpp
$./a.out 
Hello, World! 
The sum of first 100 integers is: 5050
Run Code Online (Sandbox Code Playgroud)

如果./a.out产生错误,请运行sudo ldconfig一次以刷新库缓存。



额外:与静态编译的斗争:

请注意,较早的编译默认使用共享库并生成依赖于 PC 上太多其他二进制文件的二进制文件。即,上面的二进制文件a.out不能在另一个没有安装 IT++ 的 unix 系统上运行,例如这经常会产生问题,尤其是在提交给大学集群和服务器时,允许用户执行繁重和长时间的计算。

解决方法是使用静态编译,摆脱所有本地依赖项。但这对于初学者来说通常是困难的。使用 MKL 类库下的 IT++,只知道如何进行静态编译确实令人沮丧。下面是对如何做以及我今天注意到的所有错误的一个很好的总结。

一世。使用基本 BLAS/LAPACK/FFTW 进行静态编译:

这是最简单的情况。需要注意两个特别重要的变化。一个-litpp变成-litpp_static。二、新建编译开关-static。第一个是 IT++ 奇怪选择将二进制文件命名为 libitpp.so 和 libitpp_static.a 的结果。

此外,与动态编译不同,静态编译可能必须包含除 C++ 标准库(即 -lc 和 -lm)之外的所有库。这主要包括-lblas -llapack -lfftw -lpthread-ldl

因此,以下方法之一可能适用于您的情况:

$ g++ -static testITPP.cpp -litpp_static
 OR
$ g++ -static testITPP.cpp -litpp_static -llapack -lblas -lpthread
 OR
$ g++ sctest_PCCestimates.cpp -litpp_static \
       -llapack -lblas -lgomp -lpthread \
       -lgfortran -static -Wl,--allow-multiple-definition 
Run Code Online (Sandbox Code Playgroud)

ii. 使用 MKL 的 BLAS/LAPACK/FFTW 进行静态编译:

虽然我还没有看到使用 MKL 的供应商特定库有多快,但静态编译可能真的很痛苦。MKL 的初始安装对我来说花了一个多小时。尽管确切的说明不适用于其他供应商库,但它应该能让您为即将面临的实际挑战做好准备。

您遇到的错误消息无法理解以下大部分内容。因此,他们会非常烦人,而且很难解决。我试图在下面列出所有这些。希望他们能节省您大量的宝贵时间。

  1. 编译时循环依赖:前几个库可能需要用-Wl,--start-group .... -Wl,--end-group.

  2. 使用特定于供应商的 blas/lapack/fftw,您可能需要在特定于供应商的库中搜索它们各自libblas.a liblapack.a libfftw.a或等效的位置libmkl_core.a。必须使用开关提供目录位置-L/path/to/statics/

  3. segmentation fault即使在成功编译之后,也可能会遇到A。这个烦人的问题的原因似乎libpthread.a是没有完全包括在内。那么你需要强制采取适当行动,通过围绕开关-lpthread-Wl,--whole-archive -lpthread -Wl,--no-whole-archive

最后,在 Ubuntu 16.04 上对我有用的版本是这个。请注意,没有-llapack -lblas -lfftwetc,因为它们捆绑在不同命名的静态二进制文件下。

$ g++ -static \  
        -L/opt/intel/compilers_and_libraries/linux/mkl/lib/intel64_lin/  
       testITPP.cpp  
        -Wl,--start-group \
        -litpp_static \
        -lmkl_intel_lp64 \
        -lmkl_sequential \
        -lmkl_core  -Wl,--end-group \
        -Wl,--whole-archive -lpthread -Wl,--no-whole-archive \
        -ldl
Run Code Online (Sandbox Code Playgroud)

最后,尽管您在上面成功生成了静态二进制文件,您可能会收到一条警告说 warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking可能会出现但可以忽略,因为显然没有解决方案!这与我们不必关心的普遍已知的问题有关。

希望其他人能写一份 Windows/Visual-Studio 安装指南。