Share via


Montones compartidos

El uso compartido es útil para arquitecturas de varios procesos y varios adaptadores.

Información general sobre el uso compartido

Los montones compartidos permiten dos cosas: compartir datos en un montón en uno o varios procesos, y excluyendo una opción no determinista de diseño de texturas no definida para los recursos colocados dentro del montón. El uso compartido de montones entre adaptadores también elimina la necesidad de calcular las referencias de CPU de los datos.

Se pueden compartir tanto montones como recursos confirmados. Compartir un recurso confirmado comparte realmente el montón implícito junto con la descripción del recurso confirmado, de modo que una descripción de recursos compatible se pueda asignar al montón desde otro dispositivo.

Todos los métodos son subprocesos libres y heredan la semántica D3D11 existente del diseño de uso compartido de controladores NT.

Uso compartido de montones entre procesos

Los montones compartidos se especifican con el miembro D3D12_HEAP_FLAG_SHARED de la enumeración D3D12_HEAP_FLAGS .

Los montones compartidos no se admiten en montones accesibles para CPU: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK y D3D12_HEAP_TYPE_CUSTOM sin D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

La conclusión de una elección no determinista del diseño de textura no definido puede afectar significativamente a escenarios de representación diferidos en algunas GPU, por lo que no es el comportamiento predeterminado para los recursos colocados y confirmados. La representación diferida se ve afectada en algunas arquitecturas de GPU porque los diseños de textura deterministas reducen el ancho de banda de memoria efectivo logrado al representar simultáneamente en varias texturas de destino de representación del mismo formato y tamaño. Las arquitecturas de GPU están evolucionando lejos de aprovechar diseños de textura no deterministas para admitir patrones swizzle estandarizados y diseños estandarizados de forma eficaz para la representación diferida.

Los montones compartidos también incluyen otros costos menores:

  • Los datos del montón compartidos no se pueden reciclar tan flexiblemente como montones en proceso debido a problemas de divulgación de información, por lo que la memoria física es cero con más frecuencia.
  • Hay una sobrecarga adicional de CPU adicional y un mayor uso de memoria del sistema durante la creación y destrucción de montones compartidos.

Uso compartido de montones entre adaptadores

Los montones compartidos entre adaptadores se especifican con el miembro D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER de la enumeración D3D12_HEAP_FLAGS .

Los montones compartidos de adaptadores cruzados permiten que varios adaptadores compartan datos sin serializar los datos entre ellos. Aunque las distintas funcionalidades del adaptador determinan cómo los adaptadores eficientes pueden pasar datos entre ellos, simplemente habilitar copias de GPU aumenta el ancho de banda efectivo logrado. Algunos diseños de textura se permiten en montones de adaptadores cruzados para admitir un intercambio de datos de textura, incluso si no se admiten dichos diseños de textura. Algunas restricciones pueden aplicarse a tales texturas, como admitir solo la copia.

El uso compartido entre adaptadores funciona con montones creados mediante una llamada a ID3D12Device::CreateHeap. A continuación, la aplicación puede crear recursos a través de CreatePlacedResource. También lo permiten los recursos o montones creados por CreateCommittedResource , pero solo para los recursos de D3D12_RESOURCE_DIMENSION_TEXTURE2D principales de fila (consulte D3D12_RESOURCE_DIMENSION). El uso compartido entre adaptadores no funciona con CreateReservedResource.

Para el uso compartido entre adaptadores, se siguen aplicando todas las reglas habituales de uso compartido de recursos entre colas. La aplicación debe emitir las barreras adecuadas para garantizar una sincronización y coherencia adecuadas entre los dos adaptadores. La aplicación debe usar barreras entre adaptadores para coordinar la programación de listas de comandos enviadas a varios adaptadores. No hay ningún mecanismo para compartir recursos entre adaptadores en las versiones de la API de D3D. Los recursos compartidos entre adaptadores solo se admiten en la memoria del sistema. Los montones o recursos compartidos entre adaptadores se admiten en D3D12_HEAP_TYPE_DEFAULT montones y D3D12_HEAP_TYPE_CUSTOM montones (con el grupo de memoria L0 y propiedades de página de CPU de combinación de escritura). Los controladores deben asegurarse de que las operaciones de lectura y escritura de GPU en montones compartidos entre adaptadores son coherentes con otras GPU del sistema. Por ejemplo, es posible que el controlador deba excluir los datos del montón que residen en las memorias caché de GPU que normalmente no necesitan vaciarse cuando la CPU no pueda acceder directamente a los datos del montón.

La aplicación debe limitar el uso de montones de adaptadores cruzados solo a aquellos escenarios que requieren la funcionalidad que proporcionan. Los montones de adaptadores cruzados se encuentran en D3D12_MEMORY_POOL_L0, que no siempre es lo que Sugiere GetCustomHeapProperties . Ese grupo de memoria no es eficaz para arquitecturas de adaptadores NUMA discretos. Además, los diseños de textura más eficaces no siempre están disponibles.

También se aplican las siguientes limitaciones:

  • Las marcas de montón relacionadas con los niveles de montón deben ser D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES.
  • D3D12_HEAP_FLAG_SHARED también se debe establecer.
  • Los D3D12_HEAP_TYPE_DEFAULT deben establecerse o D3D12_HEAP_TYPE_CUSTOM con D3D12_MEMORY_POOL_L0 y D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE deben establecerse.
  • Solo los recursos con D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER se pueden colocar en montones de adaptadores cruzados.
  • No se puede pasar una sesión protegida a la creación del montón cuando se especifica D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER

Para obtener más información sobre el uso de varios adaptadores, consulte la sección Sistemas de varios adaptadores .