如何修复 Octave 在 Ubuntu 中使用 Intel MKL 产生错误结果?

Arc*_*ahi 5 octave blas intel-mkl

尽管英特尔 MKL 在 GNU Octave 中加快了计算速度,但当矩阵的大小很大时,结果有时(在 Xubuntu 20.04 中使用 Octave 5.2.0 测试)完全错误。这已在此处此处提及。

例如,这个要点显示了一个例子,Octave 和 Scilab 产生不同的结果,并且 Octave 的结果是错误的(它每次运行脚本时都会改变。Octave 使用 OpenBLAS 给出正确的结果)。

这是要点中的代码。

for a = 1:500
        for b = 1:500
                c(a,b) = sin(a + b^2);
        endfor
endfor

g = eig(c);

m = max(real(g))

%Correct result is ans =  16.915
%With MKL in Ubuntu 20.04, I get random numbers of order 10^5 - 10^6, which changes on every run

Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Arc*_*ahi 5

这个问题已经在一些 Debian 错误报告中提到(参见这个这个),以及一个Octave的错误报告

根据 Debian 维护者的说法,这既不是 Octave 的错误,也不是 MKL 的错误。它是由 libgomp 和 libiomp 之间的竞争条件引起的。

这是修复它的方法。

输入命令

export MKL_THREADING_LAYER=gnu
Run Code Online (Sandbox Code Playgroud)

在一个终端中,并octave从同一终端呼叫。现在应该不会出现这个问题。

要使此修复永久有效,请将该行添加export MKL_THREADING_LAYER=gnu到您的.bashrc文件中。


注意:安装 MKL 后,我绘制了某个图形,发现有些严重错误(虽然计算速度更快)。我在MKL 社区发布了它,他们说这不是他们的错误。最后我用 Octave 打开了一个错误报告,有人提到了这个解决方法。

警告:如错误报告中所述,__run_test_suite__即使应用此解决方法,Octave ( )的测试套件也会因分段错误而失败。因此,建议谨慎使用带有 MKL 的 Octave。