Microsoft acaba de renovar su Shader Model con la versión 6.6, entre las novedades hay una que nos da una pista sobre cómo serán las GPUs que podremos encontrar en el mercado a corto plazo o se ha mantenido oculta hasta el momento, esperando que los usuarios la puedan utilizar.
La simbiosis entre DirectX y los diseñadores de hardware es clara, la API de Microsoft permite comunicarse con los diferentes componentes como la GPU a partir de un modelo abstracto de los mismos y les permite a los desarrolladores implementar las últimas mejoras en sus juegos. Ya sea para sacar mayor rendimiento o mejores gráficos y sonido.
¿Qué entendemos por Shader Model?
Los shaders son programas que se ejecutan en los núcleos de las GPUs y que modifican los valores de una primitiva gráfica en un determinado punto del pipeline 3D o de datos si hablamos de computación a través de GPU. Dichos programas son escritos en un lenguaje de alto nivel que en el caso del DirectX de Microsoft es llamado HLSL.
A medida que las GPUs van mejorando se van añadiendo nuevas funciones HLSL que permiten el uso de las nuevas funciones de una GPU, algunas de ellas corresponden a futuros diseños de NVIDIA, Intel y AMD que aún no han sido implementados en una GPU comercial, pero si en una a punto de salir al mercado.
¿Qué se ha añadido en el Shader Model 6.6?
Los núcleos de las GPUs, conocidas como unidades shader en general, aunque con nombre como SM por parte de NVIDIA y Compute Unit por parte de AMD, son los encargados de ejecutar los programas. Estos vienen en forma de kernels donde cada kernel es un dato y una instrucción a ejecutar. El dato puede venir en el mismo kernel, puede ser un puntero a memoria o depender del cálculo de un kernel anterior.
Los kernels se agrupan en olas y dependiendo del tamaño de estas el nivel de ocupación en los registros de la unidad shader será mayor o menor. ¿En qué se traduce esto? Pues en el nivel de uso de la unidad shader y por tanto del rendimiento de la misma, ya que puede llevar a que no se use toda la potencia de la GPU para el cálculo ¿El problema? Muchas veces el tamaño de una ola no llega a ocupar todos los registros, provocando que se pierda parte del rendimiento.
¿El cambio en el shader Model 6.6? Ahora va a ser posible crear olas de tamaño variable, lo cual permitirá rellenar los huecos que no se utilizan y por tanto hacer uso de todas las ALUs de cada unidad SIMD, permitiendo con ello un mayor aprovechamiento de las GPUs.
¿Es para las GPUs actuales?
En DirectX no se suelen añadir elementos que no se pueden utilizar con el hardware que hay en el mercado, por lo que podemos suponer que al menos existe una arquitectura de NVIDIA. Intel o AMD que se puede aprovechar de esta novedad. Eso sí, se ha de optimizar el código de los juegos, por lo que no esperéis su añadido en los juegos que saldrán este año, al ser una función que acaba de añadir Microsoft. Aunque va a ayudar a la creación de perfiles optimizados de juegos ya existentes en las GPUs que puedan ejecutar varias olas por unidad SIMD.
Puede ser que NVIDIA y AMD hayan hecho cambios a priori en sus RTX 30 y RDNA 2. Como ocurre con el DirectStorage que se podrá utilizar en las RTX 20. Por lo que nos podemos encontrar con una sorpresa, aunque tampoco podemos descartar a Intel con sus Intel Xe-HPG que debería aparecer este año.
Para permitir el uso de olas de tamaño variable por el programa, es necesario cambiar el planificador o unidad de control de la unidad shader. Por el momento estos están pensados para hacer uso de una sola ola por unidad SIMD, por lo que si no hay registros suficientes ocupados entonces no hay suficientes ALUs. Con este cambio, si por ejemplo una GPU soporta una ola de 32 kernels, entonces podemos tener una ola de 24 componentes y otra de 8 funcionando al mismo tiempo. Este cambio no hace a una GPU más rápido de la que es, sino que hace que rinda más cercana al 100%, eso, si, con el código adecuado.