Lov*_*ity 1 installation numerical-computing
IT++是一个流行的 GPL 库(建议是 LGPL,但目前没有迹象)用于科学计算,尤其是在电信领域。这是同事推荐给我的。
在我的 Linux/Windows 系统上安装这个库看起来很难。和安装指南似乎很难。
除了花时间在这个安装上之外,我还有很多事情要做。任何人都可以通过一些快速安装来节省我的时间,如果可能的话,一些你好,世界!输入说明?
$ 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 库)一起被提及增加了对实际要做的事情的困惑。
事实是,这些令人困惑的位中的大多数都是可选的!
我建议先尝试以下快速说明,然后忽略其他所有内容。
下载 IT++ 存档文件
$ wget https://sourceforge.net/projects/itpp/files/latest -O itpp.tar.bz2
提取和更改目录
$ tar -xjvf itpp.tar.bz2 && cd itpp-*
创建新的子目录“build1”和“build2”(我们将cd在接下来的步骤中创建它们)
$ mkdir build1 build2
确保你有 LAPACK、BLAS、FFTW 库。顺便说一句,这不应该影响后面的阶段。
$ sudo apt-get install liblapack-dev libblas-dev libfftw3-dev
这里有一个重要的警告:通常所说的更有效的选择是使用处理器的供应商特定库,例如Intel 的 MKL、AMD 的 ACML、ATLAS。但是这种效率是有代价的——您需要花费大量时间来注册(对于 MKL)、下载、安装,并最终调整链接器开关以在每次编译和运行时包含它们。
主要安装步骤:
请执行以下两个步骤。没有坏处,而且我个人认为 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)
考虑下面的示例程序 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。
Run Code Online (Sandbox Code Playgroud)$ 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++,只知道如何进行静态编译确实令人沮丧。下面是对如何做以及我今天注意到的所有错误的一个很好的总结。
这是最简单的情况。需要注意两个特别重要的变化。一个-litpp变成-litpp_static。二、新建编译开关-static。第一个是 IT++ 奇怪选择将二进制文件命名为 libitpp.so 和 libitpp_static.a 的结果。
此外,与动态编译不同,静态编译可能必须包含除 C++ 标准库(即 -lc 和 -lm)之外的所有库。这主要包括-lblas -llapack -lfftw -lpthread和-ldl。
因此,以下方法之一可能适用于您的情况:
Run Code Online (Sandbox Code Playgroud)$ 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
虽然我还没有看到使用 MKL 的供应商特定库有多快,但静态编译可能真的很痛苦。MKL 的初始安装对我来说花了一个多小时。尽管确切的说明不适用于其他供应商库,但它应该能让您为即将面临的实际挑战做好准备。
您遇到的错误消息无法理解以下大部分内容。因此,他们会非常烦人,而且很难解决。我试图在下面列出所有这些。希望他们能节省您大量的宝贵时间。
编译时循环依赖:前几个库可能需要用-Wl,--start-group .... -Wl,--end-group.
使用特定于供应商的 blas/lapack/fftw,您可能需要在特定于供应商的库中搜索它们各自libblas.a liblapack.a libfftw.a或等效的位置libmkl_core.a。必须使用开关提供目录位置-L/path/to/statics/
segmentation fault即使在成功编译之后,也可能会遇到A。这个烦人的问题的原因似乎libpthread.a是没有完全包括在内。那么你需要强制采取适当行动,通过围绕开关-lpthread为-Wl,--whole-archive -lpthread -Wl,--no-whole-archive
最后,在 Ubuntu 16.04 上对我有用的版本是这个。请注意,没有-llapack -lblas -lfftwetc,因为它们捆绑在不同命名的静态二进制文件下。
Run Code Online (Sandbox Code Playgroud)$ 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 安装指南。
| 归档时间: |
|
| 查看次数: |
2428 次 |
| 最近记录: |