我遇到了一个奇怪的情况,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 R2021 b。
更新
针对英特尔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
1条答案
按热度按时间zpqajqem1#
问题来自于混合不同的openmp实现。与Matlab附带的intel openmp库链接解决了这个问题。
编译