Количество созданных потоков равно 12, но по-прежнему работает только на одном ядре из 12-ядерных процессоров.

У меня странная проблема. У меня есть mex-функция Matlab, в которой я использовал директивы/функции OpenMP. Перед началом параллельного раздела (parallel for...) я использую команды для установки и вывода количества созданных потоков:


nP = omp_get_num_procs();
omp_set_num_threads(nP);
mexPrintf("\n Num of threads= %d\n",nP);
.
.
.
#pragma omp parallel for shared(...)

Проблема в том, что на выходе он печатает «Число потоков = 12», но следующий параллельный раздел работает не на всех 12 ядрах моей машины (а только на 1 ядре). Моя программа была написана давно, и раньше у меня не было такой проблемы (она работала на всех 12 ядрах). Недавно система была повреждена, и ОС (Win 7 Pro) была переустановлена ​​​​с обновленной версией Matlab 2011b (ранее 2010b). Я также установил Visual Studio 2010 Pro.

Есть ли что-то, что я упускаю или пропускаю?


person user1152636    schedule 16.01.2012    source источник
comment
@AloisKraus: В вопросе говорится, что Windows 7 Pro поддерживает два сокета физического процессора (и много ядер/сокетов).   -  person Ben Voigt    schedule 17.01.2012


Ответы (1)


Вы вызываете mex-функции внутри блока omp parallel for?

Мне больше всего повезло, сначала последовательно извлекая указатели, затем параллельно обрабатывая, а затем последовательно загружая результаты в переменные Matlab в конце. Таким образом, параллельный код представляет собой чистый C++, без вызовов mex-функций (которые могут ждать общей блокировки).

Конечно, убедитесь, что вы действительно компилируете с включенным OpenMP... иначе директивы будут игнорироваться, и вы получите последовательный код.

person Ben Voigt    schedule 16.01.2012