Alguna vez te has preguntado, ¿cómo le da órdenes la CPU a la GPU?

Alguna vez te has preguntado, ¿cómo le da órdenes la CPU a la GPU?

Josep Roca

Desde los albores del uso del ordenador personal, su principal forma de comunicarse con nosotros es a través de una pantalla, por lo que unas veces por segundo el PC ha de generar una imagen que se ha presentar como información ante el usuario. Pero, ¿cómo se comunican la CPU y la GPU para que esta última genere la siguiente imagen a mostrar en pantalla?

Comunicación CPU GPU: El Ring Buffer

ring buffer

La CPU genera una lista de comandos gráficos que le dice a la GPU como ha de generar el siguiente fotograma. Por cada nuevo fotograma se crea una nueva lista de comandos a la que también llamamos Display List, lista de pantalla en español.

La aplicación encargada de generar el fotograma es lo que llamamos una API gráfica, estas APIs son abstracciones de lo que es una GPU a nivel de lenguaje de programación que ayudan a las aplicaciones a comunicarse con la tarjeta gráfica. Su función es la de traducir la lista de cosas a hacer que le manda la aplicación en algo que la propia GPU entienda y para ello es necesario otro participante que es el controlador de la propia GPU o driver, un programa que es utilizado para realizar ese proceso de traducción al código que nuestra GPU en concreto pueda entender.

Una vez dicha lista ha sido generada para que la GPU pueda entenderla esta es almacenada en una parte de la RAM del sistema. La GPU a través de una unidad especial llamada DMA que le permite leer no solo la VRAM sino también la RAM del sistema desde donde leerá la Display List generada por la CPU.

La GPU trata la zona de la memoria donde se encuentra la Display List como un anillo, es decir que cuando llega a la última dirección de memoria asignada del anillo cuando lee la siguiente instrucción se pone automáticamente a 0 el contador de programa y así sucesivamente. Dicho de otra manera, recorre siempre las mismas direcciones de memoria y cada anillo completo es un fotograma por lo que cuando el procesador de comandos de la GPU llega al final del anillo de datos o ring búfer empieza desde cero y con ello empieza un fotograma nuevo.

El Procesador de Comandos de la GPU

El procesador de comandos (CP) es el director de orquesta de la GPU, se encuentra siempre en la parte central de toda GPU independientemente de cuál sea su arquitectura y es el encargado de controlar la GPU y hacer que las cosas se hagan en el orden correcto y con los recursos adecuados.

Lo que hace inicialmente es copiar la lista de comandos en el Ring Buffer a una memoria cercana al procesador de comandos para que pueda operar con ella lo más rápido posible. Una vez hecho esto empieza a generar el fotograma organizando los diferentes elementos de la GPU con tal de que se cumpla la lista de instrucciones.

La forma en la que el CP trata la lista de comandos generada por la CPU es del tipo FIFO del inglés First In – First Out (“Primero en entrar primero en salir”) esto quiere decir que el elemento que entre primero a la Cola será el primero que salga y el último que entre será el último en salir.

Gráficos vs Computación

DX11 vs DX12

Con la llegada de DirectX 11, las GPUs se empezaron a poder ejecutar pequeños programas no relacionados con el renderizado de los gráficos que son llamados Compute Shaders. El problema en DX11 es que, pese a que tenemos varios contextos distintos generados por la CPU, pero a nivel de la GPU solo había un gigantesco anillo por lo que las tareas de computación para ejecutarse dependían de que la GPU pudiese terminar de renderizar a tiempo, fue a partir de DX12 que se han podido utilizar varios contextos y con ello varios anillos de manera simultánea.

Por lo general se utilizan dos tipos de anillos distintos, uno para computación y el otro para gráficos, es común tener un solo anillo para gráficos, pero si queremos renderizar en estéreo, por ejemplo, para realidad virtual. entonces nos interesa tener dos anillos de comandos para gráficos.

colas gpu

En el caso de los anillos para computación es distinto y suelen estar compuestos por varios sub-anillos y su ejecución es completamente asíncrona con el renderizado de la imagen, por lo que el inicio y el final de las listas de computación es independiente del inicio y el final del fotograma.

Cuando tenemos anillos de computación trabajando en paralelo a anillos para gráficos entonces no tenemos uno solo sino varios procesadores de comandos pero el que tiene siempre preferencia es el anillo para gráficos a no ser que nos encontremos con una GPU cegada y por tanto que se utilice para otras tareas que no sean las de generar gráficos como por ejemplo el uso de estas en computación científica.