快速无忧安装&在Linux / Windows上使用IT ++库?

时间:2016-12-10 16:15:07

标签: installation install numerical-computing

IT++是一个受欢迎的GPL库(proposed to be LGPL,但现在没有迹象表明)用于科学计算,特别是在电信领域。这是我的同事向我推荐的。

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

除了花时间在这个装置上,我还有很多其他工作要做。任何人都可以通过一些快速安装来节省一些时间,如果可能的话,还有一些你好,世界!类型的说明吗?

2 个答案:

答案 0 :(得分:2)

TL; DR

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

INTRO

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

安装 - 序言

不幸的是,即使installation instructions看起来足够完整,但对于初学者来说这是非常痛苦的,因为我在自己的同事中找到了。我认为这是因为它不适合初学者。我真诚地希望这篇文章能够缩小差距。

我认为安装中混淆的主要原因是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库。这不应该影响btw的后期阶段 $ sudo apt-get install liblapack-dev libblas-dev libfftw3-dev

  5. 这里有一个重要的警告:更多高效选项通常被认为是使用处理器的特定于供应商的库,例如Intel's MKLAMD's ACMLATLAS。但这种效率需要付出代价 - 你需要花费大量时间来注册(用于MKL),下载,安装,最后调整链接器开关,以便在每次编译和运行时都包含它们。

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

      一个。 作为共享库 (* .so文件)

        $ cd build1  
        $ cmake ..  
        $ make  
        $ make install  
      

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

        $ cd bulid2
        $ cmake .. -DITPP_SHARED_LIB=off
        $ make
        $ make install
      
    2. 在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切换。

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

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

      EXTRA:使用静态编译进行斗争:

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

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

      我。使用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&lt; 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. 提供目录位置
      4. 即使在成功编译之后,也可能遇到segmentation fault。这个恼人问题的原因似乎是libpthread.a并未完全包含在内。然后,您需要强制执行适当的操作,将开关-lpthread包围为-Wl,--whole-archive -lpthread -Wl,--no-whole-archive

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

        $ 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安装指南。

答案 1 :(得分:0)

我认为您可能想要这样的东西?

import React, { Component } from 'react';
import { View, Button } from 'react-native';

class Test extends Component {
    state = {
        gender: 'male',
        maleButtonColor: '#841584',
        femaleButtonColor: '#C0C0C0'
    }


    onSubmitEmailRP() {
        this.password.focus();
    }

    render() {
        return (
            <View>
                <Button
                    onPress={() => {
                        this.setState({
                            gender: 'male',
                            maleButtonColor: '#841584',
                            femaleButtonColor: '#C0C0C0'
                        })
                    }}
                    title="Male"
                    color="#841584"
                />
                <Button
                    onPress={() => {
                        this.setState({
                            gender: 'female',
                            maleButtonColor: '#C0C0C0',
                            femaleButtonColor: '#841584'
                        })
                    }}
                    title="Female"
                    color="#841584"
                />
            </View>);
    }
}

export default Test;

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