Мониторинг контекста
В этой статье содержатся сведения о контекстном мониторинге, который обеспечивает гибкую синхронизацию между ядрами GPU или между ядрами ЦП и ядрами GPU. Отслеживаемый объект ограждения, который является расширенной формой синхронизации ограждения, позволяет либо ядру ЦП, либо движку GPU сигнализировать или ждать на определенном объекте ограждения.
Создание отслеживаемого забора
Среда выполнения Direct3D создает отслеживаемый объект ограждения путем вызова обратного вызова CreateSynchronizationObjectCb драйвера пользовательского режима (UMD) с типом объекта синхронизации D3DDDI_MONITORED_FENCE .
Отслеживаемый объект ограждения создается вместе со следующими атрибутами:
- Начальное значение
- Флаги (с указанием режима ожидания и сигнализации)
После создания графическое ядро возвращает объект ограждения, состоящий из следующих элементов:
Элемент | Описание |
---|---|
hSyncObject | Дескриптор объекта синхронизации. Используется для ссылки на него при вызове графического ядра. |
FenceValueCPUVirtualAddress | Сопоставление значения ограждения только для чтения (64 бита) для ЦП. Этот адрес сопоставляется СБ (кэшируемый) с точки зрения ЦП на платформах, поддерживающих когерентность ввода-вывода, UC (без кэширования) на других платформах. Позволяет ЦП отслеживать ход выполнения ограждения, просто считывая это расположение в памяти. ЦП не может записывать данные в это расположение памяти. Чтобы сообщить о заборе, ЦП требуется для вызова SignalSynchronizationObjectFromCpuCb. Адаптеры, поддерживающие IoMmu, должны использовать этот адрес для доступа к GPU. В этом случае адрес сопоставляется как чтение и запись. |
FenceValueGPUVirtualAddress | Сопоставление для чтения и записи значения ограждения (64 бита) для GPU. Этот адрес сопоставляется как требующий совместного ввода-вывода на платформах, поддерживающих его. Чтобы сообщить о заборе, GPU может выполнять запись непосредственно на этот виртуальный адрес GPU. Графические процессоры IoMmu не должны использовать этот адрес. |
Значение ограждения — это 64-разрядное значение с соответствующими виртуальными адресами, выровненными по 64-разрядной границе. Gpu должны объявлять, способны ли они атомарно обновлять 64-разрядные значения, видимые ЦП, с помощью флага DXGK_VIDSCHCAPS::No64BitAtomics . Если GPU может обновлять только 32-разрядные значения атомарным образом, ОС обрабатывает обтекание ограждения автоматически. Однако оно накладывает ограничение на то, что значения забора ожидания и сигнала не могут превышать UINT_MAX/2 от значения последнего сигнального забора.
Сигнал GPU
Если обработчик GPU не может записывать данные в отслеживаемое ограждение с помощью своего виртуального адреса, драйвер пользовательского режима (UMD) использует обратный вызов SignalSynchronizationObjectFromGpuCb для постановки пакета программного сигнала в контекст GPU.
Чтобы сообщить о барьере из GPU, UMD вставляет команду записи забора в поток команд контекста напрямую, не переходя в режим ядра. Механизм, с помощью которого ядро отслеживает ход забора, зависит от того, поддерживает ли конкретный модуль GPU базовую или расширенную реализацию отслеживаемого ограждения.
Когда буфер команд завершает выполнение на GPU, графическое ядро:
- Просматривает список объектов ограждения с ожидающими ожиданиями, которые могут быть обозначены для этого процесса
- Считывает текущее значение ограждения
- Определяет, есть ли какие-либо ожидания, которые должны быть незаверждаемыми.
Ожидание GPU
Чтобы дождаться отслеживаемого ограждения на обработчике GPU, UMD сначала необходимо очистить буфер ожидающих команд, а затем вызвать WaitForSynchronizationObjectFromGpuCb , указав объект ограждения (hSyncObject) и ожидающееся значение забора. Графическое ядро помещает зависимость в очередь во внутреннюю базу данных, а затем немедленно возвращается в UMD, чтобы продолжить очередь работы за операцией ожидания. Буферы команд, отправленные после операции ожидания, не запланированы для выполнения до тех пор, пока операция ожидания не будет выполнена.
Сигнал ЦП
Добавлен обратный вызов SignalSynchronizationObjectFromCpuCb , позволяющий ЦП сигнализировать отслеживаемого объекта ограждения. Когда ЦП сигнализирует об объекте отслеживаемого ограждения, графическое ядро обновляет расположение памяти ограждения сигнальным значением. Это значение сразу становится видимым для любого средства чтения в пользовательском режиме и немедленно отменяет все ожидания, удовлетворенные.
Ожидание ЦП
Добавлен обратный вызов WaitForSynchronizationObjectFromCpuCb , позволяющий ЦП ожидать отслеживаемого объекта ограждения. Доступны две формы операций ожидания. В первой форме WaitForSynchronizationObjectFromCpuCb блокируется, пока ожидание не будет удовлетворено. Во второй форме WaitForSynchronizationObjectFromCpuCb принимает дескриптор события ЦП, которое подается после выполнения условия ожидания.