OpenMP накладные расходы - PullRequest
       57

OpenMP накладные расходы

2 голосов
/ 04 сентября 2011

Я распараллелил свертывание и факторизацию изображений с использованием OpenMP и Intel TBB.Я тестирую его на 1-8 ядрах.Но когда я пробую это на 1 ядре в OPenMP и TBB, указав один поток, используя, например, set_num_threads (1) и task_scheduler_init InitTBB (1) соответственно;Производительность TBB демонстрирует некоторое небольшое ухудшение по сравнению с последовательным кодом из-за издержек TBB, но неожиданно OpenMP не показывает никаких издержек на одноядерном процессоре и работает точно так же, как последовательный код (с использованием уровня оптимизации Intel O3).Я использую статическое планирование циклов OpenMP.Это реально или я делаю какую-то ошибку?

Ответы [ 4 ]

2 голосов
/ 01 октября 2011

Среда выполнения OpenMP, вероятно, не создаст никаких потоков, если вы запустите его только с одним потоком.

Кроме того, простое использование директив распараллеливания OpenMP иногда также ускоряет выполнение последовательного кода, поскольку вы, по сути, предоставляете компилятору больше информации.Конструкция разделения работы, например, сообщает компилятору, что итерации цикла не зависят друг от друга, что он, возможно, не смог бы вывести самостоятельно, и что позволяет компилятору использовать более агрессивные стратегии оптимизации.Конечно, не всегда, но я видел, как это происходит с «кодом реального мира».

0 голосов
/ 31 января 2015

Особенность OpenMP заключается в том, что компилятор выполняет всю работу за вас, он требует минимального изменения последовательного кода и часто дает несколько хорошие результаты, если задачи, выполняемые для каждого потока, достаточно велики. Я бы предложил попробовать протестировать ваш код, используя Pthread или thread на c ++ 11, и посмотреть результаты.

0 голосов
/ 14 июня 2012

OpenMP разветвляет декорированную часть (#pragma omg for /rallel) кода в основной поток (который также будет выполняться без OpenMP) и дополнительные потоки.

Если вы сконфигурируете использовать только 1 поток, то это только основной поток, выполняемый так, как если бы он был без директивы OpenMP. Служебные расходы отсутствуют, поскольку путь выполнения не был разветвлен.

0 голосов
/ 04 сентября 2011

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

TBB, насколько я понимаю, это в основном просто библиотека.Всегда нужно, чтобы ваш алгоритм был украшен необходимыми частями для его параллельной и последовательной работы.

...