Использование OpenMP (libgomp) в уже многопоточном приложении - PullRequest
3 голосов
/ 08 декабря 2010

Мы используем 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 его нет.

1 Ответ

1 голос
/ 20 декабря 2010

Попробуйте запустить / остановить потоки openmp во время выполнения, используя omp_set_num_threads(1) и omp_set_num_threads(cpucount)

Этот вызов с (1) должен остановить все рабочие потоки openmp, а вызов с (cpu_num) перезапустит их снова.

Итак, при запуске программы запустите omp_set_num_threads(1).Перед областью, параллельной omp, вы можете запускать потоки omp даже с WAIT_POLICY=active, и они не будут использовать процессор до этой точки.

После области omp, вы можете снова останавливать потоки.

omp_set_num_threads(cpucount) вызов очень медленный, медленнее, чем пробуждение потоков с wait_policy = passive.Это может быть причиной для (c) - если ваша libgomp запускает потоки только в первой параллельной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...