Gabriel Enrique González · Transcript · · Updated
Arquitectura de Computadoras y Técnicas Digitales 2020 Clase: Superescalares: filminas 81 a 100 – Transcript
Video by Gabriel Enrique González · Watch the original on YouTube

Use this video with Pro
Reading, copying and transcript downloads are free. Create saved AI results for this video with a signed-in Pro account ($9/month).
Transcript
Search ignores accents. All transcript text stays visible.
bueno vamos a ver ahora entonces el manejo del segundo flujo de datos vimos recién en de instrucciones ahora vamos a ver el flujo de datos o sea todo lo que son transferencias de datos entre registros del procesador bueno vamos a empezar desde cero por lo más cercano a cero para entender bien el problema
todo este conjunto de de estrategias para optimizar el flujo de datos centrar registros son técnicas que tienden a optimizar la ejecución de las instrucciones hay métrico lógicas el segundo grupo de instrucciones que habíamos y dicho que vamos a estudiar dentro del núcleo super escalar del procesador consideremos que el núcleo super escalar del procesador
empieza después del despacho y hasta que las instrucciones son almacenadas se hacen leyva kings en el banco de registros sí las instrucciones de equipo algo realizan las tareas reales del programa también podemos considerar que las instrucciones de salto y las instrucciones de memoria tienen los
roles las de memoria de proveer nuevos nuevos datos si las de salto de proveer nuevas instrucciones al flujo de trabajo pero el trabajo real lo hacen estas que son las operaciones dentro de la del en una arquitectura tipo load store las instrucciones de tipo algo específica en operaciones que van a ser realizadas entre registros del procesador
recordemos que un arquitecto una arquitectura tipo now the store es una arquitectura restringida a que los accesos a memoria los hacen únicamente instrucciones de carga y almacenamiento el resto de las instrucciones dentro del procesador sólo pueden acceder a valores dentro del banco de registros si entonces el formato típico de cualquier operación de tipo alude va a ser cierta
operación efe o sea ésta funcione efe entre un par de registros operando rj y rk y el resultado de esa operación se va a guardar en un registro en sí que es el registro destino ahora mirando nuestros registros de rey rj y rk lo que podemos decir es que si rj o rk no están disponibles al momento de y querer ejecutar la instrucción lo que
tenemos una vez que es una dependencia de datos una dependencia de raw la dependencia de datos verdadera si si la operación es la que no está disponible en el momento de querer ejecutar la instrucción lo que tenemos una es una dependencia estructural una dependencia de recursos no está disponible el operador en dentro de largo que puede realizar esa instrucción y queda
bloqueado obviamente si lo que no está disponible es el registro en donde yo voy a almacenar el resultado si es o sea no está disponible no se puede almacenar el resultado en este momento por la razón que sea entonces lo que tenemos es una dependencia falsa sí que puede ser una dependencia de tipo guard o de tipo guau se acuerdan dependencias de escritura
después de lectura o dependencias de escritura después de escritura si estas dos dependencias aparecen ahora si bien las hemos mencionado desde el curso anterior de arquitectura 1 aparecen y son dependencias son problemas reales en este entorno de multiprocesamiento de instrucciones no existían antes son no causaban problemas entonces tenemos que analizar eso las
dependencias de salida y las anti dependencias son debidas al reuso de registros si se acuerdan que yo quería escribir en un registro a en alguna instrucción y en alguna instrucción posterior siguen dos o tres instrucciones más abajo por ejemplo volvía a querer escribir en el registro entonces tengo dos instrucciones que quieren escribir en el ritmo de registro hay una competencia por el registro y yo
tengo que asegurarme de que la escritura se haga en orden si de manera de que no aparezca el problema de que el modificó el registro a de la instrucción que está más abajo y de alguna instrucción previa a esa instrucción en la que acabo de modificar el registro quiere leer el valor de a y en este caso sabemos que debiera leer el valor de a de la
instrucción primera en la cual se modificó y no de la instrucción segunda entonces estas dependencias eventualmente son generadas por el compilador al asignar registro del procesador a variables del programa el compilador puede hacer un análisis para evitar que surjan estos problemas y de hecho lo hace y trata de evitar que surjan estos problemas y esto lo puede hacer cuando el banco de
registros es ortogonal esto es cuando el compilador puede elegir cualquier registro del banco de registros para guardar resultados y no existen registros que tengan usos específicos o sea cualquier registro puede ser resultado de una operación aritmético lógica hay procesadores sin ir más lejos
la rama de intel a md el set y a 32 de intel sí que tiene la peculiaridad de que tiene registros que son de usos específicos como salida o como resultado de ciertas operaciones si por ejemplo es un acumulador por defecto en muchas instrucciones que el resultado
lo escriben implícitamente en una equis si se es un contador se x entonces el registro no entonces hay instrucciones que utilizan en críticamente contadores van a trabajar sobre este registro si una instrucción quiere utilizar ese registro como registro de uso general para guardar un resultado eventualmente
se superpongan si por poner un ejemplo así verbal la instrucción de multiplicar de dos operan dos de intel sí y de hd también obviamente por defecto guarda el resultado en algunas de las variantes del registro a si de otros 16 sobre 32 bits entonces si hay dos instrucciones de multiplicador de dos operan dos ambas
van a querer guardar el resultado en el registro a el compilador no puede evitar esto porque la instrucción ya es así entonces se va a producir una dependencia de salida porque hay dos instrucciones que quieren escribir en el mismo registro físico del procesador y esto es lo que el procesador ya el compilador no puede porque estamos en el entorno del procesador debe tratar de evitar sí
para ver bien cómo son los ámbitos del problema vamos a decir que la escritura en un registro es la definición y la lectura de un registro es el uso cuando yo tengo una instrucción cualquiera dentro del procesador que escribe un resultado en un registro por ejemplo el registro uno a partir del momento en que la instrucción quiere
escribir en el registro uno se dice que se definió si una escritura una asignación de ese resultado desde valor para el registro uno va a haber otras instrucciones más abajo que utilicen ese valor porque por algo lo generamos sí entonces todos los usos de ese valor que está en el registro uno si son lecturas del registro o usos
entonces la definición es el momento en el que yo le asignó un valor al registro y esto ocurre cuando la instrucción va a ser despachada a la ejecución ya en ese momento se reserva ese registro para ese valor y el uso para hacer todas las lecturas que hagan instrucciones posteriores
usando ese valor entonces luego de una definición puede haber varios usos en registros todas las lecturas que se hagan de ese registro hay un rango de vida de esto claro si el rango de vida de un valor es la duración entre la definición y el último uso de un registro está bien como sabemos cuál es el último uso del registro y no sabemos por qué después de una instrucción que leyó de ese registro
no sabemos si va a venir una nueva instrucción que lee otra vez ese registro podemos esperar hasta el final del programa lo que sí sabemos es que eventualmente el último uso de un registro en algún momento va a estar continuado por una nueva definición entonces una definición de un registro dura hasta tanto aparezca una nueva definición de ese mismo registro
las dependencias de salida y anti dependencias se produce cuando se redefine un registro durante un rango de vida previo en un entorno ordenado en un procesador secuencial totalmente yo voy a tener una secuencia de instrucciones en donde tengas una definición varios usos y una nueva definición comunes de misión
ordenada finalización ordenada no hay problema va a estar la primera definición van a estar todos los usos asociados a la primera definición y luego va a venir una nueva definición no hay problema en un entorno donde hay desorden de instrucciones al tirarlas en las estaciones de reserva si va a venir una definición [Música] van a ver varias instrucciones que
quieran usarlas pero nunca voy a estar seguro de que fueron todas porque puede venir la nueva definición aún cuando instrucciones que querían usar la primera definición todavía no se han ejecutado no han accedido al valor de la primera definición entonces tengo que asegurarme de que no se redefina el uso de ese registro en la asociación
del valor con el registro antes de que todos los usos anteriores se hayan llevado a cabo y ese es el problema que tenemos que tratar de resolver ya habíamos comentado anteriormente que las dependencias falsas la uar y el agua se resuelven con renombre que si yo cambio eso es el registro original que defino y la nueva definición del registro y les pongo
diferentes nombres el problema desaparece si en el caso de la aplicación de la instrucción de multiplicación de dos operan 220 loa emery que explícitamente pero implícitamente quieren escribir en el registro a si el procesador internamente podría decir que la primera de ellas se escribe en acero y la segunda de ellos escriben a uno con lo
cual ya hay un registro alguien diferente sí y entonces está empezando a traer el concepto de que vamos a tener un banco de registros que son los registros que ve el programador si el registro abriese en el caso de intel los registros de cero es de unos dedos hasta r31 en el caso de un ring genérico
y vamos a tener algún mecanismo para renombrar y que haya un ere 0 10 prima 10 prima prima o que exista algún otro banco de registros usados para el fin de aplicar el mecanismo de renombre si entonces avancemos en eso las técnicas para tratar dependencia falsa son la clásica frenamos todo hasta
y solucionar el problema que tenemos la instrucción que redefine el registro hasta que finaliza el rango de vida previo o re nombres los registros como dijimos que es asignar dinámicamente distintos nombres a las múltiples definiciones de un registro de la arquitectura acordémonos que acá estamos en hardware no estamos en software entonces asignar un nuevo nombre no es decir bueno este