Logotipo de Zephyrnet

Cómo optimizar un procesador

Fecha:

La optimización de cualquier sistema es un problema de varias capas, pero cuando se trata de un procesador, hay al menos tres niveles a considerar. Los arquitectos deben ser capaces de pensar más allá de estos límites porque el papel de cada una de las capas debe entenderse y equilibrarse.

El primer nivel de optimización potencial está en el nivel del sistema. Por ejemplo, ¿cómo entran y salen los datos de los núcleos de procesamiento? El siguiente nivel es la arquitectura de los propios núcleos de procesamiento. Esto puede implicar la adopción de un procesador existente o la adición de instrucciones a un núcleo extensible. El último nivel de optimización es el nivel micro-arquitectónico. Aquí es donde se definen las canalizaciones de implementación.

Cuando los sistemas se crean a partir de componentes predefinidos, se restringe la libertad de elección. Pero cuando se va a implementar silicio personalizado, puede ser fácil sentirse abrumado por la cantidad de flexibilidad y profundizar en los detalles antes de que sea apropiado. Se debe mantener una disciplina de arriba hacia abajo.

“La misión es optimizar la ejecución de una tarea o un grupo de tareas”, dijo Gajinder Panesar, miembro técnico de EDA de Siemens. “No se trata del procesador. Se trata del proceso que está tratando de optimizar y, por lo tanto, debe pensar en el sistema que va a lograr la tarea. La forma en que diseña y divide el diseño del sistema es una pregunta clave incluso antes de comenzar a pensar en elegir una CPU y determinar si necesita personalizarla”.

La partición de tareas y la arquitectura del sistema es un desafío. Una vez que se ha comprobado que un procesador se va a utilizar, ese procesador debe optimizarse y personalizarse potencialmente para una determinada tarea o grupo de tareas.

Los procesadores se pueden optimizar por varios motivos, incluidas combinaciones de rendimiento, latencia y potencia. “La especialización de un procesador es básicamente la introducción del paralelismo”, dice Gert Goossens, director senior de herramientas ASIP en Sinopsis. “Puede ser paralelismo a nivel de instrucción, o puede ser paralelismo a nivel de datos. Los vectores de procesamiento pueden ser paralelismo a nivel de tarea, o tal vez implemente una arquitectura de múltiples núcleos. La segunda técnica es la especialización. Se asegura de que las unidades funcionales de su procesador puedan ejecutar cosas en un ciclo que en un procesador tradicional tomaría cientos de ciclos”.

A menudo, el rendimiento y la potencia están estrechamente relacionados. “El ejemplo clásico sería acelerar algunas tareas agregando recursos computacionales”, dice George Wall, director de marketing de productos del grupo de procesadores IP Tensilica Extensa. Cadencia. “El objetivo suele ser producir una implementación de menor energía. La energía es potencia por tiempo. Si personaliza el procesador, generalmente habrá un pequeño aumento en la potencia, que con suerte se compensará con una disminución significativa en el tiempo del ciclo, lo que en general proporcionará una ganancia neta en el lado de la energía”.

Optimización a nivel de sistema
En el caso ideal, el procesador siempre estaría ocupado realizando un trabajo productivo, sin tener que esperar nunca a que los datos estén disponibles. Sin embargo, este rara vez es el caso. Cada ciclo en el que el procesador está inactivo o realiza una tarea especulativa que no se usa, genera tiempo y energía desperdiciados.

“Tienes un procesador y necesitan a alguien que los alimente”, dice Michael Frank, compañero y arquitecto de sistemas en IP de Arteris. “Necesitan caché. Necesitan periféricos como controladores de interrupción que suministren los vectores. Y cuando recibe interrupciones, necesitan SMMU para la virtualización. Hay todo un ecosistema que debe existir alrededor del procesador. No funciona por sí solo. Y luego necesita la infraestructura de caché que alimenta el procesador, porque sus procesadores se han vuelto más rápidos. No puedes hacer que hablen con la memoria remota.

En los sistemas multiprocesador, cada uno de los procesadores debe estar orquestado. "¿Cómo se manejará el acelerador?" pregunta Sharad Chole, científico jefe de Expedera. “¿Dónde va a suceder la orquestación de la carga de trabajo? ¿Qué tipo de ancho de banda se requiere para el acelerador? ¿Cuánto acceso DDR o cuánta memoria compartida se requerirá en el nivel de carga de trabajo? Cuando discutimos las soluciones con los clientes, normalmente se trata de un problema de codiseño de hardware/software. Debe analizar la carga de trabajo y debe definir qué impacto tendrá la carga de trabajo en todo el SoC. Es importante no perderse eso. No estamos optimizando un solo núcleo de CPU. Si optimiza un núcleo de CPU de forma aislada, terminará con una arquitectura de varios núcleos que no es determinista y el rendimiento depende de la compilación. ¿Qué tan bueno es el compilador?”

Fig. 1: Elementos clave en la optimización del procesador. Fuente: Brian Bailey/Ingeniería de semiconductores

Fig. 1: Elementos clave en la optimización del procesador. Fuente: Brian Bailey/Ingeniería de semiconductores

