它一直建议使用 Octave 和我自己电脑中编译的 OpenBLAS(而不是从存储库中预编译的 OpenBLAS)将使计算速度更快。我使用 apt 从存储库安装了 GNU Octave (4.2.2),并从https://www.openblas.net/。
如何让 Octave 使用这个 OpenBLAS?
到目前为止我已经尝试过什么。
编译 OpenBLAS 后,我将它安装在 中opt/openblas
。
然后我输入命令
sudo update-alternatives --install /usr/lib/libblas.so libblas.so /opt/openblas/lib/libopenblas.so 50
sudo update-alternatives --install /usr/lib/libblas.so.3 libblas.so.3 /opt/openblas/lib/libopenblas.so 50
sudo update-alternatives --install /usr/lib/liblapack.so liblapack.so /opt/openblas/lib/libopenblas.so 50
sudo update-alternatives --install /usr/lib/liblapack.so.3 liblapack.so.3 /opt/openblas/lib/libopenblas.so 50
然后我配置使用新的 OpenBLAS
update-alternatives --config libblas.so
update-alternatives --config libblas.so.3
update-alternatives --config liblapack.so
update-alternatives --config liblapack.so.3
最后我使用新的 OpenBLAS 运行 Octave,但出现了这个错误。
$ LD_PRELOAD=/opt/openblas/lib/libopenblas.so octave-cli
octave-cli: symbol lookup error: /usr/lib/x86_64-linux-gnu/libblas.so.3: undefined symbol: gotoblas
答案1
我建议从 Ubuntu 存储库中的所有内容开始。首先要尝试安装libopenblas-base
包并允许它提供 BLAS 和 LAPACK 替代方案,就像这样简单:
sudo apt-get install octave
sudo apt-get install libopenblas-base
使用我们的测试脚本在我的 i7-3537u 上,Octave 的时序如下:
- 0.42 秒 - 使用简单的默认值
libblas3
,liblapack3
- 0.26 秒 -
libopenblas-base
来自存储库
如果您想要进一步优化它 - 可以通过以下方式在本地编译 OpenBLAS:
sudo apt-get build-dep libopenblas-dev
cd /tmp
apt-get source libopenblas-base
cd openblas-0.2.20+ds
DEB_CFLAGS_SET="-march=native -mtune=native" DEB_CFLAGS_SET="-march=native -mtune=native" dpkg-buildpackage -uc -us -j8
sudo apt-get install ../libopenblas-base_0.2.20+ds-4_amd64.deb ../libopenblas-dev_0.2.20+ds-4_amd64.deb
这会将基准测试结果更改为:
- 0.25 秒 -
libopenblas-base
自编译
因此,通过额外的手动优化来编译优化库是没有用的。
结论:我建议首先优化 Octave 代码,避免使用 for 循环,并尽可能使用矢量化函数。这将极大地提高性能。