1

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

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

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

4

2 回答 2

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.

介绍

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  
    

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

      $ cd bulid2
      $ cmake .. -DITPP_SHARED_LIB=off
      $ make
      $ make install
    

在 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.

使用 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;
  }

现在编译期间最重要的事情是-litpp在所有文件之后始终使用 switch。

$ g++ testITPP.cpp -litpp
$./a.out 
Hello, World! 
The sum of first 100 integers is: 5050

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



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

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

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

一世。使用 Basic 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 

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

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

希望其他人会编写 Windows/Visual-Studio 安装指南。

于 2016-12-10T16:15:07.207 回答
0

我想你可能想要这样的东西?

sudo apt-get install libitpp-dev libitpp8v5

它正在使用基本的ubuntu安装过程。我正在使用 ubuntu 18.04 LTS。

于 2019-06-14T12:10:13.727 回答