Blog Personal.

Uncategorized

Xbox Series X (IV): GPU Custom Command Processor.


Las GPUs no son CPUs en el sentido de que no ejecutan programas propiamente dichos sino una lista de tareas o varias listas enviadas por una o varias CPUs dependiendo de la API.

La imagen tiene un atributo ALT vacío; su nombre de archivo es dx11-to-dx12_zpsj4qm3yiy.jpg

Pero hay una parte de ellos que si que ejecutan programas, son las llamadas Compute Units en el caso de las GPUs de AMD siendo esos programas los llamados «Shaders» pero con una particularidad, todos esos programas están realizados con un lenguaje de alto nivel y son compilados para cada arquitectura.

Pues bien, el problema de esto es que incluso dentro de una misma familia de GPUs el conjunto de registros e instrucciones es dispar, esto en las CPU no se puede hacer porque entonces los binarios no serían compatibles pero en las GPUs se hace. ¿Que provoca esto? Pues que el código de los shaders no esta compilado sino que se compila al vuelo para una GPU determinada, normalmente en las pantallas de carga entre niveles… ¿Y quien hace este trabajo? La CPU.

Pero situémonos en lo que es una consola, hardware fijo que no va a cambiar durante años por lo que tiene sentido hacer que el código no se tenga que compilar… ¿cierto? Pues no, el motivo de ello es que el hecho de que los shaders no estén compilados permite por ejemplo que versiones abaratadas o las potenciadas no tengan exactamente el mismo conjunto de registros e instrucciones por lo que siempre vas a tener el compilador de los shaders funcionando en la CPU.

Pero Microsoft ha roto esto en Xbox Series X, lo que ha hecho es que el procesador de comandos sea capaz de traducir las instrucciones de manera directa desde el HLSL para DirectX y trasladarlas al vuelo sin que intervenga la CPU y liberando a parte de esta del trabajo en ello y por tanto no requiriendo un compilador de estos corriendo en una parte de la CPU.

Si nos vamos a Vulkan, con el que todas las arquitecturas han de ser compatibles nos encontramos con algo curioso:

A diferencia de las API anteriores, el código de sombreador en Vulkan debe especificarse en un formato de código de bytes en lugar de una sintaxis legible para humanos como GLSL y HLSL. Este formato de bytecode se llama SPIR-V y está diseñado para usarse con Vulkan y OpenCL (ambas API de Khronos). Es un formato que se puede usar para escribir gráficos y calcular sombreadores, pero nos centraremos en los sombreadores utilizados en las canalizaciones de gráficos de Vulkan en este tutorial.

Trasladar de bytecode a binario es más simple que no desde alto nivel. Pero esto es con Vulkan… ¿Ocurre lo mismo en DirectX? Pues en DirectX desde tiempos inmemoriables el llamado P-Code que es un tipo de Bytecode intermedio en el que se pre-compilan los Shaders en HLSL, luego el controlador de cada GPU se encarga de pasar ese bytecode al binario de esa arquitectura. Esto significa que lo que tenemos en la GPU de Xbox Series X es un traductor del bytecode para DirectX de manera directa sin intervención de un compilador externo.

Esto es todo, tenéis el Discord y los comentarios de esta entrada para comentarla.

0 0 vote
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Steven

Hola disculpa la duda no tendrá driver?