OpenMP пытается распределить потоки по ядрам как можно более равномерно, но как это работает?Механизм OpenMP для равномерного распределения потоков
В конечном счете ОС решает, как их распространять. Предлагает ли OpenMP OS просто сделать это (аналогично использованию макроса likely
или register
в C).
Если мы запустим работу с num_threads
нитями на машине с num_cores
ядрами, ни один из которых используется в настоящее время, это справедливо предположить, что потоки будут распространяться на всех сердечников равномерно (и предполагая num_threads <= num_cores
, у вас есть чистый параллелизм), так как ОС должна работать в наших интересах и хорошо распределять нагрузку.
Я вижу графики сильного масштабирования, где ось x - # сердечники. Предположим ли мы, что максимальное количество потоков, которые они использовали для запуска задания, - < = количество ядер и что ядра были относительно бездействующими?
Или все это спорный вопрос.
Это на самом деле компилятор. И на самом деле, у разных компиляторов есть способы убедиться, что потоки распределены по вашим ядрам так, как вы хотите. Например, «KMP_AFFINITY = разброс» или «KMP_AFFINITY = compact» с компилятором Intel. – NoseKnowsAll
В HPC очень редко приходится переписывать вычислительные единицы. –