Blog Personal.

AMD, Deep Learning, Futuro, Radeon

Confirmado: Tensor Cores en AMD RDNA3

Hay una patente reciente de AMD donde nos habla de la implementacion de lo que la competencia, es decir Nvidia, llama Tensor Cores y que formalmente son llamados son llamados arrays sistólicos. en las propias GPUs de AMD, la podéis encontrar como MATRIX MULTIPLIER WITH SUBMATRIX SEQUENCING donde el array sistolico es llamado Multiplicador de Matrices en la misma, para entender el motivo de ello os recomiendo ver el siguiente video:

Si ya vamos directamente a la patente hay algo que de entrada me ha chocado bastante ya que tenemos referencias a corto plazo de la implementación de este tipo de unidades en CDNA/Arcturus.

Lo que me ha sorprendido es la siguiente parte, lo cual no apunta a CDNA ni ningún derivado de GCN.

Para facilitar la ejecución de las operaciones provistas, la GPU 100 incluye una pluralidad de una unidades de procesamiento SIMD (unidades 102 y 104). Se aprecia que la GPU 100 también incluye modulos adicionales para dar apoyo a alas unidades SIMD como lógica de captación y descodificación (nota de Urian: Unidad de Control) y similares.

Tened en cuenta que lo que es la Compute Unit es el núcleo entero, lo que nos están describiendo es un núcleo con 2 unidades SIMD. ¿Cual es la paradoja? Pues precisamente esa es la configuración en la arquitectura RDNA, la cual esta compuesta por 2 unidades SIMD32 por Compute Unit en vez de 4. En realidad lo que tenemos es un WGP que esta compuesta por 2 Compute Units completas, en realidad ambas Compute Units comparten una serie de memorias como son las caches de constantes y de instrucciones, así como el Scratchpad que es la Local Data Share.

Pero la clave de todo esto es que CDNA al basarse en GCN esta compuesta por unas 4 unidades SIMD por Compute Unit donde la cache de intrucciones y la de constantes se agrupan alrededor de 4 Compute Units.

Por lo que dicha patente no habla de la implementación de arrays sistólicos en CDNA sino en la familia RDNA.

Para multiplicar dos matrices más grandes (por ejemplo, matrices de 16 × 16), la GPU descompone las matrices más grandes en submatrices más pequeñas y almacena las submatrices en los registros de entrada del multiplicador de matrices en una secuencia

Lo que hace es subdividir una matriz de 16×16 en 4 «sub» matrices de 4×4.

Podemos caer en la tentación de que cada submatriz de 4×4 corresponde a una unidad SIMD del WGP pero si leemos un poco más nos podemos encontrar con lo siguiente:

Para soportar la multiplicación de matrices de un conjunto de matrices de entrada 105, cada unidad SIMD incluye un multiplicador de matrices en conjunto con los correspondientes registros de entrada y un correspondiente registro de salida. Por ejemplo, la unidad SIMD 102 incluye un multiplicador de matrices 110, los registros de entrada 106 y 107 y un registro de salida 108. Hay que destacar que el termino registro se refiere a cualquier módulo de almacenamiento que esta configurado para almacenar las matrices (incluyendo las submatrices).

Si aplicamos esta explicación al diagrama de arriba entonces lo que tenemos es la siguiente asignación:

Si nos vamos a la FIG. 4 de la misma patente nos da información adicional sobre el tema.

La FIG. 4 ilustra aspectos adicionales de la SIMD 102 de la FIG. 1 para soportar la secuencia de entrada de submatrices en el multiplicador de matrices 110 de acuerdo con algunas implementaciones. En el ejemplo mostrado, la SIMD 102 incluye un data store 435 conectado a un secuenciados 420. El Data Store 435 es un búfer, una cache, un registro u otro tipo de memoria que almacena las submatrices (por ejemplo la sub-matriz 433) para el multiplicador de matrices 110. El secuenciador 420 es un modulo de hardare configurado para descomponer las matrices de entrada 105 (matriz a y matriz b) en las correspondientes submatrices y almacenarlas en el data store 435.

