【发布时间】:2019-09-21 15:35:59
【问题描述】:
我从 Visual Studio 2019 构建了一个 Windows MEX 文件。我的 MATLAB 版本是 R2019a。该代码只是对两个输入 matlab 数组进行了一些“排序”。这是我尝试与 OpenMP 一起使用的示例。 “测试.cpp”
#include "mex.h"
#include <vector>
#include <iostream>
#include <algorithm>
#include <omp.h>
using namespace std;
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
mxDouble *p0 = mxGetDoubles(prhs[0]);
mwSize size0 = mxGetNumberOfElements(prhs[0]);
mxDouble* p1 = mxGetDoubles(prhs[1]);
mwSize size1 = mxGetNumberOfElements(prhs[1]);
vector<vector<int>> v(2);
int i;
for (i = 0; i < size0; i++) {
v[0].push_back(int(*p0++));
};
for (i = 0; i < size1; i++) {
v[1].push_back(int(*p1++));
};
#pragma omp parallel for
for (i = 0; i < 2; i++) {
sort(v[i].begin(), v[i].end());
};
plhs[0] = mxCreateCellMatrix(2, 1);
for (int i = 0; i < 2; i++) {
mxArray* str = mxCreateNumericMatrix(1, v[i].size(), mxDOUBLE_CLASS, mxREAL);
copy(v[i].begin(), v[i].end(), mxGetPr(str));
mxSetCell(plhs[0], i, mxDuplicateArray(str));
mxDestroyArray(str);
};
return;
}
我的测试 M 文件是:
a1= [1,2,3,4,5];
a2= [1,1,1,1];
result = test(a1,a2);
clear mex;
理想的输出将是result 中的 2*1 单元格。如果我删除 # pragma 行,则 MEX 文件运行良好。如果我添加它,MATLAB 崩溃了。几天来我一直试图找到问题,但没有找到任何解决方案。
此外,
- 我已在我的 Visual Studio 中选择 OpenMP 支持键为“是”。
- 我的代码中没有使用
mexPrintf。我听说该功能会使 OpenMP 的 MEX 文件崩溃。 - 我已经安装了 Intel Studio 并行 XE 2019 和 Matlab R2019a 的更新 5。也许我做了一个错误的并行域定义。我不想将
plhs[0] = mxCreateCellMatrix(2, 1);的最后一部分包含到#pragma并行部分中。如上代码,我做对了吗?
【问题讨论】: