DirectX 12 expone las colas de comandos para gráficos (llamados "directos"), tareas de cómputo o copia. En términos de funcionalidad proporcionada, cada uno es un superconjunto del siguiente. La especificación establece que el dispositivo puede ejecutar colas de comandos simultáneamente. Sin embargo, la API no limita el número de colas de comandos de ninguna manera (al menos no conozco ninguna limitación).
Aparentemente, diferentes proveedores manejan esto muy diferente:
- Intel declara en una presentación reciente (diapositiva 23) que actualmente sus GPU no pueden manejar Gráficos y Computación en paralelo y que el motor de copia tiene un rendimiento débil. No recomiendan el uso de múltiples gráficos / colas de cómputo.
- AMD comenzó hace mucho tiempo a anunciar el uso de colas / "sombreadores asíncronos" a partir de Mantle y las consolas de generación actuales. También hay algunos desarrolladores ( ejemplo ) que confirman ganancias de rendimiento significativas al ejecutar tareas de cómputo y gráficos en paralelo.
- Recientemente ha habido un escándalo acerca de que Nvidia no sea compatible con el sombreador asíncrono en el hardware: el uso de gráficos y cola de cómputo separados a la vez parece hacer las cosas más lentas, lo que indica la emulación del controlador. Las operaciones de copia paralela, por otro lado, han sido respaldadas por CUDA durante mucho tiempo, lo que deja en claro que el motor DMA puede funcionar de forma independiente.
¿Hay alguna manera de decidir en tiempo de ejecución si es significativo enviar CommandLists a múltiples CommandQueues en lugar de una sola? (dado que el caso anterior no involucra mucha sobrecarga de ingeniería)
Si bien puedo ver fácilmente cómo es útil realizar operaciones de memoria paralelas a las operaciones de cómputo / gráficos, me parece innecesariamente complicado ejecutar múltiples procesos de cómputo y gráficos en paralelo (a menos que no haya un beneficio de rendimiento importante). Tampoco está claro para mí, cómo esto puede conducir a un rendimiento significativamente mejor de todos modos; excepto en casos patológicos donde muchas tareas secuenciales pequeñas no pueden generar suficiente carga de GPU.
Respuestas:
Envíe su aplicación con una secuencia de evaluación comparativa que pruebe la plataforma real. (Posible respuesta para muchas preguntas, supongo ...)
Sospecho que el rendimiento depende en gran medida de cómo use el hardware. Dado que es poco probable que el hardware instrumente su aplicación hacia atrás, diciéndole qué hacer, elegiría lo que se vea bien en su diseño.
La palabra clave es CAN. No veo ninguna razón por la que un vendedor arruine esto. Al final, es el proveedor de la plataforma (Intel / AMD / Nvidia) el responsable de hacerte un controlador lo suficientemente bueno para que no consideres cambiar de proveedor. Si tienen un "problema de conocimiento" con esta funcionalidad (que por cierto no tiene significado funcional, solo rendimiento), entonces también deberían resolverlo usando lo que saben. Me refiero a llorar en voz alta, el respaldo es algo que ya han implementado; ejecución sincrónica.
El hardware es suficiente vudú como lo es para nosotros los desarrolladores.
fuente