Windows не использует все логические процессоры
(Изначально я разместил это на Stack Overflow, но меня направили сюда. Прошу прощения, если это не тот форум.)
У нас есть приложение-контроллер, которое асинхронно запускает приложения моделирования. (Оба приложения написаны на C++ и работают в Windows.) Наши приложения являются однопоточными (хотя возможно, что сторонние библиотеки используют рабочие потоки). Приложение контроллера использует операционную систему для оптимального использования логических процессоров.
У пользователя есть компьютер Dell с 12 ядрами и 24 логическими процессорами под управлением Windows 10 Enterprise. Компьютер предназначен для запуска моделирования с минимальной фоновой активностью. Пользователь настроил контроллер на запуск 24 процессов моделирования, ожидая, что будут задействованы все логические процессоры. Вместо этого пользователь заметил, что использовалось 12 логических процессоров (на каждый Process Explorer):использовалось 12 логических процессоров.
В диалоговом окне Set Affinity в Process Explorer процесс контроллера проверяет все 24 логических процессора. Такое поведение с тех пор наблюдалось на других компьютерах и не характерно для пользователя.
Я модифицировал контроллер так, чтобы он вызывал функцию Windows API SetProcessAfinityMask(), назначая каждый процесс моделирования отдельному логическому процессору, и смог использовать все 24 логических процессора (на каждый Process Explorer): использовалось 24 логических процессора.
В диалоговом окне Set Affinity в обозревателе процессоров для каждого процесса моделирования проверяется только назначенный ему логический процессор.
Наши приложения, хотя в настоящее время они предназначены только для Windows, в значительной степени нейтральны к платформе, и я бы предпочел, чтобы ОС выполняла планирование (а не внедряла низкоуровневые вызовы API ОС).
Мои вопросы:
- Почему Windows не использует все логические процессоры?
- Есть ли настройки, которые контролируют это поведение? (В настоящее время это будет для Windows 8.1, 10 и 11.)
- Если необходимо внедрить низкоуровневые вызовы API ОС, что нужно делать (или не делать)? Например, даже если компьютер предназначен для моделирования, лучше ли оставить 1–2 логических процессора для фоновой работы?
Я новичок в этом - пока я не начал исследовать вопрос пользователя, я не знал о привязке процессора - поэтому прошу прощения, если что-то пропустил при поиске в Интернете. Обмен электронной почтой с пользователем длится долго, многие вещи обсуждаются, опробованы и исключены в качестве решения. Я постарался предоставить достаточно, но не слишком много деталей. Буду рад предоставить дополнительную информацию, если она будет полезна.