我已经从源代码编译了 Octave 4.2.1,没有任何错误。有什么方法可以让它使用 Intel Math Kernel Library 吗?
我已将其安装在 \opt\intel 中。当我将其添加到 blas 和 lapack 替代方案中时:
sudo update-alternatives --install /usr/lib/libblas.so.3 \
libblas.so.3 \
/opt/intel/compilers_and_libraries/linux/mkl/lib/intel64/libmkl_rt.so \
50
sudo update-alternatives --install /usr/lib/liblapack.so.3 \
liblapack.so.3 \
/opt/intel/compilers_and_libraries/linux/mkl/lib/intel64/libmkl_rt.so \
50
Octave 无法启动,出现以下错误:
Intel MKL FATAL ERROR: Cannot load libmkl_core.so.
我也尝试过使用 MKL 编译 Octave。
export JAVA_HOME="/usr/lib/jvm/default-java"
export CFLAGS="-O2 -fPIC -DMKL_LP64 -DM_PI=3.1415926535897932384"
export FFLAGS="-O2 -fPIC"
export CPPFLAGS="-I/opt/intel/mkl/include/ -I/opt/intel/mkl/include/fftw/"
export LDFLAGS="-L/opt/intel/mkl/lib/intel64 -L/opt/intel/lib/intel64"
export LD_LIBRARY_PATH="/usr/lib/gcc:/usr/lib/gcc/x86_64-linux-gnu/:/opt/intel/lib/intel64:/opt/intel/mkl/lib/intel64:$LD_LIBRARY_PATH"
./configure --prefix=/opt/octave4_2_mkl --with-blas="-lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -liomp5 -lpthread" --with-lapack="-lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -liomp5 -lpthread" --with-fftw3="-lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -liomp5 -lpthread -lm" --with-fftw3f="-lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -liomp5 -lpthread -lm"
不幸的是,尽管 ./configure 没有输出任何错误,但是当我随后运行“make”和“make check”时,测试变得疯狂并以 Signal 6 退出。
答案1
也许你已经明白了,但我已经让它工作了(也是 Octave 4.2.1)FWIW 这里是步骤:
安装 MKL 库,然后设置更新替代方案:
sudo update-alternatives --install /usr/lib/libblas.so libblas.so /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
sudo update-alternatives --install /usr/lib/libblas.so.3 libblas.so.3 /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
sudo update-alternatives --install /usr/lib/liblapack.so liblapack.so /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
sudo update-alternatives --install /usr/lib/liblapack.so.3 liblapack.so.3 /opt/intel/mkl/lib/intel64/libmkl_rt.so 50
现在在 /etc/ld.so.conf.d 中创建一个文件 mkl.conf,并以路径作为条目:
/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64
然后在终端运行
sudo ldconfig
现在使用 update-alternatives 配置将 mkl 用作默认 blas
要检查 Octave 是否正在使用 mkl,请启动 Octave,打开终端并输入
ps aux | grep octave
我的输出显示 3 个进程,第二个进程如下
my_user_name 6032 6.4 1.7 1454636 103952 ? Ssl 08:05 0:01 /usr/local/libexec/octave/4.2.1/exec/x86_64-pc-linux-gnu/octave-gui --force-gui
记下 PID(此处为 6032),然后在终端运行
lsof -p 6032 | grep 'mkl' (change 6032 to your process's PID)
我的输出是
octave-gu 6032 my_user_name mem REG 8,2 5461454 4594702 /opt/intel/compilers_and_libraries_2017.2.174/linux/mkl/lib/intel64_lin/libmkl_rt.so
如果不使用 mkl,它就不会显示任何内容。
您不需要使用 MKL 编译 Octave,Octave 会动态使用链接到 /usr/lib/libblas 和 /usr/lib/libbapack 的任何 blas 库。您可以使用 update-alternatives 进行切换,Octave 将使用您选择的库。我在拥有 MKL 之前编译了 Octave 4.2.1,编译时我使用 openblas 作为 blas。
在我的计算机上,如果 openblas 是针对硬件进行优化的(而不是直接从 repo 安装),那么 MKL 实际上并不比 openblas 快。
谨慎使用,这似乎会给大型矩阵带来错误的结果. 看看这个错误报告
正如评论中提到的,您必须运行LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_rt.so octave
才能将 Intel MKL 与 Octave 结合使用。您可以编辑桌面文件以使其成为默认设置。
如果您经常使用octave-cli
,您还可以制作一个新的启动器/usr/bin/octave-mkl
(内容为LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_rt.so octave-cli
),以便octave-cli
从终端使用 MKL 启动。
测试:这是我的代码,它将生成具有 500x500 矩阵的最大实部的特征值的实部,c
其元素为c(i,j) = sin(i + j^2)
。
for a = 1:500
for b = 1:500
c(a,b) = sin(a + b^2);
endfor
endfor
g = eig(c);
max(real(g))
如果没有 MKL 的话,输出是,ans = 16.915
而有了 MKL 的话,输出是ans = 1.2196e+05
,答案在每次运行时都会不断振荡,但总是按 的顺序排列10^5-10^6
,这是错误的。
答案2
我能够直接使用 Intel MKL 2024.0.0 从源代码编译 GNU Octave 8.4.0 和 9.1.0,并且make check
不会出现任何段错误,而且无需使用 LD_PRELOAD 技巧。计算速度现在与 MKL 速度相同,没有本文中报告的问题错误报告。我的系统是 x86_64 Ubuntu 22.04.3。以下是我的步骤。
安装英特尔 MKL。选择在线安装程序,这样您只需下载/安装所需的产品(MKL)。
正确设置您的 Intel OneAPI 环境。对我来说,
. /opt/intel/oneapi/setvars.sh intel64
在终端中运行就可以了。进入 Octave 源文件夹。编辑文件,将和
configure
硬编码为(记得用双引号引起来)FFTW3_LIBS
FFTW3F_LIBS
-m64 -L$MKLROOT/lib -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
./configure --with-fftw3-includedir=$MKLROOT/include/fftw --with-fftw3-libdir=$MKLROOT/lib/intel64 --with-fftw3f-includedir=$MKLROOT/include/fftw --with-fftw3f-libdir=$MKLROOT/lib/intel64 --with-blas="-m64 -L$MKLROOT/lib -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl" --with-lapack="-m64 -L$MKLROOT/lib -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl"
确保 4. 不会发出任何可疑的警告/错误消息。然后
make; make check; sudo make install
照常操作。我的
make check
没有出现段错误,只导致了四个故障,其中三个是良性的,一个可能没问题。以下是更多详细信息。
make check
失败:
查看您的test/fntests.log
并搜索test failed
更多信息。我的如下。
subspace.m
:无害。我可以忍受 7.7716e-16 的错误
Abs err 7.7716e-16 超过 tol 6.6613e-16 1e-16
svd.cc-tst
:良性。这两个错误是由于在 SVD 中否定了酉矩阵而导致的。酉矩阵的符号是任意的,但这个结果在数学上仍然是正确的。
观察值 | 预期值
0.70711 | -0.70711
0.70711 | -0.70711
0.70711 | -0.70711
-0.70711 | 0.70711
fftw.cc-tst
:可能还行。我不确定 Intel MKL 是否支持 Wisdom。请参阅这里。
无法获取当前 FFTW 智慧
性能测试:
从终端运行MKL_NUM_THREADS=4 octave
并测试矩阵乘法 (更快的 MKL) 速度。在我的 i7-4770K 四核处理器上,将两个大小的双矩阵相乘6400 x 10000
并10000 x 6400
使用所有MKL_NUM_THREADS=4
物理核心需要 3.9 秒,我知道这是合理的 MKL 速度。
答案3
不确定当这个问题被问到时这个页面是否不存在,但英特尔提供了关于如何安装支持 MKL 的 octave 的官方说明
https://software.intel.com/content/www/us/en/develop/articles/using-intel-mkl-in-gnu-octave.html