使用 openMP 清除 mex 后,Matlab 退出且没有错误

问题描述 投票:0回答:1

我遇到了一个奇怪的情况,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
c++ matlab openmp mex
1个回答
0
投票

问题来自于混合不同的 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
© www.soinside.com 2019 - 2024. All rights reserved.