我遇到了一个奇怪的情况,Matlab 关闭时没有出现错误。
我有以下使用 OpenMP 的 mex 文件
// main.cpp
#include "mex.h"
#include "omp.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int num_threads;
int kx;
#pragma omp parallel for
for (kx = 0; kx < 100; kx++)
{
if (kx == 0) num_threads = omp_get_num_threads();
float tmp = (float)kx;
}
mexPrintf("Num threads: %i\n", num_threads);
}
当我用
mex COMPFLAGS="$COMPFLAGS /openmp" main.cpp -output test_openmp
编译并运行它时,它按预期工作
>> test_openmp()
Num threads: 8
但是,如果我在调用后立即添加
clear mex
,Matlab 会崩溃并立即关闭,并且不会报告错误。
>> test_openmp(); clear mex
如果我添加一个
pause(1)
,就不会崩溃
>> test_openmp(); pause(1); clear mex
这是另一个程序中的问题,调用 mex 程序可能会出现错误,我需要这样做:
try
mexprogram()
catch ME
clear mexprogram
end
有人知道这是怎么回事吗?当我从命令行运行 Matlab 时,我看到以下返回代码:-1073741819。连接调试器不会提供任何信息。
我正在使用 MSVC 2022 和 Matlab R2021b。
更新
链接到英特尔 openMP 实现
libiomp5md.lib
解决了这个问题!
使用 从 MATLAB 进行编译
mex -v -g COMPFLAGS="$COMPFLAGS /openmp" LINKFLAGS="$LINKFLAGS /nodefaultlib:vcomp" '-LC:\Program Files\MATLAB\R2021b\bin\win64\' -llibiomp5md.lib main.cpp -output test_openmp_intel
问题来自于混合不同的 openmp 实现。与Matlab自带的intel openmp lib链接解决了这个问题。
编译
mex -v -g COMPFLAGS="$COMPFLAGS /openmp" LINKFLAGS="$LINKFLAGS /nodefaultlib:vcomp" '-LC:\Program Files\MATLAB\R2021b\bin\win64\' -llibiomp5md.lib main.cpp -output test_openmp_intel