贡献者: addis
和 C++ 标准库一样,SLISC 一般无需编译。如果你不想修改 SLISC 源码,只需要把 SLISC
文件夹复制到项目文件夹中,并在 C++ 源码中使用相应的头文件即可。
下载 SLISC 源码,创建 “SLISC 库概述” 中的 intro.cpp
。注意如果 intro.cpp
和 SLISC
文件夹不在同一个目录,那么你需要修改 #include
中的相对路径,也可以用绝对路径。
要编译,用 g++ intro.cpp -o intro.x
。编译成功后,运行程序就得到输出结果
u =
0 1 2
a 有 2 行和 3 列, 共计 6 个元素。
1.1 0 4.4
0 9.9 5.5
以及两个输出文件 data0.matb
和 data.matb
。
另外也推荐使用 Jupyter Notebook 和 Cling,无需编译,交互运行代码。
若使用默认选项,Long
类型的最大值(也就是数组最多的元素个数)是 $2^{31}-1 = 2147483647$。也就是 SLISC 只能处理大约 2.1GB 的 char
数组或者 16.8GB 的 double
数组。这在一般情况下是够用的,但如果要数组可能会更大,那么就不能定义该选项,且需要使用 64 位版本的头文件,位于 SLISC-64
目录下。我们可以直接把 SLISC-64/*.h
复制并覆盖到 SLISC
中。
注意如果头文件 SLISC/xxx.h
有对应的 SLISC/xxx.h.in
模板文件,那么这些头文件都是自动生成的。要重新生成 64 位版本的头文件,首先确保你的机器上安装了 octave 4.1
或以上的版本以及 make
,然后在 SLISC
目录下运行 make [选项] h
即可。例如 SLISC
中的被生成的头文件是使用 make h
生成的,SLISC-64
中的则是使用 make opt_long32=false h
生成到 SLISC
并复制过去的。SLISC-64q
则使用 make opt_long32=false opt_quadmath=true h
生成,支持 4 精度浮点数。
SLISC 中几乎每个头文件都有对应的测试代码,在 test/test_xxx.cpp
中,一般对应同名的 SLISC/xxx.h
。为了测试代码在你使用的环境(CPU 架构和操作系统)中能正常运行,强烈建议编译并运行测试。
最小测试的编译命令为 make opt_min=true -j8
,然后运行使用 ./main.x
。这里的 -j8
代表使用 8 个进程并行编译,你也可以改为其他的数字,匹配你电脑 cpu 的核数即可。如果不使用 -j
选项,默认单线程编译,可能时间较长。
如果你想测试其他非默认的编译选项,就先生成头文件 make [选项] h
生成头文件到 SLISC
(也可以从对应的 SLISC-xxx
把头文件覆盖过去,然后用 make [选项] -j8
。完成后同样运行 ./main.x
即可测试。
以下列出一些常用选项,注意只有改变 opt_long32
或 opt_quadmath
需要重新生成头文件。
opt_compiler
:选择编译器,支持 g++
(默认),clang++
,icpc
,icpx
。非默认编译器不支持 SLISC 的所有功能(例如四精度类型)。
opt_long32
:true
(默认)使用 32 位的 Long
类型,false
使用 64 位的 Long
类型。
opt_debug
:true
(默认)使用 debug 模式编译,会检查索引是否超出数组边界,矩阵尺寸是否合法等。还会在可执行文件中生成调试信息,以便使用 gdb
调试。false
:Release 模式,开启编译器优化,没有边界和尺寸检查等,不生成调试信息。
opt_asan
:true
(默认)开启 address sanitizer,进一步检测内存泄漏。
opt_std
:C++ 标准,支持 c++11
(默认)及以上标准。
opt_static
:false
(默认)动态编译,可执行文件体积较小,但需要依赖动态链接库文件(取决于系统版本,详见下文),所以无法将可执行文件直接复制到其他系统使用。true
:静态编译,不支持 address sanitizer,但优点是编译后没有其他依赖,一般复制到相似的系统中也能正常运行。
opt_min
:true
兼容模式,功能最少,无需安装任何第三方库。false
使用默认的第三方库。
lsb_release -a
命令。
Ubuntu16.04
不支持 MPLAPACK 库)
unzip 文件名.zip
)。
include
中是头文件,lib
中是库文件,静态库的后缀名为 .a
,用于静态编译;动态库后缀名为 .so.版本号
。
source setup.sh
设置把库的路径添加到环境变量 CPATH, LIBRARY_PATH, LD_LIBRARY_PATH
中。他们分别是头文件的搜索路径,编译时库文件的搜索路径,运行时动态链接库的搜索路径。除此之外,该脚本也会把对一些超出 GitHub 尺寸限制的大文件进行拼接。
echo $CPATH | tr : \\n
。
可以用以下选项开始或关闭第三方库。
opt_lapack
:reference
(默认)使用 Netlib 的基准版 BLAS 和 LAPACK,openblas
使用 OpenBlas 和基于它的 LAPACK(性能较高),mkl
使用 Intel 的 MKL(性能最高)。
opt_mplapack
:true
或 false
,默认取 opt_quadmath
的值。四精度版本的 BLAS 和 LAPACK。如果编译时提示 _Float128
未定义,需要开启选项 opt_no__Float128
opt_boost
:true
(默认)或 false
,使用 Boost 库。
opt_gsl
:true
(默认)或 false
,使用 GSL 库。
opt_eigen
:true
(默认)或 false
,使用 Eigen 库。
opt_arb
:true
(默认)或 false
,使用 Arb 库。
opt_arpack
:true
(默认)或 false
,使用 Arpack++ 库
opt_sqlite
:true
(默认)或 false
,使用 SqLite 3 库。
opt_matfile
:true
或 false
(默认),读写 Matlab 文件(已停止维护)。
除了直接下载,也可以用包管理程序如 apt
安装依赖库,但有的库会确实 64 位版本或者静态库文件等。例如在 Ubuntu
中可以使用以下命令:
apt -y update && apt -y upgrade
apt install -y vim git make g++ gdb gfortran libarpack++2-dev \
liblapacke-dev libsqlite3-dev libgmp-dev libflint-arb-dev \
libflint-dev libgsl-dev libboost-filesystem-dev