{"id":20605,"date":"2015-03-11T10:28:46","date_gmt":"2015-03-11T09:28:46","guid":{"rendered":"https:\/\/www.teldat.com\/sin-categorizar\/20605\/estructuras-de-control-en-microprocesadores-modernos\/"},"modified":"2022-12-28T12:50:24","modified_gmt":"2022-12-28T10:50:24","slug":"estructuras-de-control-en-microprocesadores-modernos","status":"publish","type":"post","link":"https:\/\/www.teldat.com\/es\/blog\/estructuras-de-control-en-microprocesadores-modernos\/","title":{"rendered":"Estructuras de control en microprocesadores modernos"},"content":{"rendered":"<p style=\"text-align: left;\"><strong><img decoding=\"async\" class=\"alignleft size-medium wp-image-4657\" style=\"border: 0px;\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/92372371-scaled.jpg\" alt=\"Global communication \" width=\"300\" height=\"225\" title=\"\">Desde el advenimiento de los ordenadores se ha desarrollado gran variedad de procesadores con distinto juego de instrucciones <i>(Instruction Set Architecture)<\/i>. Su dise\u00f1o arrancaba con la definici\u00f3n del juego y culminaba en la implementaci\u00f3n de la microarquitectura que cumpl\u00eda la especificaci\u00f3n. Durante los a\u00f1os 80 el inter\u00e9s estuvo centrado en determinar cu\u00e1les constitu\u00edan las caracter\u00edsticas m\u00e1s recomendables de ese conjunto. Sin embargo, durante los 90, el foco se desplaz\u00f3 al desarrollo de t\u00e9cnicas innovadoras en la microarquitectura que fuesen aplicables a todos ellos.<\/strong><\/p>\n<p style=\"text-align: left;\">El objetivo principal de cada nueva generaci\u00f3n de procesadores ha sido el <strong>aumento de las prestaciones<\/strong> respecto a la generaci\u00f3n anterior y, en los \u00faltimos tiempos, con la consideraci\u00f3n adicional de reducir el consumo. Pero \u00bfc\u00f3mo medir las prestaciones? B\u00e1sicamente, en funci\u00f3n del tiempo que lleva ejecutar un programa concreto. Haciendo una serie de manipulaciones muy sencillas podemos expresar las prestaciones en funci\u00f3n de una serie de factores\u00a0con un significado preciso.<\/p>\n<p style=\"text-align: center;\"><strong><img decoding=\"async\" class=\"size-medium wp-image-4659 aligncenter\" title=\"microprocesadores grafico\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/2015-03-11_1853-300x44.png\" alt=\"microprocesadores grafico\" width=\"300\" height=\"44\" \/>El primer t\u00e9rmino<\/strong> del lado derecho de la igualdad expresa el n\u00famero total de instrucciones que din\u00e1micamente necesitan ejecutarse por el programa; <strong>el segundo,<\/strong> los ciclos de m\u00e1quina que son consumidos en media por cada instrucci\u00f3n (CPI); y <strong>el tercero,<\/strong> el tiempo de ciclo o la inversa de la frecuencia de trabajo. Actuando sobre cada uno de los tres t\u00e9rminos podemos aumentar las prestaciones, aunque desgraciadamente no son, en ocasiones, independientes, y la reducci\u00f3n de uno de ellos puede, potencialmente, aumentar la magnitud de los otros.<\/p>\n<p style=\"text-align: left;\">Una de las t\u00e9cnicas m\u00e1s sencillas para actuar sobre el segundo y tercer t\u00e9rminos con un peque\u00f1o coste de <em>hardware<\/em> es el <b><i>\u201c<\/i><\/b><strong><em>pipelining<\/em><\/strong><b><i>\u201d<\/i><\/b>. El sistema o la unidad se tabica mediante <em>buffers<\/em> en m\u00faltiples etapas, de manera que el proceso se descompone en <strong>K subprocesos<\/strong> que se llevan a cabo en cada una de las K etapas. Para un sistema que opera sobre una tarea a la vez, el <em>throughput<\/em> es igual a 1\/D, donde D es la latencia de la tarea o el retardo asociado a su ejecuci\u00f3n por el sistema; introduciendo el pipeline se inicia una nueva tarea en cada una de las subunidades cuando la tarea previa la abandona, hecho que ocurre cada D\/K unidades de tiempo. Los procesadores que haciendo uso de esta t\u00e9cnica consiguen un CPI igual a 1 se les denomina escalares y sus representantes son los RISC dise\u00f1ados en la d\u00e9cada de los 80. Este mismo par\u00e1metro se utiliza para definir los procesadores superescalares, como aquellos capaces de CPI menor que 1. El valor medio de su inverso, IPC <em>(Instructions Per Cycle)<\/em>, constituye una buena medida de la efectividad de la microarquitectura.<\/p>\n<p style=\"text-align: left;\">El obst\u00e1culo principal de los <em>pipeline processors,<\/em> sean o no superescalares, son los <em>pipeline hazards<\/em> que requieren retener <i>(<\/i><em>stall<\/em><i>)<\/i> la ejecuci\u00f3n de la subunidad afectada y las posteriores que contienen instrucciones situadas a continuaci\u00f3n en el flujo del programa. Se identifican tres tipos: <b><\/b><\/p>\n<ul style=\"text-align: left;\">\n<li><strong>Estructurales,<\/strong> cuando existe un recurso compartido que no puede dar servicio a todas las subunidades que en un momento determinado lo requieren.<b><\/b><\/li>\n<li><strong>De control,<\/strong> cuando un programa ejecuta una instrucci\u00f3n de salto que se bifurca a un destino diferente al estimado.<b><\/b><\/li>\n<li><strong>De datos,<\/strong> cuando instrucciones que exhiben dependencias entre sus datos acceden, o pretenden acceder a ellos, en orden diferente al establecido en el programa.<\/li>\n<\/ul>\n<p style=\"text-align: left;\">Los de este \u00faltimo tipo se clasifican seg\u00fan el <strong>orden de ocurrencia en el programa <\/strong>de las instrucciones <em>i y j,<\/em> con <i>i <\/i>ocurriendo antes que <em>j, <\/em>que debe preservarse en el pipeline. Las variedades son: <strong>Read After Write (RAW)<\/strong>, cuando <i>j <\/i>trata de leer un operando antes de que <em>i<\/em> lo escriba, <strong>Write After Write (WAW)<\/strong>, cuando <em>j <\/em>trata de escribir un operando antes que lo escriba <em>i,<\/em> y <strong>Write After Read (WAR), <\/strong>cuando <i>j<\/i> trata de escribir un operando antes de que lo lea <i>i<\/i>. Los dos \u00faltimos tipos son dependencias falsas, o de nombre, que se deben al n\u00famero limitado de registros definidos en la arquitectura.<\/p>\n<p style=\"text-align: left;\">\u00bfC\u00f3mo se gestionan estas dependencias que surgen por el pipelining, complicadas a\u00fan m\u00e1s en los procesadores superescalares con varias unidades operando simult\u00e1neamente? Pues introduciendo una serie de estructuras de control que se leen y actualizan conforme la instrucci\u00f3n avanza recorriendo las diferentes etapas que, para prop\u00f3sito de nuestra exposici\u00f3n, consideramos:<\/p>\n<p style=\"text-align: left;\" align=\"center\">Fetch, Dispatch (IQ), Issue, {eXecute#1 II \u2026 II eXecute#N}, Writeback, Commit<\/p>\n<p style=\"text-align: left;\">El proceso es el siguiente: cada ciclo de reloj la unidad de control lee <em>(fetch)<\/em> una instrucci\u00f3n que pasa en el siguiente, si proviene de la I-cach\u00e9, o varios despu\u00e9s, si proviene de la RAM, a la etapa que va a continuaci\u00f3n, <em>Dispatch<\/em>, en donde se realizan cuatro acciones. <b><\/b><\/p>\n<p style=\"text-align: left;\"><strong>(1)\u00a0\u00a0\u00a0 Se selecciona un registro f\u00edsico,<\/strong> no visible en el modelo de programaci\u00f3n, de la tabla de registros libres (FL).<b><\/b><\/p>\n<p style=\"text-align: left;\"><strong>(2)\u00a0\u00a0\u00a0 Se realiza la anotaci\u00f3n de la asociaci\u00f3n temporal<\/strong> del registro anterior con el registro de la arquitectura en la <em>Rename Table <\/em>(RAT), eliminando as\u00ed las falsas dependencias (WAW y WAR), al asignar din\u00e1micamente diferentes nombres a un mismo registro de la arquitectura en un intento de seguir el valor del resultado. No el nombre del registro, lo cual es posible porque el n\u00famero de registros f\u00edsicos es mayor que el de los definidos en la arquitectura. <b><\/b><\/p>\n<p style=\"text-align: left;\"><strong>(3)\u00a0\u00a0\u00a0 Se reserva una entrada en el <em>Reorder Buffer<\/em> (ROB)<\/strong> que es una cola circular que mantiene el estado de los registros f\u00edsicos asociados a las instrucciones en vuelo. <b><\/b><\/p>\n<p style=\"text-align: left;\"><strong>(4)\u00a0\u00a0\u00a0 Se encola la instrucci\u00f3n en la <em>Issue Queue<\/em> (IQ)<\/strong>, a la espera de que los operandos est\u00e9n disponibles, momento en que avanza a la siguiente etapa <em>(Issue)<\/em> en el pr\u00f3ximo ciclo de reloj, si la exploraci\u00f3n del <em>Scoreboard <\/em>(SB) determina que la operaci\u00f3n puede proceder en la unidad funcional correspondiente sin conflictos; de ser el caso, un ciclo despu\u00e9s la operaci\u00f3n comienza en la unidad funcional <em>(eXecute#K)<\/em>, que se asocia en el SB con el registro f\u00edsico que albergar\u00e1 el resultado, y donde se va actualizando el progreso cada ciclo de reloj. Al finalizar esta, uno o varios ciclos despu\u00e9s, la unidad funcional actualiza el contenido del registro f\u00edsico en la etapa denominada <em><strong>Writeback,<\/strong><\/em> en el mismo momento que se actualiza a \u201ccompletado\u201d el estado en la entrada asociada al registro en ROB y se pone a Writeback el estado de la operaci\u00f3n en SB. Si la instrucci\u00f3n en Writeback es una escritura en memoria, se transfiere el contenido del registro de la arquitectura temporalmente a una estructura intermedia denominada <strong><i>Finished Store <\/i><em>Buffer<\/em> (FSB),<\/strong> cuyo objeto es mantener el dato por si alguna instrucci\u00f3n previa del programa, todav\u00eda en proceso en alguna unidad funcional, provocase una excepci\u00f3n (supuesto un modelo de excepciones precisas). La instrucci\u00f3n finaliza en la siguiente etapa del pipeline, <i>commit,<\/i> uno o varios ciclos despu\u00e9s, cuando el puntero a la cabecera de ROB avanza a su entrada en la cola circular, se transfiere entonces el registro f\u00edsico al de la arquitectura actualizando el estado de la m\u00e1quina. Se libera la asociaci\u00f3n entre ambos registros que mantiene RAT, se devuelve el registro f\u00edsico al <i>pool<\/i> en FL y, en el caso de una escritura, y se transfiere el contenido de FSB a la memoria, ya sea la D-cache o la RAM.<\/p>\n<p style=\"text-align: left;\">La mayor parte de los <strong>procesadores que equipan los equipos TELDAT <\/strong>pertenecen a la familia <strong>PowerPC <\/strong>de <strong>Freescale.<\/strong> Por supuesto incorporan todas las t\u00e9cnicas descritas anteriormente y son superescalares; as\u00ed, cuando una instrucci\u00f3n es enviada <em>(dispatched)<\/em> a una de las IQ (en nuestro ejemplo, la cola era centralizada y en esta arquitectura es distribuida, existiendo una cola por cada unidad) se le asigna un <em>rename register (RR)<\/em>, equivalente al registro f\u00edsico, al resultado de la operaci\u00f3n y una entrada en la <em>Completion Queue <\/em>(CQ), que har\u00eda las funciones de ROB. Las instrucciones pasan de la IQ, a trav\u00e9s de la <i>reservation station<\/i> (RS), a ejecutarse en la unidad funcional cuando sus operandos est\u00e1n disponibles. Finaliza la ejecuci\u00f3n actualizando el RR y su estado en la CQ. Las instrucciones finalizadas se retiran de la CQ en el orden de programa y, un ciclo despu\u00e9s, se trasladan los resultados desde los RR al banco de registros de la arquitectura.<\/p>\n<p style=\"text-align: left;\">En este art\u00edculo hemos mostrado, sin \u00e1nimo de entrar en justificaciones, las estructuras que aparecieron junto a los primeros RISC (all\u00e1 por los a\u00f1os 80) y sus motivaciones. El concepto de pipelining, los hazards, reales y ficticios, la t\u00e9cnica de register renaming&#8230; Ideas que tienen su origen en el algoritmo que desarroll\u00f3 <a title=\"Roberto Tomasulo\" href=\"https:\/\/es.wikipedia.org\/wiki\/Robert_Tomasulo\" target=\"_blank\" rel=\"noopener\">Robert Tomasulo<\/a> en IBM (en 1967), y que se implementaron por primera vez en la unidad de punto flotante del IBM System\/360 Model 91, sentaron las bases de la ejecuci\u00f3n fuera de orden <em>(out-of-order execution) <\/em>de los actuales procesadores.<\/p>\n<p style=\"text-align: left;\">Espero que lo sucinto del art\u00edculo, al menos, haya excitado la curiosidad del amable lector.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desde el advenimiento de los ordenadores se ha desarrollado gran variedad de procesadores con distinto juego de instrucciones (Instruction Set Architecture). Su dise\u00f1o arrancaba con la definici\u00f3n del juego y culminaba en la implementaci\u00f3n de la microarquitectura que cumpl\u00eda la especificaci\u00f3n. Durante los a\u00f1os 80 el inter\u00e9s estuvo centrado en determinar cu\u00e1les constitu\u00edan las caracter\u00edsticas [&hellip;]<\/p>\n","protected":false},"author":143,"featured_media":17499,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[1160],"tags":[1119],"class_list":["post-20605","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-equipos-hardware","tag-tendencias-soluciones-tic"],"acf":[],"wpml_current_locale":"es_ES","wpml_translations":[{"locale":"en_US","id":18583,"slug":"control-structures-for-modern-microprocessors","post_title":"Control structures for modern microprocessors","href":"https:\/\/www.teldat.com\/control-structures-for-modern-microprocessors\/"}],"_links":{"self":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts\/20605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/users\/143"}],"replies":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/comments?post=20605"}],"version-history":[{"count":0,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts\/20605\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/media\/17499"}],"wp:attachment":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/media?parent=20605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/categories?post=20605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/tags?post=20605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}