Я создал Windows MEX-файл из Visual Studio 2019. Моя версия MATLAB - R2019a.Код просто выполняет некоторую «сортировку» двух входных массивов matlab.Это пример, который я пытаюсь использовать с OpenMP."test.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;
Идеальным выводом будет ячейка 2 * 1 в result
.Если я уберу строку # pragma
, MEX-файл будет работать хорошо.Если я добавлю это, MATLAB потерпел крах.Я пытался найти проблему в течение нескольких дней и не нашел никакого решения.Кроме того,
- Я выбрал ключ поддержки OpenMP для "да" в моей Visual Studio.
- Я не использую
mexPrintf
в своем коде.Я слышал, что функция будет вызывать сбой MEX-файла с OpenMP. - Я установил Intel Studio параллельно XE 2019 и обновил 5 Matlab R2019a.Возможно, я ошибся в определении параллельного домена.Я не хочу включать последнюю часть из
plhs[0] = mxCreateCellMatrix(2, 1);
в параллельную часть #pragma
.Как коды выше, я делаю это правильно?