El secuenciador 430 esta además configurado, de acuerdo a los ciclos de multiplicación, tomar una o más submatrices del data store y cargar ( los datos de cada uno de ellos) en los registros 106 y 107. El secuenciador 430 entonces controla la secuencia de entrada de la submatrrices en el multiplicador de matrices 110 para llevar a cabo la multiplicación de marices de una matriz relativamente grande.

Lo subrayado es importante por el hecho que no podemos cambiar los datos de los registros que necesite utilizar el multiplicador de matrices a una velocidad demasiado rápida o demasiado lenta. Esta es la pista que nos indica que el timing de los registros respecto a las ALUs es distinto a la ejecución tradicional en la unidad SIMD por lo que el secuenciador es necesario para que el dato de los registros siga el tempo del multiplicador de matrices.

Para entenderlo, imaginaos una máquina que va rellenando tartaletas para crear pasteles, si la velocidad de la cadena de montaje no es la adecuada entonces la maquina no apuntará bien y tirara los pasteles fuera de las tartaletas.

Esto nos indica que los registros utilizados son los mismos que los de la unidad SIMD pero por la diferencia de velocidad no en velocidad de reloj sino en ciclos a la hora de solventar ciertas instrucciones toda la secuencia de datos queda tocada y es necesario el secuenciador para el nuevo tipo de unidad integrada.

Para mejorar aún más la eficiencia del procesamiento, una GPU puede incluir hardware dedicado para realizar tipos designados de operaciones matriciales, incluida la multiplicación matricial. Sin embargo, los enfoques convencionales de este hardware dedicado pueden consumir una gran cantidad de energía y, por lo tanto, afectan negativamente el rendimiento del procesador.

El problema del enfoque tradicional que es a través de unidades SIMD es que necesitamos realizar una enorme cantidad de operaciones de datos sobre los registros o la memoria sobre la que estamos operando. Podemos realizar operaciones con matrices utilizando unidades SIMD pero el consumo energético no solamente es mayor por la continuas idas y venidas de datos de los registros, es que para colmo vamos a tardar varios ciclos de reloj adicionales por estos traslados de datos.

En algunas aplicaciones, la unidad SIMD 102 está sincronizada por una señal de reloj (denominada «CLK») y un ciclo de multiplicación del multiplicador de matrices 110 correspondiente a un ciclo de reloj único de la señal de reloj CLK. Es decir, para un ciclo de reloj único de la señal de reloj CLK, el multiplicador de matrices 110 está configurado para generar un producto en el registro 108 basado en operandos de entrada almacenados en los registros de entrada 106 y 107. En otras realizaciones, cada ciclo multiplicador del el multiplicador matricial 110 requiere múltiples ciclos de la señal de reloj CLK.

¿Qué significa esto? Pues que la unidad SIMD tiene un array sistólico asociado ya que estas no son lo suficientemente rápidas para realizar una operación de matrices a semejante velocidad (un ciclo de reloj) por lo que habemus Tensor Core en una GPU de AMD y seguramente en una iteración futura de la arquitectura RDNA.

En algunas aplicaciones, para conservar área en el circuito, el multiplicador de matrices 110 esta configurado para generar el producto de matrices de entrada relativamente pequeñas. Por ejemplo, en algunas encarnaciones el multiplicador 110 es un multiplicador 4x4x4, de tal manera que el multiplicador de matrices 110 esta configurado para multiplicar una matrix 4×4 almacenada en el registro de entrada 106 con una matriz 4×4 almacenada en el registro de entrada 107 para generar (como resultado) una matriz en el registro de salida 108.

Es decir, el mismo planteamiento que tiene Nvidia con sus Tensor Cores que es un array sistólico de 4x4x4 con la capacidad de realizar la multiplicación de una matriz de 4×4 por otra y almacenar el resultado por lo que estamos hablando de un array sistólico con una configuración de 64 ALUs que es precisamente la configuración que tiene Volta y Turing de Nvidia.

Ahora bien, una de las particularidades de este tipo de unidades es que pueden realizar una operación de suma+multiplicación en un solo ciclo.

¿Como? Aquí viene algo curioso, para realizar una suma de matrices no es necesario un hardware muy complejo y lo podemos hacer utilizando unidades SIMD convencionales debido a que funciona de la siguiente manera:

Es decir, en las operaciones de suma (o resta) de matrices con las mismas dimensiones solamente tenemos que sumar (o restar) cada componente de la matriz por su equivalente en posición de la otra para tener el resultado. Esto lo podemos realizar facilmente con una unidad SIMD al contrario que la multiplicación lo que si queremos realizar una operación FMADD solo tenemos que asegurarnos que el registro de salida 108 sean los registro sde entrada para las ALUs de la unidad SIMD por lo que esto significa que en el caso que nos ocupa tanto la unidad SIMD como el array sistolico/unidad matricial comparten registros como ocurre con la solución de Nvidia.

Esto nos re-confirmaria que los registros 106, 107 y 108 son los mismos registros utilizados por las unidades SIMD. Por otro lado hemos de tener en cuenta que las GPUs de Nvidia que hay ahora en el mercado incluyen unos 2 Arrays Sistólicos por unidad SIMD en sus diseños, por lo que tenemos unos 8 Tensor Cores por SM en estos.

En todo caso no sabemos cuantos arrays sistólicos por unidad SIMD va a incluir AMD pero lo que esta claro es que con uno solo el ratio de calculo en FP16 es 4x respecto al ratio de calculo en FP32 en las unidades SIMD y que vía SIMD sobre registro como se utiliza en Xbox Series X (Y posiblemente en PlayStation 5) el ratio como mucho es de 2x y esto sin contar la desventaja en velocidad en lo que a la multiplicación de matrices se refiere donde requiere varios ciclos en el caso de utilizar unidades AIMD.

La idea con la patente de AMD es que ellos van a integrar este tipo de unidades. pero no parece que vayamos a verlas en RDNA2 porque todo apunta (por la información que tenemos a partir de las consolas que no es así) pero este tipo de unidades permiten utilizar algoritmos de escalado por IA como el DLSS que permiten renderizar a menor resolución que la de salida por lo que a afectos prácticos permite que los usuarios puedan jugar a resoluciones más altas utilizando muy pocos recursos. Dado que Nvidia esta utilizando 2 Arrays sistolicos por SIMD uno puede esperar esa cifra como mínimo por parte de AMD con tal de igualar en rendimiento pero es una cifra que desconocemos.

Creo que eventualmente vamos a ver una revisión de las consolas que saldrán en pocos meses utilizando GPUs con mayor cantidad de unidades y arrays sistólicos/redes neurales en las mismas aunque pueda que me equivoque al 100% en ello, en todo caso hay rumorología que afirma que no veremos una PS5 Pro pero si una Xbox Series XX pero ya veremos como acaba la cosa. En todo caso lo que esta claro es que en PC veremos esto implementado si o si en RDNA 3, más que nada para contrarrestar el DLSS de Nvidia no con un algoritmo propio sino con algoritmos generales que funcionen en todas las GPUs en común.

Esto es todo, tenéis los comentarios de esta misma entrada para comentar y no olvideis que tenemos Discord.

5 3 votes
Article Rating
3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Nicco

Por lo que veo la patente fue enviada en 2018 (filled) aunque no ha sido aprobada por la oficina de patentes hasta ahora, por lo que AMD lleva dos años con ello y podría estar más próximo su uso en graficas de lo que esperamos.

Jordi Salas Hernandez

Yo también veo una futura revisión de las futuras consolas, no por términos empíricos como tu desarrollas, si no por que en la generación saliente ya se la clavaron a algunos/varios/muchos y en ms y sony no son tontos. A repetir jugada. Y posiblemente así poder cumplir con promesas rotas de salida. Algo así como lo que paso con la generación saliente y sus 1080p 60fps a salida. Pues nada… bienvenido rt. Un placer. De mierda, pero un placer.

Set

Que CDNA sea GCN todavia es un rumor creo, no hay nada confirmado.