openmp случайным образом использует только одно ядро

У меня Ubuntu 10.04, версия gcc 4.4.3. Я компилирую код С++ с omp.h и параметром g++ -fopenmp. Большую часть времени все работает так, как ожидалось. У меня четырехъядерный с гиперпоточностью, так что практически 8 ядер.

Случайным образом, когда я запускаю свое программное обеспечение (и смотрю системный монитор), все 8 ядер работают на 100%, включаются вентиляторы, и все такое хорошее дело. В течение полсекунды все ядра, кроме одного, отключаются и становятся неактивными, а одно продолжает работать.

В это время, если я отменяю свою программу (просто Ctrl+C) и перезапускаю ее - она ​​работает как положено, все ядра продолжают работать на 100%.

Вот фрагменты кода на случай, если он будет полезен:

28 #include <time.h>
29 #include <omp.h>
30 #include <string>
...
713 #ifdef _OPENMP
714         if(omp_get_dynamic())
715                 omp_set_dynamic(1);
716 #endif
717 
718 #pragma omp parallel
719         {
720 #pragma omp for schedule(dynamic) private(node)
721                 for (int c = 0; c < buffer->GetCount(); c++) {
... initialize objects pointers etc
724 #pragma omp critical(BUFFER_LOOKUP)
725                         {
... perform chunk of code that is a choke
734                         }

person Mikhail    schedule 10.03.2011    source источник
comment
Взгляните на это viva64.com/en/a/0054 руководство по устранению неполадок openmp.   -  person Martin Beckett    schedule 10.03.2011


Ответы (1)


Со страницы omp_set_dynamic(n) maual: n ... Значение, указывающее, может ли среда выполнения регулировать количество потоков, доступных в последующем параллельном регионе. Если не ноль, среда выполнения может регулировать количество потоков, если ноль, среда выполнения не будет динамически регулировать количество потоков.

Попробуйте установить количество потоков, которое вы хотите, с помощью #pragma omp parallel num_threads(n), превращая omp_set_dynamyc.

person GBBL    schedule 11.03.2011
comment
Хороший вопрос. Почему вы сделали omp_set_dynamic(1)? - person ejd; 11.03.2011
comment
Потому что я априори не знаю, сколько у меня будет объявлений. Я хочу, чтобы он использовал все доступные ядра на любом компьютере, на котором он работает. - person Mikhail; 11.03.2011
comment
Значит у вас неправильно настроено. Вы должны проверить, является ли omp_get_dynamic истинным, и если это так, то выполните omp_set_dynamic(0), т. е. установите для него значение false. В приведенном выше примере говорится, что если это правда, установите для него значение true. Вы не хотите, чтобы среда выполнения устанавливала его, если вы не знаете, на что он собирается установить его. - person ejd; 11.03.2011
comment
Используйте int ncores=omp_gen_num_procs(); чтобы узнать, сколько ядер у вас есть. Тогда, если вам действительно нужен динамический номер потока (почему?), omp_set_dynamic(ncores); Обычно я предпочитаю указывать количество потоков директивой num_threads или omp_set_num_threads(ncores); функция. - person GBBL; 13.03.2011