Buenas gente.
@papatuelo por partes, pq es muy normal hacerse
un lío con estas cosas sobre todo cuando se llaman igual, aunq sean cosas totalmente diferentes
.
En
este caso tenemos que distinguir el frontend
y el backend de una GPU
y el frontend
y el backend de
un compilador como se hace referencia en esa diapositiva. Generalmente dentro de una GPU se le llama frontend al command processor junto con el planificador general de la GPU, los ACEs... es decir todo lo q esté relacionado con realizar el trabajo previo al envío de tareas
a las unidades de computo. Por otra parte el backend de una GPU son las ROPs, que se encargan de realizar ciertas tareas específicas sobre los pixeles, como por ejemplo el antialiasing,
y de escribir los resultados en memoria. "En medio" están las CUs, que son las que realmente realizan "los calculos".
Por otra parte con respecto
a esa diapositiva
y como dejaba entrever
@darksch, nos encontramos con el frontend
y el backend de
un compilador.
Un compilador es "
un conjunto de programas" que se encargan de "traducir" el código que
un programador escribe en
un lenguaje de alto nivel, como puede
ser C/C++,
a un lenguaje propio de la máquina (conjunto de instrucciones, registros...), que es el q el procesador ejecutará directamente sobre el hardware.
En
un poco denso
y tengo que reconocer que
un poco coñazo xD. Los compiladores se dividen en varias etapas: frontend, middle end
y backend, aunque generalmente middlend
y backend suelen agruparse en backend
a secas. El frontend se encarga de coger el código escrito por el programador
y realizar una serie de operaciones como análisis léxico, sintáctico...
y mil millones de cosas supercomplicadas que entienden muy pocos elegidos
. Esta primera etapa genera
un código intermedio el cual se le pasa al middle/backend, que se encarga de realizar una serie de análisis, optimizaciones
y otros mil millones de cosas mas que entienden los mismos elegidos de antes
y por último genera el código máquina final propiamente dicho.
Existen muchos frontend
y backend para desarrollar, entre los que encontramos dos que suelen ir cogiditos de la mano que son Clang (frontend)
y LLVM (backend). Clang soporta muchos lenguajes de entrada entre ellos HLSL (el lenguaje de programación que se usa para escribir los shaders/programas de una GPU en DirectX). Por su parte LLVM puede generar, en vez del código máquina final,
un código intermedio con todas las optimizaciones
y análisis realizados en etapas anteriores (comportándose como
un middlend puro). En
este caso, LLVM genera
un código llamado DXIL (DirectX Intermediate Language) común para todos los fabricantes de GPUs. Cuando queremos cargar
un shader en la GPU, cada driver (AMD, Nvidia, Intel...) coge
este código intermedio
y lo traduce al juego de instrucciones propias que cada GPU posee (código máquina de la GPU en cuestión). En el mismo paper te viene una diapositiva que lo explica:
WARP es
un rasterizador software para DirectX, es decir, DirectX ejecutado por una CPU en vez de por una GPU. Su uso fundamental es para comprobar que todo lo q has programado está correcto, sobre todo si tu hardware no tiene disponibles ciertas características. Se usa para validación
y depuración.
HLSL soporta varias versiones de shader models los cuales son, podemos decir,
un conjunto de características
y funcionalidades
a bajo nivel. Cuando escribes
un shader en HLSL
y lo compilas obteniendo el código intermedio que te contaba antes,
este debe saber que características puede usar para generar dicho código. Con la nueva versión de HLSL solo se
va a dar soporte de Shader Model 5.0 en adelante, esto no tiene nada que ver con que en XboxOne todo el tinglado anterior del compilador
y demás esté funcionando ya,
y tampoco tiene que ver con las feature levels de cada máquina.
Un saludo.