2010-05-02 49 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