¿Programación sin ramas en arduino?
Así que he estado investigando la programación sin ramas para acelerar el código y tengo curiosidad por saber cómo exactamente Arduino (o más bien atmega328) lee realmente las instrucciones de la máquina. ¿Tiene una memoria caché o lee todas las instrucciones de la memoria flash?
Según mi comprensión de la programación sin ramas, acelera el cálculo porque la CPU no tiene que saltar dentro de las instrucciones y puede leerlas secuencialmente, por lo tanto, no necesita cargar nuevas instrucciones en caso de que tenga que saltar a una ubicación que no está cargada.
Mi pregunta es, ¿esto se aplica al atmega328? Si lee todas las instrucciones directamente desde la memoria flash sin usar un caché, entonces no debería importar mucho si tiene que saltar en las instrucciones, ¿verdad?
Respuestas
No hay caché, por lo que no tiene que preocuparse por eso. Todas las instrucciones se obtienen directamente de la memoria flash y se ejecutan de inmediato.
Sin embargo, hay una tubería de dos etapas. Eso significa que en un ciclo de reloj se obtiene una instrucción de la memoria flash, y en el siguiente ciclo de reloj se ejecuta, y mientras eso se ejecuta, la siguiente instrucción se recupera lista.
Eso significa que cuando ocurre una bifurcación, dado que el AVR usa un enfoque muy muy simplista para la predicción de bifurcaciones (es decir, asume que la bifurcación no se tomará y simplemente carga la siguiente instrucción independientemente), debe descartar el contenido de la canalización y empezar desde el principio.
Eso es solo una penalización de un reloj mientras carga la instrucción recién ramificada, pero sigue siendo una penalización.
La caché solo es necesaria cuando el núcleo de la CPU se ejecuta más rápido de lo que se puede acceder a la memoria. Dado que el AVR solo se ejecuta a hasta 20 MHz, que es considerablemente más lento de lo que se puede acceder al flash, agregar caché sería completamente inútil. Otras MCU más rápidas utilizan el almacenamiento en caché, como el PIC32MZ de 200MHz, ya que de lo contrario tendrían que introducirse "estados de espera" para ralentizar la lectura desde flash hacia abajo.