Octave 4.2.1 和 Intel MKL

Octave 4.2.1 和 Intel MKL

我已经从源代码编译了 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。以下是我的步骤。

  1. 安装英特尔 MKL。选择在线安装程序,这样您只需下载/安装所需的产品(MKL)。

  2. 正确设置您的 Intel OneAPI 环境。对我来说,. /opt/intel/oneapi/setvars.sh intel64在终端中运行就可以了。

  3. 进入 Octave 源文件夹。编辑文件,将和configure硬编码为(记得用双引号引起来)FFTW3_LIBSFFTW3F_LIBS-m64 -L$MKLROOT/lib -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl

  4. ./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"

  5. 确保 4. 不会发出任何可疑的警告/错误消息。然后make; make check; sudo make install照常操作。

  6. 我的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 1000010000 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

相关内容