Количество созданных потоков - 12, но все еще работает только на одном ядре из 12-ядерных процессоров.
У меня странная проблема. У меня есть мексфункция Matlab, в которой я использовал директивы / функции OpenMP. Перед началом параллельного раздела (параллельный для...) я использую команды для установки и вывода количества созданных потоков:
nP = omp_get_num_procs();
omp_set_num_threads(nP);
mexPrintf("\n Num of threads= %d\n",nP);
.
.
.
#pragma omp parallel for shared(...)
Проблема в том, что на выходе выводится "Num of threads= 12", но следующий параллельный раздел не работает на всех 12 ядрах моей машины (но только на 1 ядре). Моя программа была написана давно, и у меня не было такой проблемы ранее (она работала на всех 12 ядрах). Недавно система была повреждена, и ОС (Win 7 Pro) была переустановлена с обновленной версией Matlab 2011b (ранее 2010b). Я также установил Visual Studio 2010 Pro.
Есть что-то, что я пропускаю или пропускаю?
1 ответ
Вы вызываете мекс-функции внутри omp parallel for
блок?
Мне посчастливилось сначала последовательно извлекать указатели, затем обрабатывать их параллельно, а затем в конце последовательно загружать результаты в переменные Matlab. Таким образом, параллельный код является чистым C++, без вызова mex-функций (которые могут ожидать разделяемой блокировки).
Конечно, убедитесь, что вы на самом деле компилируете с включенным OpenMP... в противном случае директивы будут проигнорированы, и вы получите последовательный код.