La optimización ocurre en múltiples niveles. “Los sistemas deben analizarse para asegurarse de que la comunicación funcione correctamente y para localizar cualquier cuello de botella”, dice Simon Davidmann, fundador y director ejecutivo de Software Imperas. “Muchos sistemas emplean comunicaciones sofisticadas que pueden ser sincrónicas o asincrónicas. Es como un desafío de planificación de piso, asegurarse de que los datos no se atasquen a medida que fluyen a través del sistema”.

A menudo, esas comunicaciones involucran software. “Debe tener en cuenta el firmware y el software que se ejecutan en el dispositivo porque eso determina si el producto funciona o no”, dice Panesar de Siemens. “Podemos ilustrar esto pensando en los diversos tipos de visibilidad que se pueden brindar. Una vista centrada en la CPU sugeriría que la ejecución de instrucciones de seguimiento debería ser suficiente, pero sin visibilidad de lo que sucede en otras partes del sistema, es un instrumento muy contundente. ¿La red en chip (NoC) está correctamente dimensionada y configurada? ¿El ancho de banda y la latencia de la memoria afectan el rendimiento? Sin una visión a nivel de sistema de factores como estos, todas las personalizaciones de CPU en el mundo no ofrecerán un producto exitoso”.

Algunas de estas decisiones están influenciadas por el tipo de núcleo del procesador. “Las CPU y las GPU pueden realizar un acceso aleatorio a los datos, pero los núcleos de procesamiento de IA son diferentes porque están diseñados para ejecutar un conjunto limitado de algoritmos con flujos de datos muy específicos y bien conocidos”, dice Kristof Beets, vicepresidente de innovación tecnológica de Imagination. Tecnologías. “Esto permite el procesamiento en streaming y permite una lógica mucho más pequeña y menos cachés locales. Las operaciones y los flujos de datos admitidos son más limitados que los de la GPU, y especialmente muy limitados en comparación con lo que admite una CPU”.

Para muchos procesadores, la interfaz de bus puede verse como un limitador. “En algunos casos, las interfaces son iguales o más importantes que el ISA real en términos de creación de un diseño eficiente”, dice Wall de Cadence. “Los procesadores tradicionales suelen tener una interfaz de bus, como una interfaz basada en el protocolo AMBA, para interactuar con otros elementos en el SoC, para conectarse al almacenamiento de la memoria principal y para interactuar con varios dispositivos de E/S. Hay mucho que una interfaz como esa puede escalar, en función de la cantidad de elementos que compiten por esos dispositivos. Parte del proceso de diseño integrado en estos días es considerar si tiene sentido conectar el procesador a un dispositivo en particular a través del bus del sistema. O, ¿puede haber una forma alternativa de interconectarlo? Y esa es otra forma de ampliar el procesador: crear interfaces como interfaces de cola o interfaces de búsqueda, donde estos otros dispositivos pueden conectarse más directamente al procesador”.

Ignorar este tipo de problemas puede conducir a soluciones menos que óptimas. “El movimiento de datos es crítico”, dice Manuel Uhm, director de marketing de Versal en AMD. “La E/S, los cuellos de botella de la memoria, todos tenían que ser pensados. De hecho, hemos duplicado la memoria estrechamente acoplada incorporada, básicamente la memoria del programa, adjunta a cada núcleo. También agregamos algo llamado mem tiles, que básicamente crea el búfer que admite estos núcleos. En realidad, no son parte del núcleo en sí, a diferencia de la memoria de programa estrechamente acoplada, pero son sus propios mosaicos que admiten todo esto. Aprendimos, y el aprendizaje no fue todo acerca de la computación. Se trataba de cómo mueves los datos, es cómo administras la memoria, cómo lo traes todo. La E/S es una gran parte de ese problema”.

Es posible que varias cargas de trabajo más recientes ni siquiera se presten a un por Neumann-como la arquitectura del procesador. “No comenzamos asumiendo que necesitábamos un procesador”, dice Chole de Expedera. “No comenzamos con la arquitectura de von Neumann. Comenzamos con los componentes básicos de las operaciones que se utilizan en una red neuronal, por ejemplo, multiplicación de matrices, convolución, funciones de activación, capas de agrupación. Comenzamos definiendo cómo podríamos hacer esto mejor. Analizamos los costos de hacer esto y cómo asegurarnos de que cada bloque computacional esté siempre ocupado. El problema era asegurarse de que todos los operandos estén disponibles cuando sea necesario realizar el cálculo. Luego construimos una arquitectura que no tiene contrapresión y es completamente determinista”.

Optimización de la arquitectura del procesador
Hasta hace poco, las oportunidades para la optimización de la arquitectura del procesador eran limitadas a menos que estuviera construyendo un procesador completamente personalizado. “La arquitectura de un procesador tiene dos partes”, dice Zdeněk Přikryl, CTO de Codasip. “Primero es el set de instrucciones arquitectura (ISA), y en segundo lugar está la microarquitectura. Esa es la implementación de la arquitectura. En el caso de una ISA propietaria, rara vez se le permite cambiar la ISA, por lo que está limitado a cambios de microarquitectura. Puedes pensar que esos cambios son evolutivos en lugar de revolucionarios. Por otro lado, si comienza con una ISA abierta, le brinda un muy buen punto de partida y puede concentrarse en la innovación y la diferenciación clave. Eso se convierte en tu salsa secreta. Puede agregar nuevas instrucciones que ayuden a mejorar el rendimiento, puede reducir el consumo de memoria, etc. En este caso, podría describirse como revolucionario en lugar de evolutivo”.

Algunas NIA que contienen cantidades significativas de flexibilidad. “Hay capacidad de configuración y extensibilidad”, dice Rich Collins, director de marketing de productos de Synopsys. “Gran parte de la implementación estándar es configurable en términos de anchos de buses y tamaños de memorias. Todas esas cosas son configurables sin tener que hacer ninguna personalización de ningún tipo. Puede haber formas predefinidas de extensibilidad, como proporcionar un conjunto de códigos de condición, un conjunto de registros auxiliares o conjuntos extendidos de instrucciones, o incluso aceleradores de hardware adicionales. No tiene que simplemente agregar instrucciones personalizadas. Si tiene su propio acelerador de salsa secreta personalizado, entonces puede conectarlo al procesador”.

La adopción de un procesador básico o un procesador de arquitectura fija tiene ventajas. “La gente puede reutilizar el ecosistema que ya existe para un procesador básico, como Arm, RISC-V o ARC”, dice Goossens de Synopsys. “Ese ecosistema podría extenderse a periféricos, unidades para interactuar con su procesador y las bibliotecas de software que existen. El hecho de que pueda reutilizar esos elementos es importante, y esa es una razón por la cual las personas pueden preferir tener una línea de base RISC-V o una línea de base ARC, y partir de ahí”.

Si bien algunas personas en la industria denuncian la falta de arquitectos de procesadores, este es un problema temporal. “Con el aumento de RISC-V, se han convertido en muchos más cursos de ingeniería informática que cubren el diseño de procesadores, por lo que la industria tendrá más personas viniendo en los próximos años”, dice. “No creo que haya escasez de personas que sepan cómo construir procesadores. Se necesitan un par de personas como punto de cristalización y reúnen al equipo a su alrededor para comenzar a construir procesadores. No se requieren habilidades especiales para construir procesadores. Es solo otra IP, pero construir un buen procesador no es fácil”.

Requiere un buen flujo que permita analizar los cambios arquitectónicos. “Necesita las herramientas de software, especialmente los compiladores”, dice Goossens. “No desea programar sus extensiones en código ensamblador de bajo nivel y luego ensamblar en línea y vincularlo con el código generado por su compilador. Los compiladores deben poder explotar todas las especializaciones que ha agregado. Luego, puede obtener comentarios inmediatos sobre la calidad de su arquitectura mediante el uso de código de aplicación de la vida real. Si no tiene eso, entonces está usando conjeturas para hacer sus extensiones”.

Hay dos formas de manejar esto. “El enfoque tradicional es tener un equipo de ingenieros de software trabajando en el kit de desarrollo de software (SDK), luego un equipo trabajando en RTL y otro equipo trabajando en la verificación”, dice Přikryl de Codasip. “No hay nada de malo en este enfoque, pero requiere muchos ingenieros y es necesario sincronizarlos para asegurarse de que estén alineados. El otro enfoque es usar una herramienta que automatice la mayor parte de esto. Describe el procesador, incluidos su ISA y su microarquitectura, en un lenguaje de alto nivel. Dentro de Codasip lo llamamos CodAL (un lenguaje similar a C). A partir de ahí, genera las herramientas SDK, RTL y de verificación”.

Optimización microarquitectónica
Dado que la arquitectura del procesador ya se ha definido, debe implementarse. “La microarquitectura define qué tan bien se ejecuta el conjunto de instrucciones”, dice Frank de Arteris. “Cuando las personas se adhieren a la arquitectura del conjunto de instrucciones acordadas, están exprimiendo el limón, la microarquitectura, para brindar más rendimiento”.

La implementación de un procesador generalmente se considera un proceso de diseño RTL estándar. Sin embargo, eso no significa que sea trivial de ninguna manera, especialmente si utiliza paralelismo fuera de orden, especulación, predictores de bifurcación o una de muchas otras técnicas.

Conclusión
Hay muchos aspectos en el diseño, la creación y la optimización de un procesador que puede ejecutar una tarea definida o un conjunto de tareas, y todos esos aspectos están estrechamente relacionados. Prestar demasiada atención a uno e ignorar a los demás puede crear problemas. Como con la mayoría de los sistemas, comenzar desde arriba conduce a las mayores ganancias.

“La retrospectiva es 2020”, dice Uhm de AMD. “Si no obtienes algo en el mercado, no puedes aprender de eso para mejorar. Ves eso con muchas compañías de IA hoy. Todos los que se quedaron sin dinero después de su primer dispositivo están fuera del negocio. Las personas que tuvieron algunos niveles de éxito están en su próximo chip, aprendieron de él y lo mejoraron. Necesitas un ciclo de retroalimentación constante sobre lo que va bien y lo que va mal”.

punto_img

Información más reciente

punto_img