Как получить правильное количество логических процессоров

В Delphi нам нужно знать количество процессоров для распараллеливания. До сих пор мы использовали _1 _, которая отлично работала также с серверами с гиперпоточностью.

Но теперь у нас есть сервер (Intel Xeon Gold 6230) с 40 физическими процессорами и 80 логическими процессорами с гиперпоточностью, а GetNativeSystemInfo() показывает только 40 процессоров.

Мы сделали небольшую тестовую программу, которая использует 3 вызова:

  1. GetNativeSystemInfo()

  2. GetLogicalProcessorInformation() (код из Как эффективно определять количество логических и физических процессоров?)

  3. И ищем в реестре количество процессоров:

    Компьютер \ HKEY_LOCAL_MACHINE \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor

Для всех наших серверов эти 3 вызова дают одинаковое количество процессоров:

image

Но для Intel Xeon только реестр дает нам 80 процессоров:

image

Кто-нибудь знает, почему он не работает для сервера Intel, или знает способ получить максимальное количество процессоров?


person Toke    schedule 07.08.2019    source источник
comment
Я лично использую GetLogicalProcessorInformationEx, вероятно, по причине, которую приводит Фабрицио. Хотя было бы неудивительно, если бы гиперпоточность была отключена в BIOS вашего компьютера, учитывая, что гиперпоточность бесполезна. Вам также может потребоваться разобраться с группами процессоров, SetThreadGroupAffinity, и с тем фактом, что, насколько мне известно, не существует диспетчера памяти Delphi, который уважает узлы NUMA.   -  person David Heffernan    schedule 07.08.2019
comment
В документации MSDN по этой теме есть целая глава: Несколько процессоров, и в частности Вспомогательные системы с более чем 64 процессорами   -  person Remy Lebeau    schedule 07.08.2019
comment
Спасибо за помощь. Это не наши серверы и включена гиперпоточность. Мы не используем ЦП в Workbench, но создаем код Fortran, который будет использовать количество ЦП, которое мы ему указываем. Мы рассмотрим GetLogicalProcessorInformationEx   -  person Toke    schedule 07.08.2019


Ответы (2)


Чтобы запросить количество логических процессоров больше 64, вы должны использовать новый GetLogicalProcessorInformationEx API, который NumCPULib4Pascal Обертка библиотеки удобна в использовании.

К сожалению, я не могу вставить сюда полный код, потому что он не подходит для ограничения количества слов в StackOverflow.

Пример использования ниже:

uses
  NumCPULib;

var
  lcc, pcc: Int32;
begin
  // count logical cpus
 lcc := TNumCPULib.GetLogicalCPUCount();
  // count physical cpus
 pcc := TNumCPULib.GetPhysicalCPUCount();
end;
person Xor-el    schedule 07.08.2019
comment
Боюсь, что иногда такое бывает. И люди часто не хотят критиковать, потому что это может привести к бесполезным обсуждениям. А иногда и обратные косые черты реваншистского голосования. А иногда у людей просто нет времени. С моей точки зрения, я бы сказал, что этот ответ не объясняет, почему возникает такое поведение в вопросе. Это не говорит о том, почему эта библиотека также не страдает от той же проблемы. И это также близко к тому, чтобы быть ответом только на ссылку на сторонний код. Как правило, желательно не иметь ответов только по ссылкам. - person David Heffernan; 07.08.2019
comment
@ Дэвид Хеффернан, спасибо за ваше объяснение, и вы правы, что мой ответ на самом деле не отвечает на вопрос, почему, а просто предлагает решение. Обновит ответ соответствующей информацией. - person Xor-el; 07.08.2019
comment
Я рекомендую вам преобразовать это в комментарий. - person David Heffernan; 07.08.2019
comment
THnaks за помощь. Использование библиотеки NumCPULib4Pascal работало. - person Toke; 24.09.2019

В документации GetLogicalProcessorInformation я нашел эту часть :

В системах с более чем 64 логическими процессорами функция GetLogicalProcessorInformation извлекает информацию о логических процессорах о процессорах в группа процессоров, которой в данный момент назначен вызывающий поток. Используйте функцию GetLogicalProcessorInformationEx для получения информации о процессорах во всех группах процессоров в системе.

Поэтому попробуйте использовать GetLogicalProcessorInformationEx.

person Fabrizio    schedule 07.08.2019