用Matlab-mex解决OpenMP问题 我试图用OpenMP并行化我的C++ MEX代码。然而,似乎我正在某处创建竞争条件,并且我的代码在检测到glibc()的情况下退出。更有趣的是,我的代码并非总是退出。有时,它会通过循环的所有迭代,但有时会失败(Matlab崩溃)。我真的不知道代码在哪里失败了。有人有什么意见吗

用Matlab-mex解决OpenMP问题 我试图用OpenMP并行化我的C++ MEX代码。然而,似乎我正在某处创建竞争条件,并且我的代码在检测到glibc()的情况下退出。更有趣的是,我的代码并非总是退出。有时,它会通过循环的所有迭代,但有时会失败(Matlab崩溃)。我真的不知道代码在哪里失败了。有人有什么意见吗,c++,matlab,openmp,race-condition,mex,C++,Matlab,Openmp,Race Condition,Mex,这是我的密码: #include "mex.h" #include <stdlib.h> #include <omp.h> using namespace std; void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mwIndex *jcUq31; double *const1; const1 = mxGetPr(prhs[0]); jcUq31 =

这是我的密码:

#include "mex.h"
#include <stdlib.h>
#include <omp.h>
using namespace std;

void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[]) {


mwIndex *jcUq31;
double *const1;

const1 = mxGetPr(prhs[0]);
jcUq31 = mxGetJc(prhs[2]);

/*Assign the constants*/
int nq, npol;
nq=const1[0];
npol=const1[1];

#pragma omp parallel
{
    #pragma omp for
    for(int q1=nq/2+1;q1<=nq;q1++){

        int *Uome2, *q2, *pol2, *pol3, *Uq3, *q3, *index2, *index3;
        int num_interactions, q11,j,index1,index;
        int pol1=1;

         Uome2 = (int*)mxMalloc(1*sizeof(int)); //Initialize with just one memory block - will update with mxRealloc
         q2 = (int*)mxMalloc(1*sizeof(int));

         q11=q1-nq/2;

         j=((pol1-1)+(q11-1)*npol)+1; //Column in the interaction matrix - given k(p)

         index1=(pol1-1)*nq+q1;

         num_interactions=jcUq31[j]-jcUq31[j-1];
         mexPrintf("num_interactions %d  thread number %d  q1 %d \n", num_interactions,omp_get_thread_num(),q1);


         Uome2 = (int*)mxRealloc(Uome2, num_interactions*sizeof(int));
         q2 = (int*)mxRealloc(q2, num_interactions*sizeof(int));
    }
}
}
#包括“mex.h”
#包括
#包括
使用名称空间std;
void MEX函数(整数nlhs,mxArray*plhs[],
整数nrhs,常量mxArray*prhs[]{
mwIndex*jcUq31;
双*常数1;
const1=mxGetPr(prhs[0]);
jcUq31=mxGetJc(prhs[2]);
/*分配常数*/
int nq,npol;
nq=const1[0];
npol=const1[1];
#pragma-omp并行
{
#pragma omp for

对于(int q1=nq/2+1;q1甚至不看细节,您就有了与
Uome2
q2
的竞争条件。您有多个线程,它们有这些指针的多个副本,每个指针指向在不同迭代中分配了不同内存量的地址空间。也许您应该声明这些指针如果你希望这些指针是一个共享的资源,线程应该在所有线程都想要访问它们的时候,考虑使用。但是,我真的不知道你在这里做什么,所以我不能再评论了。初始化(Uome2和q2)为了工作。即使在循环外部声明指针,我也会遇到glibc检测。关于共享,我不需要将指针作为共享资源。将在循环内部发生的进程是独立的。@PrabhakarMarepalli:您不应该在OpenMP块内使用mx函数,MEX API不是线程safe@Amro-谢谢你的邀请回答。当我必须使用mx函数时,你知道并行化的替代方法吗?@PrabhakarMarepalli:我不知道你的代码在做什么,但对于初学者来说,使用常规的
malloc
realloc
函数,而不是使用mx函数,在这里MATLAB管理内存……如果你必须在一个段落中处理mxArray变量llel块,首先检索原始指针,然后以任何方式处理这些指针。只要避免在没有正确使用锁的情况下从多个线程调用MEXAPI函数