Недавно мы приобрели двухпроцессорную рабочую станцию Dell, оснащенную двумя процессорами Xeon 6138 Gold. Каждый ЦП имеет 20 физических ядер (40 логических ядер), то есть всего 40 физических ядер или 80 логических ядер.
И Linux Fedora, и Windows 10 Professional установлены на этом компьютере с использованием двойной загрузки. Обратите внимание, что я сам не устанавливал эту машину.
Диспетчер задач Windows правильно отображает 80 логических ядер. Эти 80 ядер также доступны в Linux, если посмотреть в / proc.
При запуске PBRT (https://www.pbrt.org/) в Linux приложение правильно использует (и насыщает) 80 ядер.
Однако в Windows процесс использует только 40 логических ядер из 80. Я не проверял, но почти уверен, что PBRT использует std :: thread :: hardware_concurrency (), это хороший способ определить количество ядер. Если я заставлю PBRT использовать 80 потоков благодаря параметру командной строки, диспетчер задач Windows не покажет, что все ядра загружены. Только половина из них. Мне кажется, что один процесс Windows не может использовать все 80 логических ядер.
Это ограничение Windows? Это удивительно.
Должен ли я установить определенную версию Windows, чтобы убедиться, что все ядра доступны для одного процесса?
Есть ли в Windows какие-то лицензионные ограничения, которые искусственно ограничивают вас?
на процессор приходится 40 логических ядер. Да, я могу использовать все 80 логических ядер, если я запускаю два процесса PBRT одновременно. Я вижу это в диспетчере задач.
@PeterCordes, насколько мне известно. Я подтверждаю, что PBRT использует std :: thread :: hardware_concurrency (), как я вижу в коде. Функция, вероятно, возвращает 40 (а не 80) в Windows.
В этом есть смысл. В зависимости от рабочей нагрузки (и объема кэша на поток) выполнение 1 потока на физическое ядро может быть лучше, чем 1 поток на логическое ядро. Но если планировщик ОС выполняет ужасную работу по поддержанию занятости всех физических ядер, тогда это проблема. Кроме того, некоторые рабочие нагрузки действительно выигрывают от запуска нескольких потоков на каждое физическое ядро, чтобы скрыть пропуски переходов, задержку выполнения инструкций и т. д. (даже некоторый код с высокой пропускной способностью, такой как кодирование видео x265, получает небольшое ускорение из-за Hyperthreading на Skylake, примерно на 15% в прошлом, которое я тестировал.)
Это 40 логических ядер на одном ЦП или 40 физических ядер на двух ЦП? Можете ли вы как-нибудь использовать все 80, например запустив два экземпляра или используя инструмент тестирования потоков?