使用openMP清除mex后,Matlab退出,无错误

q3qa4bjr  于 7个月前  发布在  Matlab
关注(0)|答案(1)|浏览(109)

我遇到了一个奇怪的情况,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
zpqajqem

zpqajqem1#

问题来自于混合不同的openmp实现。与Matlab附带的intel openmp库链接解决了这个问题。
编译

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

相关问题