Compartir a través de


Supervisión del contexto

En este artículo se proporciona información sobre la supervisión del contexto, que permite la sincronización flexible entre motores de GPU o entre núcleos de CPU y motores de GPU. Un objeto de barrera supervisado, que es una forma avanzada de sincronización de barreras, permite que un núcleo de CPU o un motor de GPU señalen o esperen en un objeto de barrera determinado.

Creación de barrera supervisada

El tiempo de ejecución de Direct3D crea un objeto de barrera supervisado llamando a la devolución de llamada CreateSynchronizationObjectCb del controlador en modo de usuario (UMD) con el tipo de objeto de sincronización D3DDDI_MONITORED_FENCE .

Se crea un objeto de barrera supervisada junto con los siguientes atributos:

  • Valor inicial
  • Marcas (especificando su comportamiento de señalización y espera)

Tras la creación, el kernel de gráficos devuelve un objeto de barrera compuesto por los siguientes elementos:

Elemento Descripción
hSyncObject Identificador del objeto de sincronización. Se usa para hacer referencia a él en una llamada al kernel de gráficos.
FenceValueCPUVirtualAddress Asignación de solo lectura del valor de barrera (64 bits) para la CPU. Esta dirección se asigna a WB (almacenable en caché) desde el punto de vista de la CPU en plataformas que admiten la coherencia de E/S, UC (sin almacenar en caché) en otras plataformas. Permite que la CPU realice un seguimiento del progreso de la barrera leyendo esta ubicación de memoria. La CPU no puede escribir en esta ubicación de memoria. Para indicar la barrera, la CPU es necesaria para llamar a SignalSynchronizationObjectFromCpuCb. Los adaptadores que admiten IoMmu deben usar esta dirección para el acceso a GPU. La dirección se asigna como de lectura y escritura en este caso.
FenceValueGPUVirtualAddress Asignación de lectura y escritura del valor de barrera (64 bits) para la GPU. Esta dirección se asigna como requerir la coherencia de E/S en plataformas que lo admiten. Para indicar la barrera, la GPU puede escribir directamente en esta dirección virtual de GPU. Las GPU de IoMmu no deben usar esta dirección.

El valor de barrera es un valor de 64 bits con sus respectivas direcciones virtuales alineadas en un límite de 64 bits. Las GPU deben declarar si son capaces de actualizar de forma atómica valores de 64 bits como visibles por la CPU a través de la marca agregada DXGK_VIDSCHCAPS::No64BitAtomics . Si una GPU solo es capaz de actualizar valores de 32 bits de forma atómica, el sistema operativo controla automáticamente el caso de ajuste de barrera. Sin embargo, coloca una restricción que los valores pendientes de espera y barrera de señal no pueden ser más de UINT_MAX/2 lejos del último valor de barrera señalizado.

Señal de GPU

Si un motor de GPU no es capaz de escribir en una barrera supervisada mediante su dirección virtual, el controlador en modo de usuario (UMD) usa la devolución de llamada SignalSynchronizationObjectFromGpuCb para poner en cola un paquete de señal de software en el contexto de LA GPU.

Para indicar la barrera desde la GPU, el UMD inserta un comando de escritura de barrera en un flujo de comandos de contexto directamente sin pasar por el modo kernel. El mecanismo por el que el kernel supervisa el progreso de la barrera varía en función de si un motor de GPU determinado admite la implementación básica o avanzada de la valla supervisada.

Cuando un búfer de comandos completa la ejecución en la GPU, el kernel de gráficos:

  • Pasa por la lista de objetos de barrera con esperas pendientes que podrían indicarse para este proceso.
  • Lee su valor de barrera actual.
  • Determina si hay esperas que deban cancelarse.

Espera de GPU

Para esperar en una valla supervisada en un motor de GPU, el UMD primero debe vaciar su búfer de comandos pendiente y, a continuación, llamar a WaitForSynchronizationObjectFromGpuCb especificando el objeto de barrera (hSyncObject) y el valor de barrera en el que se espera. El kernel de gráficos pone en cola la dependencia en su base de datos interna y, a continuación, vuelve inmediatamente al UMD para que pueda seguir trabajando en cola detrás de la operación de espera. Los búferes de comandos enviados después de la operación de espera no están programados para su ejecución hasta que se cumpla la operación de espera.

Señal de CPU

Se agregó la devolución de llamada SignalSynchronizationObjectFromCpuCb para permitir que la CPU señale un objeto de barrera supervisado. Cuando la CPU señala un objeto de valla supervisada, el kernel de gráficos actualiza la ubicación de memoria de barrera con el valor señalado. Este valor se vuelve inmediatamente visible para cualquier lector en modo de usuario y deja de ser objeto de esperas satisfechos.

Espera de CPU

Se ha agregado una devolución de llamada WaitForSynchronizationObjectFromCpuCb para permitir que la CPU espere en un objeto de barrera supervisado. Hay dos formas de operaciones de espera disponibles. En el primer formulario, WaitForSynchronizationObjectFromCpuCb se bloquea hasta que se cumpla la espera. En el segundo formulario, WaitForSynchronizationObjectFromCpuCb toma un identificador de un evento de CPU que se señala una vez que se cumple la condición de espera.