Параметры загрузки для тестирования драйверов для поддержки нескольких групп процессоров

Windows 7 и Windows Server 2008 R2 обеспечивают поддержку компьютеров с более чем 64 процессорами. Эта поддержка становится возможной благодаря внедрению групп процессоров. В целях тестирования можно настроить на любом компьютере с несколькими логическими процессорами несколько групп процессоров, ограничив размер группы. Это означает, что можно протестировать драйверы и компоненты на совместимость нескольких групп процессоров на компьютерах с 64 или менее логическими процессорами.

Примечание Концепция групп процессоров, представленная в Windows 7, позволяет существующим API и DIS продолжать работать на компьютерах с более чем 64 логическими процессорами. Как правило, процессоры группы представлены маской сходства, длиной 64 бита. Любой компьютер с более чем 64 логическими процессорами обязательно будет иметь несколько групп. При создании процесса процесс назначается определенной группе. По умолчанию потоки процесса могут выполняться на всех логических процессорах одной группы, хотя сходство потоков может быть явно изменено. Вызовы любого API или DDI, который принимает маску сходства или номер процессора в качестве аргумента, но не номер группы, ограничиваются воздействием на процессоры в группе вызывающего потока или отправкой отчетов о них. То же самое относится к API или DDIs, которые возвращают маску сходства или номер процессора, например GetSystemInfo.

Начиная с Windows 7 приложение или драйвер могут использовать функции, расширяющие устаревшие API. Эти новые функции с поддержкой групп принимают аргумент номера группы, чтобы однозначно определить номер процессора или маску сходства, и, следовательно, могут управлять процессорами за пределами группы вызывающего потока. Взаимодействие между драйверами и компонентами, работающими в разных группах на компьютере, может привести к ошибкам при использовании устаревших API или DDIs. В Windows 7 и Windows Server 2008 R2 можно использовать устаревшие API без поддержки групп. Однако требования к драйверу являются более строгими. Для обеспечения функциональной правильности драйверов на компьютерах с несколькими группами процессоров необходимо заменить любой DDI, который принимает номер процессора или маску в качестве параметра без соответствующей группы процессоров или возвращает номер процессора или маску без соответствующей группы процессоров. Эти устаревшие DDIs, не поддерживающие группу, могут выполняться на компьютере с несколькими группами процессов, так как выводимые группы могут отличаться от целевого вызывающего потока. Поэтому драйверы, использующие эти устаревшие DDIs и предназначенные для Windows Server 2008 R2, должны быть обновлены для использования новых расширенных версий интерфейсов. Драйверы, которые не вызывают функции, использующие маски сходства процессоров или номера процессоров, будут работать правильно, независимо от количества процессоров. Драйверы, вызывающие новые DDIs, могут работать в предыдущих версиях Windows, включая заголовок procgrp.h, вызов WdmlibProcgrpInitialize и связывание с библиотекой совместимости групп процессоров (procgrp.lib).

Дополнительные сведения о новых api-интерфейсах и DDIs с поддержкой групп см. в техническом документе Поддержка систем с более чем 64 логическими процессорами: рекомендации для разработчиков.

Чтобы выявить потенциальные проблемы, связанные с группами процессоров в драйверах и компонентах, можно использовать параметры BCDEdit /set . Два параметра конфигурации загрузки BCD , groupize и maxgroup, могут настроить любой компьютер с несколькими логическими процессорами для поддержки нескольких групп процессоров. Параметр groupaware изменяет поведение определенных DDIs и управляет средой группы в целях тестирования.

Создание нескольких групп процессоров путем изменения размера группы

Параметр groupsize указывает максимальное количество логических процессоров в группе. По умолчанию параметр groupize не задан, и любой компьютер с 64 или менее логическими процессорами имеет одну группу, которая является группой 0.

Примечание Физический процессор или пакет процессора может иметь одно или несколько ядер или процессорных единиц, каждый из которых может содержать один или несколько логических процессоров. Операционная система рассматривает логический процессор как один логический вычислительный механизм.

Чтобы создать несколько групп процессоров, выполните команду BCDEdit /set в окне командной строки с повышенными привилегиями и укажите новое значение maxsize для groupize , которое меньше общего числа логических процессоров. Обратите внимание, что параметр размера группы предназначен для тестирования, и не следует настраивать системы доставки с этим параметром. Для параметра maxsize можно задать любое значение, равное 2 в диапазоне от 1 до 64 включительно. Команда использует следующий синтаксис:

bcdedit.exe /set groupsize maxsize

Например, следующая команда задает максимальное число процессоров в группе в 2.

bcdedit.exe /set groupsize 2

Если компьютер, отличный от NUMA, имеет 8 логических процессоров, при задании параметра groupize значения 2 создается 4 группы процессоров с 2 логическими процессорами каждый.

