#LyX 2.3 created this file. For more info see http://www.lyx.org/ \lyxformat 544 \begin_document \begin_header \save_transient_properties true \origin unavailable \textclass book \use_default_options true \begin_modules algorithm2e \end_modules \maintain_unincluded_children false \language spanish \language_package default \inputencoding auto \fontencoding global \font_roman "default" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \use_microtype false \use_dash_ligatures true \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \use_minted 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \is_math_indent 0 \math_numbering_side default \quotes_style french \dynamic_quotes 0 \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard Para reducir por debajo de 1 los CPI de un núcleo del procesador, debemos lanzar y ejecutar varias instrucciones en cada ciclo de reloj, pero esto implica más presión sobre la memoria y los registros, más posibilidad de riesgos, más área de silicio y más consumo. Distinguimos: \end_layout \begin_layout Itemize \series bold Arquitecturas superescalares \series default : Lanzan un número variable de instrucciones por ciclo, de 0 a 8. \end_layout \begin_layout Itemize \series bold VLIW \series default ( \series bold \emph on \lang english Very Long Instruction Word \series default \emph default \lang spanish ): En cada ciclo se carga una \series bold macro-instrucción \series default , formada por varias instrucciones independientes agrupadas por el compilador. El \emph on \lang english hardware \emph default \lang spanish es más simple, lo que permite una mayor frecuencia de reloj y un menor consumo, pero no se beneficia de las técnicas de planificación dinámica y el código suele ser más grande e incompatible entre distintas versiones del procesador, por lo que actualmente está casi en desuso. \end_layout \begin_layout Section Planificación \end_layout \begin_layout Standard Aunque la mayoría de compiladores reordenan las instrucciones para intentar evitar riesgos, estos todavía pueden producirse. \end_layout \begin_layout Standard Un núcleo con arquitectura superescalar tiene planificación \series bold estática \series default si, cuando encuentra un riesgo, detiene el cauce hasta que el riesgo desaparece , y tiene planificación \series bold dinámica \series default si reordena las instrucciones para evitar detenciones, lo que aumenta la velocidad y reduce la necesidad del compilador de conocer la microarquitectura a cambio de necesitar más recursos. Con planificación dinámica, la ejecución es fuera de orden, y la terminación puede ser en orden o fuera de orden. La predicción de saltos es \series bold estática \series default si siempre predice el mismo resultado para el mismo salto o \series bold dinámica \series default en otro caso. \end_layout \begin_layout Standard Los núcleos superescalares normalmente tienen un sistema de memoria de alto rendimiento y unidades funcionales redundantes, que administra con técnicas como planificación dinámica, ejecución especulativa para mitigar riesgos de control y renombrado de registros para mitigar las dependencias de nombre. \end_layout \begin_layout Section Algoritmo de Tomasulo \end_layout \begin_layout Standard El \series bold algoritmo de R. M. Tomasulo \series default de 1971 es un método de planificación dinámica con renombrado de registros. En su versión con terminación en orden, usa: \end_layout \begin_layout Itemize Una \series bold cola de instrucciones \series default a decodificar, que también suaviza los fallos de caché. \end_layout \begin_layout Itemize Un \series bold \emph on \lang english buffer \emph default \lang spanish de re-ordenación \series default ( \series bold ROB \series default , \emph on \lang english Re-Order Buffer \emph default \lang spanish ), un \emph on \lang english buffer \emph default \lang spanish FIFO circular que almacena las instrucciones en curso \begin_inset Foot status open \begin_layout Plain Layout Si el procesador usa micro-instrucciones, serán estas las que se añadan al ROB. \end_layout \end_inset y, cuando terminan de ejecutarse, también el valor calculado por ellas si lo hay, así como las excepciones que surjan. \end_layout \begin_layout Itemize Un \series bold estado de los registros \series default , que indica si el último valor de cada registro se debe tomar del ROB y, en tal caso, de qué entrada. \end_layout \begin_layout Itemize \series bold Estaciones de reserva \series default ( \series bold ER \series default ): Tablas asociadas a un grupo de unidades funcionales con las instrucciones por ejecutar por dicho grupo, dados por un código de instrucción, la entrada del ROB correspondiente y, para cada operando, su valor o la entrada del ROB que lo producirá. \end_layout \begin_layout Itemize \series bold \emph on \lang english Buffer \emph default \lang spanish de carga \series default : Tabla con una serie de direcciones a cargar junto con la entrada del ROB en la que cargarla. \end_layout \begin_layout Itemize \series bold Bus de resultados \series default ( \series bold CDB \series default , \emph on \lang english Common Data Bus \emph default \lang spanish ): Para transmitir los resultados al ROB y los ERs, implementando el adelantamie nto. \end_layout \begin_layout Standard Las instrucciones se segmentan en 6 etapas: \end_layout \begin_layout Enumerate \series bold Obtención de instrucciones \series default ( \series bold IF \series default , \series bold F \series default , \emph on \lang english Instruction Fetch \emph default \lang spanish ): Lee varias instrucciones por ciclo en orden y las añade a la cola de instrucciones. La predicción de saltos se puede hacer aquí o en ID. \end_layout \begin_layout Enumerate \series bold Decodificación \series default ( \series bold ID \series default , \series bold D \series default , \emph on \lang english Instruction Decode \emph default \lang spanish ): Decodifica varias instrucciones por ciclo para conocer su tipo, en orden. Si hay una entrada libre en el ROB y una en el ER para la instrucción, añade la instrucción al ROB y al ER. Para cada operando, carga el valor en el ER desde el ROB o el banco de registros según indique el estado del registro o, si este no ha sido calculado, el número de la entrada del ROB donde estará. Finalmente guarda el número de la entrada del ROB en el estado del registro de destino, si lo hay. \end_layout \begin_deeper \begin_layout Standard Los algoritmos con terminación fuera de orden usan una \series bold ventana de instrucciones \series default en vez de un ROB. \end_layout \end_deeper \begin_layout Enumerate \series bold Emisión \series default ( \series bold \emph on \lang english Issue \series default \emph default \lang spanish ): Fuera de orden. Para cada ER, si un operando no está disponible, espera a que llegue por el CDB para guardarlo en la ER. En otro caso, si hay una unidad funcional disponible, le envía los operandos para que ejecute la instrucción, y si no la hay espera. Hay que asegurar que dos ERs no puedan enviar a la misma unidad funcional a la vez. Como mejora, se pueden usar técnicas como la predicción de valor o la reutiliza ción de valores. \end_layout \begin_layout Enumerate \series bold Ejecución \series default ( \series bold EX \series default , \series bold X \series default , \emph on \lang english Execute \emph default \lang spanish ): Fuera de orden, preferiblemente con varias unidades funcionales de cada tipo totalmente segmentadas, y llevando la cuenta de cuál es el destino de la instrucción. Los almacenamientos solo calculan la dirección. Las cargas se dividen en las etapas X1, en que se calcula la dirección de memoria, y X2, en que se accede a memoria, separadas por el \emph on \lang english buffer \emph default \lang spanish de carga. Antes de una carga, se debe esperar a que los almacenamientos anteriores en el ROB terminen, o a que se conozca su dirección de memoria y puede que su valor, para evitar riesgos RAW de memoria. \end_layout \begin_layout Enumerate \series bold Pos-escritura \series default o \series bold escritura \series default ( \series bold WB \series default , \series bold W \series default , \emph on \lang english Write-Back \emph default \lang spanish ): Se difunden los resultados al \series bold bus de resultados \series default , actualizando el ROB y las ER, y se libera la ER. Los almacenamientos no hacen nada. \end_layout \begin_layout Enumerate \series bold Confirmación \series default ( \series bold \emph on \lang english Commit \series default \emph default \lang spanish ): Toma varias instrucciones del ROB por ciclo, en orden. Si una causa una excepción, vacía el ROB con las instrucciones siguientes, guarda el contador de programa para la siguiente instrucción e invoca a una rutina de manejo de excepciones. En otro caso, si el estado del registro de destino indica la misma entrada del ROB, escribe el resultado al banco de registros y borra el estado del registro; si es un almacenamiento, escribe el dato en memoria, normalmente a través de un \emph on \lang english buffer \emph default \lang spanish de almacenamiento, y finalmente borra la entrada del ROB. \end_layout \end_body \end_document