Есть ли способ установить привязку потоков к ядру процессора с помощью библиотеки потоков потоков?

И было бы неплохо сделать это, если бы я нуждался в процессорных ядрах, работающих на 100% в течение дюжины секунд, или я получил бы лучшую производительность, если бы позволил системе решать, как обрабатывать потоки?

Мне нужно быстрое выполнение, и я боюсь, что система может потратить несколько секунд, прежде чем использовать все ядра, но я не нашел способа сделать это с помощью Boost Thread.

4

Решение

Сначала вам нужно позвонить get_native_handle Затем функция-член передает полученный дескриптор платформо-зависимой функции для установки сродства ЦП потока (то есть pthread_setaffinity_np / SetThreadAffinityMask / …).

Что касается, если это хорошая идея: профиль & узнать …

4

Другие решения

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

Как правило, если вам нужно установить привязку к процессору, либо у вас очень специфический и необычный вариант использования, либо в вашей операционной системе есть ошибка.

5

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

5

Есть еще одна причина для установления близости. Для некоторых современных систем (например, SOC на основе ARM) технология энергосбережения существенно влияет на планировщик. Система работает как можно меньше ядер процессора. Если все текущие задачи могут жить на одном ядре, то спят только другие ядра. Если нагрузка внезапно возрастает (запускается новая тяжелая задача), необходимо разбудить одно или несколько ядер. Этот процесс является относительно медленным, поэтому он может дать вашей задаче отсутствие процессора, пока планировщик балансирует нагрузку для большего количества ядер. Установив ручное сродство к нескольким потокам / процессам, вы можете поддерживать работу всех ядер (и всегда быть готовыми к внезапному увеличению нагрузки). Похоже, что это хорошо для задач псевдо в реальном времени.

0