К сожалению, современные многоядерные компьютерные системы не годятся для такого мелкозернистого параллелизма внутри цикла.Это не из-за проблемы создания / разветвления потока.Как указал Itjax, практически все реализации OpenMP используют пулы потоков, т. Е. Они предварительно создают несколько потоков, а потоки запаркованы.Таким образом, на самом деле нет никаких накладных расходов на создание потоков.
Однако проблемы таких распараллеливающих внутренних циклов заключаются в следующих двух издержках:
- Распределение заданий / задач в потоки: даже еслинам не нужно физически создавать потоки, по крайней мере, мы должны назначать задания (= создавать логические задачи) потокам, которые в основном требуют синхронизации.
- Присоединение к потокам: после всех потоков в команде эти потоки должны бытьприсоединился (если только не используется директива OpenMP сейчас).Это обычно реализуется как барьерная операция, которая также является очень интенсивной синхронизацией.
Следовательно, следует минимизировать фактическое количество назначений / присоединений потоков.Вы можете уменьшить такие накладные расходы, увеличив объем работы внутреннего цикла на один вызов.Это может быть сделано с помощью некоторых изменений кода, таких как развертывание цикла.