Группа 0: 1 узел NUMA, содержащий 1 пакет из 2 логических процессоров

Группа 1: 1 узел NUMA, содержащий 1 пакет из 2 логических процессоров

Группа 2: 1 узел NUMA, содержащий 1 пакет из 2 логических процессоров

Группа 3: 1 узел NUMA, содержащий 1 пакет из 2 логических процессоров

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

Если для параметра groupize задано значение меньше числа логических процессоров в физическом пакете процессора (сокете), система переопределяет свою концепцию пакета при перезапуске, чтобы пакет не охватывал группу. Это означает, что API топологии процессора сообщают больше пакетов, чем на самом деле. Это также означает, что ограничения лицензирования процессоров Windows (на уровне пакета) могут препятствовать запуску некоторых пакетов процессора при настройке groupize .

Пакет процессора может охватывать группы, если в нем определено несколько узлов NUMA и система назначает эти узлы разным группам.

Windows ограничивает количество поддерживаемых групп. Это число может измениться с новыми версиями Windows или в выпусках пакетов обновления. Драйверы или компоненты не должны зависеть от количества групп, поддерживаемых Windows как постоянных. Ограничение количества групп может ограничить количество логических процессоров, разрешенных для запуска, если для параметра загрузки groupize используются небольшие значения.

Чтобы удалить параметр groupize, используемый для тестирования, и вернуться к параметру по умолчанию 64 логических процессоров на группу, используйте следующую команду BCDEdit.

bcdedit.exe /deletevalue groupsize

Эта команда эквивалентна параметру groupize равным 64.

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

Параметр maxgroup — это еще один способ создания групп процессоров на компьютере с несколькими логическими процессорами и узлами NUMA. Параметр загрузки maxgroup не влияет на компьютеры, не относящиеся к NUMA.

Чтобы максимально увеличить количество групп, выполните команду BCDEdit /set в окне командной строки с повышенными привилегиями. Команда использует следующий синтаксис:

bcdedit.exe /set maxgroup on

Например, рассмотрим компьютер с 2 узлами NUMA, 1 пакетом процессора на узел и 4 ядра процессора на пакет, что в общей сложности составляет 8 логических процессоров.

Конфигурация группы по умолчанию:

Группа 0: 8 логических процессоров, 2 пакета, 2 узла NUMA

Если ввести командуbcdedt.exe /set maxgroup с последующим перезапуском, команда возвращает следующую конфигурацию группы:

Группа 0: 4 логических процессора, 1 пакет, 1 узел NUMA

Группа 1: 4 логических процессора, 1 пакет, 1 узел NUMA

Обратите внимание, что узлы NUMA назначаются группам таким образом, чтобы максимально увеличить количество групп.

Чтобы вернуться к параметру по умолчанию, используйте следующую команду BCDEdit .

bcdedit.exe /set maxgroup off

Проверьте совместимость Multiple-Group, задав параметр загрузки с учетом групп

В Windows 7 и Windows Server 2008 R2 появился новый параметр BCD (groupaware), который заставляет драйверы и компоненты учитывать несколько групп в среде групп с несколькими процессорами. Параметр groupaware изменяет поведение набора функций драйвера устройства, чтобы выявить несовместимости между группами в драйверах и компонентах. Вы можете использовать параметр загрузки groupaware вместе с параметрами groupize и maxgroup , чтобы проверить совместимость драйверов с несколькими группами, если на компьютере 64 или меньше активных логических процессоров.

Если задан параметр загрузки groupaware , операционная система гарантирует, что процессы запускаются в группе, отличной от группы 0. Это повышает вероятность межгруппового взаимодействия между драйверами и компонентами. Параметр также изменяет поведение устаревших функций, которые не поддерживают группу, KeSetTargetProcessorDpc, KeSetSystemAffinityThreadEx и KeRevertToUserAffinityThreadEx, чтобы они всегда работали с группой с наибольшим числом, содержащей активные логические процессоры. Драйверы, вызывающие любую из этих устаревших функций, следует изменить для вызова своих коллег с поддержкой групп (KeSetTargetProcessorDpcEx, KeSetSystemGroupAffinityThread и KeRevertToUserGroupAffinityThread).

Чтобы проверить совместимость, используйте следующую команду BCDEdit /set .

bcdedit.exe /set groupaware on
Устаревшие функции, не поддерживаемые группами Замена с поддержкой групп Windows 7

KeSetTargetProcessorDpc

KeSetTargetProcessorDpcEx

KeSetSystemAffinityThreadEx

KeSetSystemGroupAffinityThread

KeRevertToUserAffinityThreadEx

KeRevertToUserGroupAffinityThread

Чтобы сбросить компьютер до значения по умолчанию, используйте следующую команду BCDEdit .

bcdedit.exe /set groupaware off