2010-05-02 2 views
0

я получил следующую часть кода, получая мне ошибку переполнения стекаOpenMP в Mex: StackOverflow ошибка


#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..... 

} 

переменные, объявленные в совместно создаются таНос. и они потребляют с большим объемом памяти

есть 2 вопроса относительно вышеуказанного кода. 1) почему это привело бы к возникновению ошибки переполнения стека (т. Е. Ошибки сегментации), прежде чем он перейдет в параллельный цикл? он отлично работает, когда он работает в последовательном режиме .... 2) Я прав на динамическое выделение памяти для каждого потока, такого как «normalized_p_gn» выше?

С уважением Эдвин

+0

Когда вы освобождаете динамически выделенную память? –

ответ

1

Одна из возможностей, которую мы не можем исключить, ваш фрагмент кода не выявил каких-либо цифр, является то, что вы просто пытаетесь выделить слишком много памяти при запуске этого параллельно. Если вы можете подтвердить, что это не ваша проблема, прокомментируйте или отредактируйте свой вопрос, и я еще раз посмотрю.

2

Вместо malloc используйте файлы mxMalloc в файлах mex (см. here). Не забудьте сделать mxFree, когда закончите с памятью.

+0

он работает хорошо, когда он находится в последовательном порядке ... – Edwin

+0

@Edwin: Да, я видел это с вашего OP. 'malloc' часто работает нормально в файлах mex, но это ненадежно: я нашел, что я запускаю тот же код, и он работает иногда, а не другие. Я бы переключился на 'mxMalloc' и протестировал его. Для других проблем было бы неплохо увидеть большой сегмент кода, включая бесплатный. – Ramashalanka

+3

mxMalloc не является потокобезопасным, как и все команды mx *, и его следует избегать в параллельной области. – Sevenless