В Delphi нам нужно знать количество процессоров для распараллеливания. До сих пор мы использовали _1 _, которая отлично работала также с серверами с гиперпоточностью.
Но теперь у нас есть сервер (Intel Xeon Gold 6230) с 40 физическими процессорами и 80 логическими процессорами с гиперпоточностью, а GetNativeSystemInfo()
показывает только 40 процессоров.
Мы сделали небольшую тестовую программу, которая использует 3 вызова:
GetNativeSystemInfo()
GetLogicalProcessorInformation()
(код из Как эффективно определять количество логических и физических процессоров?)И ищем в реестре количество процессоров:
Компьютер \ HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor
Для всех наших серверов эти 3 вызова дают одинаковое количество процессоров:
Но для Intel Xeon только реестр дает нам 80 процессоров:
Кто-нибудь знает, почему он не работает для сервера Intel, или знает способ получить максимальное количество процессоров?
GetLogicalProcessorInformationEx
, вероятно, по причине, которую приводит Фабрицио. Хотя было бы неудивительно, если бы гиперпоточность была отключена в BIOS вашего компьютера, учитывая, что гиперпоточность бесполезна. Вам также может потребоваться разобраться с группами процессоров,SetThreadGroupAffinity
, и с тем фактом, что, насколько мне известно, не существует диспетчера памяти Delphi, который уважает узлы NUMA. - person David Heffernan   schedule 07.08.2019