Optimizaciones de UMA: texturas accesibles por CPU y referencias estándar
Las GPU de arquitectura de memoria unificada (UMA) ofrecen algunas ventajas de eficiencia sobre GPU discretas, especialmente al optimizar para dispositivos móviles. Proporcionar a los recursos acceso a la CPU cuando la GPU es UMA puede reducir la cantidad de copia que se produce entre la CPU y la GPU. Aunque no se recomienda que las aplicaciones de forma ciega proporcionen acceso a la CPU a todos los recursos en diseños de UMA, hay oportunidades para mejorar las eficiencias al proporcionar acceso a la CPU de los recursos adecuados. A diferencia de las GPU discretas, la CPU puede tener técnicamente un puntero a todos los recursos a los que puede acceder la GPU.
- Información general sobre las texturas accesibles para CPU
- Introducción a Standard Swizzle
- API
- Temas relacionados
Información general sobre las texturas accesibles para CPU
Las texturas accesibles para cpu, en la canalización de gráficos, son una característica de la arquitectura de UMA, lo que permite que las CPU lean y escriban acceso a las texturas. En las GPU discretas más comunes, la CPU no tiene acceso a texturas en la canalización de gráficos.
El consejo general de procedimientos recomendados para texturas es dar cabida a GPU discretas, lo que normalmente implica seguir los procesos de carga de datos de textura a través de búferes, resumidos como:
- No tiene acceso de CPU para la mayoría de las texturas.
- Establecer el diseño de textura en D3D12_TEXTURE_LAYOUT_UNKNOWN.
- Carga de las texturas en la GPU con CopyTextureRegion.
Sin embargo, en determinados casos, la CPU y la GPU pueden interactuar con tanta frecuencia en los mismos datos, que las texturas de asignación son útiles para ahorrar energía o para acelerar un diseño determinado en determinados adaptadores o arquitecturas. Las aplicaciones deben detectar estos casos y optimizar las copias innecesarias. En este caso, para obtener el mejor rendimiento, tenga en cuenta lo siguiente:
Comience solo a entretener el mejor rendimiento de las texturas de asignación cuando D3D12_FEATURE_DATA_ARCHITECTURE::UMA es TRUE. A continuación, preste atención a CacheCoherentUMA si decide qué propiedades de caché de CPU elegir en el montón.
Aprovechar el acceso de CPU para texturas es más complicado que para los búferes. Los diseños de textura más eficaces para GPU rara vez se row_major. De hecho, algunas GPU solo pueden admitir row_major texturas al copiar datos de textura alrededor.
Las GPU de UMA deben beneficiarse universalmente de una optimización sencilla para reducir los tiempos de carga de nivel. Después de reconocer UMA, la aplicación puede optimizar la copyTextureRegion inicial para rellenar las texturas que la GPU no modificará. En lugar de crear la textura en un montón con D3D12_HEAP_TYPE_DEFAULT y serializar los datos de textura a través, la aplicación puede usar WriteToSubresource para evitar comprender el diseño de textura real.
En D3D12, las texturas creadas con D3D12_TEXTURE_LAYOUT_UNKNOWN y sin acceso a LA CPU son las más eficaces para la representación y el muestreo frecuentes de GPU. Al realizar pruebas de rendimiento, esas texturas deben compararse con D3D12_TEXTURE_LAYOUT_UNKNOWN con acceso a CPU y D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE con acceso a CPU y D3D12_TEXTURE_LAYOUT_ROW_MAJOR para la compatibilidad con varios adaptadores.
El uso de D3D12_TEXTURE_LAYOUT_UNKNOWN con acceso a cpu permite los métodos WriteToSubresource, ReadFromSubresource, Map (excluyendo el acceso de la aplicación al puntero) y Unmap; pero puede sacrificar la eficacia del acceso a GPU.
El uso de D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE con acceso a CPU habilita WriteToSubresource, ReadFromSubresource, Map (que devuelve un puntero válido a la aplicación) y Unmap. También puede sacrificar la eficacia del acceso a GPU más de D3D12_TEXTURE_LAYOUT_UNKNOWN con acceso a CPU.
Introducción a Standard Swizzle
D3D12 (y D3D11.3) presentan un diseño de datos multidimensional estándar. Esto se hace para permitir que varias unidades de procesamiento funcionen en los mismos datos sin copiar los datos ni girar los datos entre varios diseños. Un diseño estandarizado permite aumentar la eficacia a través de los efectos de red y permite a los algoritmos hacer recortes cortos suponiendo un patrón determinado.
Para obtener una descripción detallada de los diseños de textura, consulte D3D12_TEXTURE_LAYOUT.
Tenga en cuenta que este swizzle estándar es una característica de hardware y es posible que no sea compatible con todas las GPU.
Para obtener información general sobre el giro, consulte la curva de orden Z.
API existentes
A diferencia de D3D11.3, D3D12 admite la asignación de texturas de forma predeterminada, por lo que no es necesario consultar D3D12_FEATURE_DATA_D3D12_OPTIONS. Sin embargo, D3D12 no siempre admite swizzle estándar: esta característica deberá consultarse con una llamada a CheckFeatureSupport y comprobar el campo StandardSwizzle64KBSupported de D3D12_FEATURE_DATA_D3D12_OPTIONS.
Asignación de texturas de referencia de las API siguientes:
Enumeraciones
- D3D12_TEXTURE_LAYOUT : controla el patrón swizzle de texturas predeterminadas y habilita la compatibilidad con mapas en texturas accesibles por CPU.
Estructuras
- D3D12_RESOURCE_DESC : describe un recurso, como una textura, que es una estructura ampliamente utilizada.
- D3D12_HEAP_DESC : describe un montón.
Métodos
- ID3D12Device::CreateCommittedResource : crea un único recurso y un montón de respaldo del tamaño y la alineación correctos.
- ID3D12Device::CreateHeap : crea un montón para un búfer o textura.
- ID3D12Device::CreatePlacedResource: crea un recurso que se coloca en un montón específico, normalmente un método más rápido de crear un recurso que CreateHeap.
- ID3D12Device::CreateReservedResource : crea un recurso reservado, pero aún no confirmado o colocado en un montón.
- ID3D12CommandQueue::UpdateTileMappings : actualiza las asignaciones de ubicaciones de iconos en recursos en mosaico a ubicaciones de memoria en un montón de recursos.
- ID3D12Resource::Map : obtiene un puntero a los datos especificados en el recurso y deniega el acceso de GPU al subrecurso.
- ID3D12Resource::GetDesc : obtiene las propiedades del recurso.
- ID3D12Heap::GetDesc obtiene las propiedades del montón.
- ReadFromSubresource: copia datos de una textura que se asignó mediante Map.
- WriteToSubresource: copia los datos en una textura que se asignó mediante Map.
Los recursos y los montones primarios tienen requisitos de alineación:
- D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4 MB) para texturas de varias muestras.
- D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 KB) para texturas y búferes de ejemplo únicos.
- La copia lineal de subrecursos debe alinearse con D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 bytes), y el tono de fila se alinea con D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 bytes).
- Las vistas de búfer de constantes deben alinearse con D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 bytes).
Las texturas inferiores a 64 KB deben procesarse a través de CreateCommittedResource.
Con texturas dinámicas (texturas que cambian cada fotograma), la CPU escribirá linealmente en el montón de carga, seguido de una operación de copia de GPU.
Normalmente, para crear recursos dinámicos, cree un búfer grande en un montón de carga (consulte Suballocation Dentro de búferes). Para crear recursos de almacenamiento provisional, cree un búfer grande en un montón de reescritura. Para crear recursos estáticos predeterminados, cree recursos adyacentes en un montón predeterminado. Para crear recursos con alias predeterminados, cree recursos superpuestos en un montón predeterminado.
WriteToSubresource y ReadFromSubresource reorganizan los datos de textura entre un diseño principal de fila y un diseño de recursos indefinido. La operación es sincrónica, por lo que la aplicación debe tener en cuenta la programación de CPU. La aplicación siempre puede dividir la copia en regiones más pequeñas o programar esta operación en otra tarea. Estos recursos de MSAA y recursos de galería de símbolos de profundidad con diseños de recursos opacos no son compatibles con estas operaciones de copia de CPU y provocarán un error. Los formatos que no tienen un tamaño de elemento de potencia de dos tampoco se admiten y también provocarán un error. Se pueden producir códigos de retorno insuficientes de memoria.
Temas relacionados