2016-02-23 4 views
0

OpenMP пытается распределить потоки по ядрам как можно более равномерно, но как это работает?Механизм OpenMP для равномерного распределения потоков

В конечном счете ОС решает, как их распространять. Предлагает ли OpenMP OS просто сделать это (аналогично использованию макроса likely или register в C).

Если мы запустим работу с num_threads нитями на машине с num_cores ядрами, ни один из которых используется в настоящее время, это справедливо предположить, что потоки будут распространяться на всех сердечников равномерно (и предполагая num_threads <= num_cores, у вас есть чистый параллелизм), так как ОС должна работать в наших интересах и хорошо распределять нагрузку.

Я вижу графики сильного масштабирования, где ось x - # сердечники. Предположим ли мы, что максимальное количество потоков, которые они использовали для запуска задания, - < = количество ядер и что ядра были относительно бездействующими?

Или все это спорный вопрос.

+0

Это на самом деле компилятор. И на самом деле, у разных компиляторов есть способы убедиться, что потоки распределены по вашим ядрам так, как вы хотите. Например, «KMP_AFFINITY = разброс» или «KMP_AFFINITY = compact» с компилятором Intel. – NoseKnowsAll

+0

В HPC очень редко приходится переписывать вычислительные единицы. –

ответ

1

Планирование потоков OpenMP на ядрах и/или аппаратных потоках машины в основном зависит от операционной системы. Он будет решать на основе собственной эвристики, где и когда начинать/останавливать/переносить их ...

Однако OpenMP предоставляет вам некоторые инструменты для прямого/ограничения диапазона выбора, который ОС имеет для принятия своих решений. Например, у вас есть доступ к:

  • Количество OpenMP нитей для запуска на параллельной области: OMP_NUM_THREADS переменной окружения, num_threads п, omp_set_num_threads() функция
  • логических ядер, где потоки могут быть запланированы в ОС : OMP_PLACES переменная среды.
  • Дополнительная политика закрепления для потоков: OMP_PROC_BIND переменная среды, proc_bind статья.

При этом у вас есть некоторый уровень контроля для управления решениями ОС, но в конечном счете он остается под контролем фактического планирования. И решения, которые будут приняты, не всегда будут тем, что вы могли бы подумать (особенно если вы не используете размещение или привязку), так как рабочая нагрузка на машину и применяемая глобальная политика планирования могут мешать тому, что, по вашему мнению, было бы оптимальным для вашего кода , Например, на машине NUMA (неравномерный доступ к памяти) такие соображения, как память, используемая на разных узлах, и какой сегмент памяти принадлежит тому, какой процесс может препятствовать, по-видимому, равномерному распространению потоков через чипы, приводят к локальным утверждениям процессора ...

Смежные вопросы