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

How to fix Octave producing wrong results with Intel MKL in Ubuntu?

虽然 Intel MKL 加快了 GNU Octave 的计算速度,但当矩阵的尺寸很大时,结果有时(在 Xubuntu 20.04 中使用 Octave 5.2.0 测试)完全错误。这已被提及here and here

例如,this gist 显示了一个 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

如何解决这个问题?

一些 Debian 错误报告中提到了这个问题(参见 Octave 中的 this and this), and a bug report

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

修复方法如下。

输入命令

export MKL_THREADING_LAYER=gnu

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

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


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

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