我一直在用Python工作,但现在我不得不和一个用Matlab工作的同事分享一个函数。因为这个东西相当复杂,调用编译后的C代码等。我认为从Matlab调用Python代码更容易。
一切似乎都很好,直到这一行:points = np.random.multivariate_normal(means, correlation, nSamples)
我得到的错误:
Intel MKL ERROR: Parameter 12 was incorrect on entry to DGBBRDM.
Intel MKL ERROR: Parameter 10 was incorrect on entry to DGESDD.
init_gesdd failed init
并且执行平稳地继续,其中点是0的数组。
当然,当直接运行Python代码时(从相同的conda env),我得到了我的多元正态样本。
在这里搜索,我只找到提到代码如何编译,如何链接以及接口可能是C或Fortran的解决方案。在这里,我没有编译任何东西,我不明白为什么中间的Matlab步骤会扰乱numpy使用的库。
我在Anaconda指南上找到了一些相关的东西,但似乎是Windows特定的,并且提到了与Matlab不同的软件,所以我甚至不确定是不是同样的问题。
一个(可能)类似question的答案建议
conda config --add channels intel
conda update --all
但这个也没什么用
总的来说,这似乎不是一个方便的方式与同事共享一些功能。
编辑
我使用的是Ubuntu 22.04.2 LTS,如果有关系的话,运行在第11代英特尔®酷睿™ i7- 1165G7@2.80GHz × 8,Python 3.9.12,MatlabR 2022 b上。
复制的两个步骤:
- 文件
testMatlabIntel.py
包含:
import numpy as np
def test():
means = [0,0]
correlation = [[1,0.3],[0.3,1]]
nSamples = 300
points = np.random.multivariate_normal(means, correlation, Samples)
return np.std(points)
- 从终端打开Matlab,如果需要,在python路径(
insert(py.sys.path,int32(0),'path/to/file');
)中添加python文件的路径,然后运行:
py.testMatlabIntel.test()
Matlab提示符中的输出为:
/path/to/file/testMatlabIntel.py:7: RuntimeWarning: covariance is not positive-semidefinite.
points = np.random.multivariate_normal(means, correlation, Samples)
ans =
0
而在终端上我用来启动Matlab我看到:
Intel MKL ERROR: Parameter 12 was incorrect on entry to DGBBRDM.
Intel MKL ERROR: Parameter 10 was incorrect on entry to DGESDD.
请注意,这不仅仅是一个方差为零的数组,而是一个零数组。
相比之下,在另一台机器(Ubuntu 20.04.6 LTS,英特尔®酷睿™ i5- 8250 U CPU@1.60GHz × 8)上,我得到的结果很简单:
ans =
1.0136
从Python调用测试函数时没有警告,也没有从一个单位方差样本中预期的那样。
编辑2
运行Ubuntu 22.04.2 LTS的计算机:
Python: 3.9.16 (main, Feb 22 2023, 02:08:36)
[GCC 11.2.0]
Numpy: 1.23.5
MKL: Intel(R) oneAPI Math Kernel Library Version 2023.1-Product Build 20230303 for Intel(R) 64 architecture applications
我仔细检查了同一个版本是否从终端和Matlab调用。
在终端中,当调用Python时,我得到了[GCC 11.2.0] :: Intel Corporation on linux
此外,设置MKL_VERBOSE=1
,它会打印:
MKL_VERBOSE DGESDD(A,8589934594,8589934594,0x7fbfc9a789b0,8589934594,0x7fbfc9a789d0,0x7fbfc9a789e0,8589934594,0x7fbfc9a78a00,-4294967294,0x7fc12b3f9010,1382979469311,0x7fbfc9a78a20,-10) 580.03us CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:4
init_gesdd failed init
MKL_VERBOSE DGEMM(N,T,2,2,2,0x7fc12b3fabc0,0x7fbfc9a991e0,2,0x7fbfc9a97600,2,0x7fc12b3fabc8,0x7fbfc9685760,2) 131.85us CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:4
MKL_VERBOSE DGEMM(N,N,2,300,2,0x7fc12b3fabc0,0x7fbfc9685760,2,0x7fc05d198a00,2,0x7fc12b3fabc8,0x7fc05d199cd0,2) 15.14us CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:4
如果这能帮上忙的话。
在另一台机器(Ubuntu 20.04.6 LTS)上,从Matlab内部我得到:
Python: 3.9.16 (main, Mar 8 2023, 14:08:28)
[GCC 11.2.0]
Numpy: 1.23.5
MKL: Intel(R) oneAPI Math Kernel Library Version 2023.1-Product Build 20230303 for Intel(R) 64 architecture applications
从终端调用Python时,我得到[GCC 11.2.0] :: Anaconda, Inc. on linux
总结:
| | 作品|并不|
| - -----|- -----|- -----|
| Ubuntu| 20.04.6 LTS| 22.04.2 LTS|
| Matlab| R2023a| R2022b|
| Python| 3.9.16| 3.9.16|
| 从英特尔?|没有吗|是的|
| Numpy| 1.23.5| 1.23.5|
| MKL| 2023.1| 2023.1|
1条答案
按热度按时间xjreopfe1#
我有一个类似的problem。解决方案是在启动文件中添加以下行: