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 de un montón en uno o varios procesos y evitar una elección no determinista de diseño de textura no definido para los recursos colocados dentro del montón. El uso compartido de montones entre adaptadores también elimina la necesidad de serializar la CPU de los datos.
Se pueden compartir los montones y los recursos confirmados. Compartir un recurso confirmado realmente comparte el montón implícito junto con la descripción del recurso confirmado, de modo que una descripción de recursos compatible se puede asignar al montón desde otro dispositivo.
Todos los métodos son sin subprocesos y heredan la semántica D3D11 existente del diseño de uso compartido de identificadores NT.
- ID3D12Device::CreateSharedHandle
- ID3D12Device::OpenSharedHandle
- ID3D12Device::OpenSharedHandleByName
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.
No se admiten montones compartidos 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.
Impedir una elección no determinista de la disposición indefinida de texturas puede perjudicar significativamente los escenarios de representación diferido 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 dejando de utilizar diseños de textura no deterministas para admitir patrones de de referencia estandarizados y diseños estandarizados de forma eficaz para la representación diferida.
Los montones compartidos también incluyen otros costes menores:
- Los datos de 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 de CPU adicional menor y un mayor uso de memoria del sistema durante la creación y destrucción de montones compartidos.
Uso compartido de montones entre adaptadores
Se especifican montones compartidos entre adaptadores 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 estos diseños de textura no se admiten de otro modo. Algunas restricciones pueden aplicarse a tales texturas, como solo admitir 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 D3D. Los recursos compartidos entre adaptadores solo se admiten en la memoria del sistema. Los montones o recursos compartidos entre adaptadores se admiten en montones D3D12_HEAP_TYPE_DEFAULT y D3D12_HEAP_TYPE_CUSTOM (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 sean coherentes con otras GPU del sistema. Por ejemplo, es posible que el controlador deba excluir los datos del montón de residir en cachés de GPU que normalmente no necesitan vaciarse cuando la CPU no puede acceder directamente a los datos del montón.
La aplicación debe limitar el uso de montones de adaptadores cruzados solo a los 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 o discretas. Además, los diseños de textura más eficaces no siempre están disponibles.
También existen 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 debe establecerse.
- Se deben establecer D3D12_HEAP_TYPE_DEFAULT o D3D12_HEAP_TYPE_CUSTOM con D3D12_MEMORY_POOL_L0 y D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.
- 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.