¿Cuántas colas directas / de cómputo / copia son significativas?

11

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.

Wumpf
fuente
1
No creo que haya ninguna manera significativa de hacer ese tipo de juicio en este momento, aparte de verificar quién fabrica la GPU. En última instancia, hay más factores que simplemente "puede el hardware ejecutar comandos desde múltiples colas simultáneamente", y D3D12 abstrae esos detalles. De hecho, D3D12 ni siquiera distingue entre hardware que podría ejecutar colas simultáneamente y aquellos que podrían hacerlo secuencialmente, los documentos solo dicen que su abstracción permite la ejecución concurrente.
MJP
1
buena pregunta ! También creo que sería especial obtener rendimiento para ejecutar cómputo y sombreado simultáneamente. tal vez las ganancias puedan suceder gracias a los mismos hechos que hacen que el hyperthreading de alguna manera sea más rápido. operaciones de intercalado cuando algunas unidades están ocupadas por la otra cola. como sombreadores que obstruyen las unidades de textura, que no son utilizadas por la etapa de cálculo, que a su vez obstruye la FPU o la DPU.
v.oddou
Hm muy mal. Tal vez entonces "aparte de verificar quién fabrica la GPU, no" ya cuenta como respuesta si no hay más. Después de leer todas esas cosas de marketing de AMD, me alegra saber que no estoy solo con mi confusión.
Wumpf
1
Sabes solo para poner un poco de peso en la importancia (en realidad, UNimportance) de este asunto. El SDK de PS4 tiene un error que no permite emitir a ninguna otra cola que no sea la cola 0. Creo que si fuera tan crucial, se habría solucionado más rápido.
v.oddou

Respuestas:

1

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.

"... el dispositivo puede ejecutar colas de comandos simultáneamente ..."

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.

Andreas
fuente
El GCN de AMD ejecutará gráficos y calculará simultáneamente, incluso cuando ambos se emitan en la cola de gráficos, pero generalmente no a través de múltiples buffers de comandos (las llamadas de sorteo múltiples incluso pueden ser incompletas). El controlador (o la aplicación, creo que en DX12 o Vulkan) debe verificar las dependencias de datos y bloquear entre dibujar (gráficos) y enviar (calcular) si es necesario. Las colas de comandos múltiples probablemente serían útiles si tiene un cálculo que es realmente asíncrono de los gráficos (como la física para el siguiente cuadro), pero no tengo experiencia directa con esto.
Daniel M Gessel