Цикл C # parallel.for полностью использует ядра CPU1, но не CPU2

Метод C #, который использует parallel.for, полностью использует все ядра в 10-ядерном процессоре (на двойной рабочей станции Windows 10 с ОЗУ Xeon 64 ГБ), но не использует какие-либо другие доступные 10 физических ядер на втором процессоре. Несмотря на то, что сходство процесса (в диспетчере задач) указывает на то, что ему доступны все ядра. Есть какие-нибудь мысли / подходы, чтобы заставить процесс использовать все доступные ядра? Я действительно вижу значительное улучшение производительности при переходе от стандартного кодирования к parallel.for в этом случае; жаль отказываться от очередного 100% прироста скорости. Спасибо.

ВАЖНОЕ НАБЛЮДЕНИЕ: в диспетчере задач очевидно, что ядра, которые действительно использует процесс, распределены между обоими процессорами Xeon. IOW, он использует примерно половину ядер каждого процессора.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Environment.ProcessorCount = 32. Хотя в системе 20 физических ядер и, следовательно, 40 логических ядер. И очевидно, что процесс НЕ использует все эти 32 ядра. Он использует не более 20. FWIW, на одноядерном i7-3770 процесс работает должным образом, используя почти 100% из 8 доступных логических ядер.

ДОПОЛНИТЕЛЬНО 2: Изменения конфигурации, предложенные Luaan, не повлияли на количество доступных процессоров: по-прежнему 32.

ДОПОЛНИТЕЛЬНО 3: 64-разрядная версия Windows 10 Pro.


person AlgoUser    schedule 18.04.2016    source источник
comment
Сколько ядер вы указали в msconfig.exe?   -  person Alex    schedule 18.04.2016
comment
Эти процессоры на NUMA? Они в одной группе процессоров? Есть ли у .NET доступ к обоим, если их несколько? Отметьте Environment.ProcessorCount, это то, что Parallel.For использует для определения количества создаваемых рабочих. Если вы вручную создаете дополнительные потоки, не перегружают ли они второй ЦП?   -  person Luaan    schedule 18.04.2016
comment
Как вы делаете всю свою обработку? мой мерзкий искатель хакерских файлов, похоже, использует все доступные ему ядра, он использует комбинацию задач и параллельных форм   -  person BugFinder    schedule 18.04.2016
comment
Кстати, вы никогда не получите еще одно 100% улучшение, данные необходимо копировать в кеш этих отдельных ядер.   -  person MeTitus    schedule 18.04.2016
comment
Проверьте свою BIOS, есть ли расширенные настройки для назначения каждому сокету дополнительной группы процессоров. Серверы HP известны тем, что включают его по умолчанию.   -  person Alois Kraus    schedule 18.04.2016
comment
Какую версию Windows 10 вы используете? Для некоторых выпусков есть ограничения. К сожалению, я не нашел для этого точного источника.   -  person Alois Kraus    schedule 18.04.2016


Ответы (1)


Я собираюсь угадать здесь - ваши два процессора находятся в двух разных группах процессоров. По умолчанию .NET использует только одну группу процессоров.

Минимальная конфигурация, необходимая для расширения этой поддержки, следующая:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

См. Thread_UseAllCpuGroups и Processor Groups для справки.

Это также описано в документации MSDN для Environment.ProcessorCount:

Если текущий компьютер содержит несколько групп процессоров, это свойство возвращает количество логических процессоров, доступных для использования средой CLR.

person Luaan    schedule 18.04.2016
comment
Это официальный способ сделать это? Похоже, что кое-что, что, на мой взгляд, должно произойти по умолчанию, в любом случае требует некоторой работы. - person user9993; 18.04.2016
comment
@ user9993 Вы когда-нибудь работали с многопроцессорными системами? Они даже сложнее простых многопоточных систем. Вы бы не хотели получать случайные исключения по умолчанию только потому, что вы запускали настольное приложение .NET в многопроцессорной системе, не так ли? Значения по умолчанию всегда являются самым безопасным вариантом, не обязательно самым эффективным. Не говоря уже о том, что использование GC для нескольких процессоров (особенно на NUMA) является более сложной задачей. Большинство приложений не знают, как работать с такими системами, потому что вы не используете их в настольных системах. - person Luaan; 18.04.2016