Compartir a través de


Ejecución y sincronización de listas de comandos

En Microsoft Direct3D 12, el modo inmediato de versiones anteriores ya no está presente. En su lugar, las aplicaciones crean listas de comandos y agrupaciones y, a continuación, registran conjuntos de comandos de GPU. Las colas de comandos se usan para enviar listas de comandos que se van a ejecutar. Este modelo permite a los desarrolladores tener más control sobre el uso eficaz de la unidad de procesamiento gráfico (GPU) y la CPU.

Introducción a la cola de comandos

Las colas de comandos de Direct3D 12 reemplazan el tiempo de ejecución y la sincronización de controladores del envío de trabajo en modo inmediato, anteriormente no expuesto al desarrollador, con API para administrar explícitamente la simultaneidad, el paralelismo y la sincronización. Las colas de comandos proporcionan las siguientes mejoras para los desarrolladores:

  • Permite a los desarrolladores evitar ineficiencias accidentales causadas por una sincronización inesperada.
  • Permite a los desarrolladores introducir la sincronización en un nivel superior en el que la sincronización necesaria se puede determinar de forma más eficaz y precisa. Esto significa que el tiempo de ejecución y el controlador de gráficos dedicarán menos tiempo al paralelismo de ingeniería reactiva.
  • Hace que las operaciones costosas son más explícitas.

Estas mejoras habilitan o mejoran los escenarios siguientes:

  • Mayor paralelismo: las aplicaciones pueden usar colas más profundas para cargas de trabajo en segundo plano, como la descodificación de vídeo, cuando tienen colas independientes para el trabajo en primer plano.
  • Trabajo de GPU asincrónico y de prioridad baja: el modelo de cola de comandos permite la ejecución simultánea de trabajos de GPU de prioridad baja y operaciones atómicas que permiten que un subproceso de GPU consuma los resultados de otro subproceso sin sincronizar sin bloquear.
  • Trabajo de proceso de alta prioridad: este diseño permite que los escenarios que requieren interrumpir la representación 3D realicen una pequeña cantidad de trabajo de proceso de alta prioridad para que el resultado se pueda obtener al principio para su procesamiento adicional en la CPU.

Inicialización de una cola de comandos

Las colas de comandos se pueden crear llamando a ID3D12Device::CreateCommandQueue. Este método toma un D3D12_COMMAND_LIST_TYPE que indica qué tipo de cola se debe crear y, por lo tanto, qué tipo de comandos se puede enviar a esa cola. Recuerde que las agrupaciones solo se pueden llamar desde listas de comandos directos y no se pueden enviar directamente a una cola. Los tipos de cola admitidos son:

En general, las listas de comandos y colas de DIRECT aceptan cualquier comando, las colas COMPUTE y las listas de comandos aceptan comandos relacionados con el proceso y la copia, y las colas COPY y las listas de comandos solo aceptan comandos de copia.

Ejecutar listas de comandos

Después de registrar una lista de comandos y recuperar la cola de comandos predeterminada o crear una nueva, ejecute listas de comandos llamando a ID3D12CommandQueue::ExecuteCommandLists.

Las aplicaciones pueden enviar listas de comandos a cualquier cola de comandos desde varios subprocesos. El tiempo de ejecución realizará el trabajo de serializar estas solicitudes en el orden de envío.

El tiempo de ejecución validará la lista de comandos enviada y quitará la llamada a ExecuteCommandLists si se infringe alguna de las restricciones. Las llamadas se quitarán por los siguientes motivos:

Acceso a recursos desde varias colas de comandos

Hay un par de reglas impuestas por el tiempo de ejecución que restringen el acceso de recursos desde varias colas de comandos. Estas reglas son:

  1. Un recurso no se puede escribir en desde varias colas de comandos simultáneamente. Cuando un recurso ha pasado a un estado que se puede escribir en una cola, se considera propiedad exclusiva de esa cola y debe realizar la transición a un estado de lectura o COMÚN (consulte D3D12_RESOURCE_STATES) antes de que otra cola pueda tener acceso a él.

  2. Cuando se encuentra en un estado de lectura, un recurso se puede leer de varias colas de comandos simultáneamente, incluso entre procesos, en función de su estado de lectura.

Para más información sobre las restricciones de acceso a los recursos y el uso de barreras de recursos para sincronizar el acceso a los recursos, consulte Uso de barreras de recursos para sincronizar los estados de los recursos.

Sincronización de la ejecución de la lista de comandos mediante barreras de cola de comandos

La compatibilidad con varias colas de comandos paralelas en Direct3D 12 proporciona más flexibilidad y control sobre la priorización del trabajo asincrónico en la GPU. Este diseño también significa que las aplicaciones deben administrar explícitamente la sincronización del trabajo, especialmente cuando las listas de comandos de una cola dependen de los recursos en los que opera otra cola de comandos. Algunos ejemplos de esto incluyen esperar a que se complete una operación en una cola de proceso para que el resultado se pueda usar para una operación de representación en la cola 3D y esperar a que se complete una operación 3D para que una operación en la cola de proceso pueda acceder a un recurso para escribir. Para habilitar la sincronización de trabajo entre colas, Direct3D 12 usa el concepto de barreras, que se representan en la API mediante la interfaz ID3D12Fence .

Una barrera es un entero que representa la unidad de trabajo actual que se está procesando. Cuando la aplicación avanza la barrera, llamando a ID3D12CommandQueue::Signal, se actualiza el entero. Las aplicaciones pueden comprobar el valor de una barrera y determinar si se ha completado una unidad de trabajo para decidir si se puede iniciar una operación posterior.

Sincronización de recursos a los que acceden las colas de comandos

En Direct3D 12, la sincronización del estado de algunos recursos se implementa con barreras de recursos. En cada barrera de recursos, una aplicación declara los estados antes y después de un recurso. Un ejemplo común es que un recurso pase entre una vista de recursos del sombreador a una vista de destino de representación. En su mayor parte, estas barreras de recursos se administran en las listas de comandos. Cuando se habilitan las capas de depuración, el sistema exige que los estados anteriores y posteriores de todos los recursos coincidan, lo que garantiza que el recurso está en el estado correcto para una operación determinada en una transición de barrera.

Para obtener más información sobre cómo sincronizar el estado de los recursos, consulte Uso de barreras de recursos para sincronizar los estados de los recursos.

Compatibilidad con la cola de comandos para recursos en mosaico

La interfaz ID3D11DeviceContext2 de Direct3D12 proporciona métodos para administrar recursos en mosaico, que se exponen a través de la interfaz ID3D12CommandQueue en Direct3D 12. Esos métodos incluyen:

Método Descripción
CopyTileMappings Copia las asignaciones de un recurso en mosaico de origen en un recurso en mosaico de destino.
UpdateTileMappings Novedades asignaciones de ubicaciones de iconos en recursos en mosaico a ubicaciones de memoria en un montón de recursos.

Para obtener más información sobre el uso de recursos en mosaico en aplicaciones de Direct3D 12, consulta Recursos en mosaico de Direct3D11.

Envío de trabajo en Direct3D 12