devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Есть ли смысл учитывать аппаратное количество потоков в игровом движке?

Пишу игровой движок.

Если вкратце, есть модули, а у модулей есть worker'ы, это может быть расчёт ботов или другой игровой логики, взаимодействие с сервером и т.д.
Часть из этих worker'ов могут быть распараллелены(на CPU).

Есть ли смысл учитывать количество аппаратно поддерживаемых потоков(например вот это значение en.cppreference.com/w/cpp/thread/thread/hardware_c...) или же делать их столько, сколько можно и положиться на ОС?

Не будет ли большого оверхеда при переключении контекста?
  • Вопрос задан
  • 568 просмотров
Пригласить эксперта
Ответы на вопрос 1
@nirvimel
Пул потоков по умолчанию содержит число потоков, равное количеству ядер аппаратных потоков. У этого пула есть входная очередь (lock-free), куда сабмитятся поступающие таски. Когда CPU недонагружен очередь пустая. Когда все потоки заняты, очередь растет.

Это рецепт максимальной производительности, за исключением того случая, когда по условиям задачи критично, чтобы большое количество тасков выполнялось реально параллельно (например сами задачи продолжительные, а разбивать их на подзадачи нет возможности или желания), тогда все задачи должны быть разложены по отдельным потокам ОС.

Кстати, очередь задач на пуле потоков - это именно то, как многозадачность реализуется внутри ОС. Только тут сами потоки ОС являются тасками, которые ставятся в очередь. Разница в производительности объясняется тем, что переключение тасков в юзерспейсе легче (следовательно быстрей), чем переключение потоков ОС.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы