La respuesta corta
-
Los pasos de decodificación y ejecución de la instrucción se ejecutan en paralelo con el siguiente paso de la instrucción anterior. Esta técnica se conoce como pipelining. Véase En los procesadores RISC abajo.
-
Una arquitectura RISC de un solo tema suele tener una media de algo menos de una instrucción por ciclo debido a los estados de espera y al tiempo que tardan las operaciones de carga/almacenamiento que llegan a la memoria en lugar de ir de registro en registro. Las ranuras de retardo ofrecen un gancho arquitectónico que permite recuperar parte de este tiempo. Véase En los procesadores RISC abajo.
-
Un ciclo de instrucción es el tiempo necesario para ejecutar una instrucción. Varía en función de la arquitectura y (en algunos casos) de las instrucciones. Por ejemplo, la mayoría de las instrucciones en un MIPS R2000/3000 tardan un ciclo. Las instrucciones que implican acceso a la memoria (carga/almacenamiento, bifurcación) tardan más de un ciclo, aunque las ranuras de retardo significan que puedes ejecutar algo más (posiblemente sólo un NOP) en la ranura de retardo. Las arquitecturas no alineadas pueden tener ciclos de instrucción de varios ciclos de reloj, que a menudo varían con el modo de direccionamiento. Véase En los procesadores RISC, las arquitecturas CISC tradicionales y Arquitecturas de cableado abajo.
Los diseños de emisión múltiple pueden difuminar un poco este concepto ejecutando más de una instrucción en paralelo.
-
Los procesadores CISC pueden tener instrucciones que tardan más o menos tiempo. El número exacto de ciclos de reloj depende de la arquitectura y las instrucciones. El número variable de ciclos de reloj que tardan los ISA de CISC es una de las razones por las que son difíciles de integrar en arquitecturas fuertemente canalizadas. Véase Arquitecturas CISC tradicionales abajo.
La respuesta más larga
En una CPU MIPS, SPARC o de otro tipo, todas las instrucciones (por una primera aproximación) se emiten en un solo ciclo, aunque pueden tener algo conocido como "ranura de retardo".
En los procesadores RISC
En este contexto, una CPU de un solo tema es aquella en la que la CPU no hace ningún análisis de dependencia sobre la marcha ni emite instrucciones en paralelo de la forma en que lo hacen las CPUs modernas, es decir, sólo tienen una unidad de ejecución que ejecuta las instrucciones en el orden en que se leen de la memoria. Más adelante se hablará de esto.
La mayoría de los procesadores RISC más antiguos son diseños de un solo elemento, y estos tipos se siguen utilizando ampliamente en los sistemas embebidos. Un núcleo RISC entero de 32 bits puede implementarse en unas 25.000-30.000 puertas, por lo que los núcleos de CPU de este tipo tienen un consumo de energía muy bajo y un tamaño muy reducido. Esto hace que sean fáciles y baratos de integrar en productos SOC (sistema en chip).
Los diseños de las CPUs RISC están canalizados: el procesamiento de la instrucción se realiza en varias etapas, y cada instrucción pasa por la canalización a la siguiente etapa en cada ciclo de reloj. En la mayoría de los casos, una CPU de una sola fase ejecutará algo parecido a una instrucción por ciclo de reloj.
Algunas arquitecturas tienen instrucciones como bifurcación o carga/almacenamiento desde la memoria, en las que el ciclo adicional que se produce por el acceso a la memoria es visible para el código.
Por ejemplo, en un SPARC V7/V8 diseñar la siguiente instrucción después de una bifurcación se ejecuta realmente antes de que la propia bifurcación tenga lugar. Normalmente se pone un NOP en la ranura después de la bifurcación, pero se puede poner otra instrucción en ella si se encuentra algo útil que hacer.
El MIPS R2000/R3000 tenía una ranura de retardo similar en las instrucciones de carga/almacenamiento. Si se cargaba un valor de la memoria, no aparecería realmente en el registro hasta otro ciclo. Podías poner un NOP en la ranura o hacer otra cosa si encontrabas algo útil que hacer que no dependiera de la operación de carga que acababas de emitir.
Si la memoria era más lenta que la CPU, lo que ocurría a menudo, podría obtener estados de espera en los accesos a la memoria. Los estados de espera congelan la CPU durante uno o más ciclos de reloj hasta que se completa el acceso a la memoria. En la práctica, estos estados de espera y el tiempo extra para los accesos a la memoria significan que los diseños de CPU de un solo tema tienen un promedio de algo menos de una instrucción por ciclo de reloj. Las ranuras de retardo ofrecen algunas oportunidades posibles para optimizar el código mediante la ejecución de alguna otra instrucción mientras se realiza una operación de memoria.
Procesadores CISC tradicionales
Procesadores CISC eran diseños que podían tener instrucciones de duración variable. A menudo tenían instrucciones más complejas implementadas directamente en el hardware que tendrían que hacerse en el software en una CPU RISC.
La mayoría de las arquitecturas de mainframe y prácticamente todos los diseños de PC hasta el M68K y el intel 386 eran CPUs CISC microcodificadas tradicionales. Estos diseños demostraron ser más lentos por reloj y utilizar más puertas que las CPUs RISC.
Microcódigo
Un ejemplo de microcódigo arquitectura (MOS 6502) puede verse en la emulación aquí . El microcódigo puede verse en la parte superior de la imagen.
El microcódigo controla los flujos de datos y las acciones que se activan en la CPU para ejecutar las instrucciones. Al recorrer los pasos del microcódigo se pueden activar las partes de una CPU, moviendo los datos a través de las ALU o realizando otros pasos. Los componentes reutilizables de la CPU pueden coordinarse a lo largo de varios ciclos de reloj para ejecutar una instrucción. En el caso del 6502, el microcódigo también puede ejecutar algunas acciones en cadena.
Los diseños microcodificados utilizaban menos silicio que los chips cableados a costa de tardar potencialmente varios ciclos de reloj en completar una instrucción. Dependiendo del diseño, estas CPUs tardarían más o menos tiempo en completar una instrucción.
Arquitecturas de cableado
Diseños de cableado (no necesariamente excluyentes con el microcódigo) ejecutan una instrucción de forma sincrónica, o pueden tener sus propios coordinadores para hacer algo a lo largo de varios ciclos de reloj. Suelen ser más rápidos a expensas de más hardware dedicado y, por tanto, son más caros de implementar que un diseño microcodificado de funcionalidad equivalente.
Un ejemplo famoso de esto fue el original CPU Amdahl 470/6 que era un sustituto de la CPU en ciertos modelos de IBM System/370. La CPU de Amdahl era un diseño de cableado en una época en la que las CPUs 370 de IBM se basaban en gran medida en el microcódigo. La CPU de Amdahl era unas 3 veces más rápida que las CPUs de IBM a las que sustituía.
Ni que decir tiene que a IBM no le hizo ninguna gracia y esto dio lugar a una batalla judicial que acabó obligando a IBM a abrir su arquitectura de mainframe hasta que el decreto de consentimiento expiró hace unos años.
Normalmente, un diseño cableado de este tipo no era tan rápido reloj a reloj como una CPU RISC, ya que los diferentes tiempos y formatos de las instrucciones no permitían el uso de pipelines como en un diseño RISC.
Diseños de emisión múltiple
La mayoría de las CPUs modernas son arquitecturas de emisión múltiple que puede procesar más de una instrucción a la vez dentro de un mismo hilo. El chip puede realizar un análisis de dependencia dinámico del flujo de instrucciones entrantes y emitir instrucciones en paralelo cuando no hay dependencia del resultado de un cálculo anterior.
El rendimiento de estos chips depende del grado de paralelismo que pueda alcanzarse en el código, pero la mayoría de las CPUs modernas tienen una media de varias instrucciones por ciclo en la mayor parte del código.
Las CPUs modernas de Intel y otras x86/X64 ISA tienen una capa que interpreta el conjunto de instrucciones CISC de la vieja escuela en microinstrucciones que puede ser alimentado a través de un núcleo de emisión múltiple de estilo RISC. Esto añade una sobrecarga que no está presente en las CPU con ISA diseñadas para la canalización (es decir, arquitecturas RISC como ARM o PowerPC).
Diseños VLIW
diseños VLIW, de los cuales el Intel Itanium es quizás el más conocido, nunca despegó como arquitecturas de corriente principal, pero IIRC hay una serie de arquitecturas DSP que utilizan este tipo de diseño. Un diseño VLIW hace explícita la emisión múltiple con una palabra de instrucción que contiene más de una instrucción que se emite en paralelo.
Estos dependían de buenos compiladores de optimización, que identificaba las dependencias y las oportunidades de paralelismo, colocando las instrucciones en las múltiples ranuras disponibles en cada palabra de instrucción.
Las arquitecturas VLIW funcionan bastante bien para las aplicaciones numéricas, ya que las operaciones de matrices/arreglos tienden a ofrecer oportunidades para un amplio paralelismo. El Itanium tuvo un nicho de mercado en aplicaciones de supercomputación durante un tiempo, y hubo al menos una arquitectura de supercomputación - el Multiflow TRACE - se produjo utilizando un ISA de este tipo.
Memoria y caché
Las CPUs modernas son mucho, mucho más rápidas que la memoria, por lo que las lecturas directas de la memoria pueden generar cientos de estados de espera que bloquean la CPU hasta que el acceso a la memoria se completa. El almacenamiento en caché, que ahora se realiza en múltiples capas, mantiene en la caché las ubicaciones de memoria utilizadas más recientemente. Como las CPUs suelen pasar la mayor parte del tiempo ejecutando código en bucles, esto significa que se obtienen buenas tasas de acierto al reutilizar las ubicaciones de memoria que se han usado recientemente. Esta propiedad se llama "localidad de referencia".
Cuando se consigue la localidad de referencia, la CPU puede funcionar a una velocidad cercana a la óptima. Los fallos de la caché en el siguiente nivel conllevan un número de estados de espera; los fallos de la caché en la memoria principal pueden conllevar cientos.
Así, el rendimiento real de los chips de la CPU puede depender en gran medida de la eficiencia de los patrones de acceso a la memoria. Se han escrito libros enteros sobre la optimización del código en este sentido, y es un tema complejo en sí mismo.
2 votos
Normalmente no menos de uno :-).