它一直建議使用 Octave 和在我自己的電腦中編譯的 OpenBLAS(而不是從儲存庫預先編譯的 OpenBLAS)將使運算速度更快。我使用 apt 從儲存庫安裝了 GNU Octave (4.2.2),並編譯了最新版本的 OpenBLAShttps://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 s - 使用簡單預設值
libblas3
,liblapack3
- 0.26 s -
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 s -
libopenblas-base
自編譯
所以透過額外的手動最佳化來編譯最佳化函式庫是沒有用的。
結論:我建議先透過避免 for 迴圈並盡可能使用向量化函數來最佳化您的 Octave 程式碼。這將極大地提高性能。