Мы используем OpenMP (libgomp) для ускорения некоторых вычислений в многопоточном приложении Qt.Параллельные секции OpenMP расположены в двух разных потоках, хотя на самом деле они никогда не выполняются параллельно.В этом случае мы наблюдаем, что 2N (где N = OMP_THREAD_LIMIT
) потоки omp запускаются, очевидно, мешая друг другу.Время расчета очень велико, а загрузка процессора низкая.Установка OMP_WAIT_POLICY
вряд ли окажет какое-либо влияние.
Мы также попытались перенести все секции omp в один поток (однако это не очень хорошее решение для нас, хотя и с архитектурной точки зрения).В этом случае общее время расчета уменьшается, и процессор полностью загружается, но только если OMP_WAIT_POLICY
установлено на ACTIVE
.Когда OMP_WAIT_POLICY == PASSIVE
, время расчета остается низким, а процессор простаивает 50% времени.
Довольно странно, когда мы используем omp в одном потоке, первый цикл распараллеливается с использованием omp (в серии ompвычислений) выполняется в 10 раз медленнее по сравнению с многопоточностью.
Upd: Наши вопросы:
a) есть ли способ повторно использовать потоки openmp при использовании ompв контексте различных потоков.
b) Почему выполнение с OMP_WAIT_POLICY == PASSIVE
замедляет все.Требуется ли много времени, чтобы разбудить потоки?
c) Есть ли какое-либо логическое объяснение явления медленного первого параллельного блока (даже при ожидании в активном режиме)
Upd2: Обратите внимание, что проблема, вероятно, связана с реализацией GNU OMP.У icc его нет.