2010-05-02 91 views
0

我已经得到了让我的堆栈溢出错误的OpenMP在MEX:计算器错误


#pragma omp parallel shared(Mo1, Mo2, sum_normalized_p_gn, Data, Mean_Out,Covar_Out,Prior_Out, det) private(i) num_threads(number_threads) 
{ 

     //every thread has a new copy 
     double* normalized_p_gn = (double*)malloc(NMIX*sizeof(double)); 
     #pragma omp critical 
     { 
      int id = omp_get_thread_num(); 
      int threads = omp_get_num_threads(); 
      mexEvalString("drawnow"); 
     } 

     #pragma omp for 
     //some parallel process..... 

} 

共享声明的变量由malloc的创建下面的代码部分。并且它们消耗大量内存

有两个关于上述代码的问题。 1)为什么这会在进入并行for循环之前产生堆栈溢出错误(即分段错误)?它在顺序模式下运行时工作正常...... 2)我是否有权为每个线程动态分配内存,如上面的“normalized_p_gn”?

问候 埃德温

+0

何时何地释放动态分配的内存? – 2010-05-02 09:03:48

回答

1

一个我们不能排除,您的代码段没有透露任何数字,可能是你只是想,当你在并行运行该分配太多的内存。如果您可以确认这不是您的问题,请发表评论或编辑您的问题,我会再看一次。

2

代替malloc,在mex文件中使用mxMalloc(请参阅here)。当你完成记忆时,不要忘记mxFree

+0

它运行良好,当它在顺序... – Edwin 2010-05-03 05:30:41

+0

@Edwin:是的,我从你的OP中看到了。 'malloc'通常在mex文件中工作正常,但它不可靠:我发现我运行相同的代码,它有时可用,而不是其他工作。我会更改为'mxMalloc'并对其进行测试。对于其他问题,可以看到更大的代码段,包括免费的代码段。 – Ramashalanka 2010-05-03 09:30:39

+3

mxMalloc不是线程安全的,因为所有mx *命令都应该在并行区域中避免。 – Sevenless 2011-02-17 16:15:05