Paralelismo y Pipelining
El paralelismo (parallelism) consiste en realizar trabajo en paralelo, al mismo tiempo.
El pipelining es una forma de paralelismo que consiste en dividir la tarea en sub-tareas y realizar estas al mismo tiempo. Es el concepto detrás de la línea de ensamble.
El tiempo en que el pipeline tarda en llenarse se conoce como pipeline latency.
Ejecución de Instrucciones
En la ejecución de una instrucción siempre se realizan ciertos pasos: leer la instrucción de memoria, decodificar la instrucción (qué debe hacer la instrucción), ejecutar la instrucción y, a veces, guardar un resultado.
Se puede dividir la ejecución de una instrucción en las siguientes sub-tareas:
- Instruction Fetch (IF)
- Instruction Decode (ID)
- Instruction Execute (IE)
- Write-Back (WB)
Pipeline Hazards
Pipeline Hazards: Problemas adicionales, propios de la naturaleza secuencial de la ejecución de los programas.
Los pipeline hazards se dividen en tres tipos:
- Structural Hazards
- Control Hazards
- Data Hazards
Structural Hazards
Los Structural Hazards ocurren cuando dos o más etapas del pipeline tratan de utilizar el mismo recurso único. Esto es reconocido como un error de diseño.
Control Hazards
Los Control Hazards ocurren cuando se altera el flujo normal secuencial de un programa debido a saltos (branches) y llamadas a subrutinas (calls).
Soluciones para Control Hazards
Para disminuir el impacto en los Control Hazards hay dos tipos de soluciones:
- Estrategias Estáticas
- Estrategias Dinámicas
Estrategias Estáticas
Las estrategias estáticas son las que se implementan durante la compilación.
- Loop Un-rolling: Consiste en copiar varias veces el cuerpo de un loop para que el número total de saltos sea menor.
- Delayed Branching: Un procesador que implementa delayed branching siempre ejecuta las instrucciones que ya ingresaron al pipeline, se tome o no el branch. Es trabajo del compilador encontrar una(s) instrucción(es) útil(es) que pueda(n) insertarse después del branch (en el branch delay slot) para que no se desperdicie el tiempo en caso de tomarse el branch.
Estrategias Dinámicas
Las estrategias dinámicas son las que se implementan durante la ejecución del código.
- Branch Prediction Buffer: El branch prediction buffer es una tabla de dos columnas (dirección y predicción) en la cual el procesador va tomando nota de la dirección de las instrucciones que son branches junto con uno o más bits de predicción (P).
- Branch Target Buffer: El branch target buffer es un branch prediction buffer al cual se le agrega una columna con la dirección del destino (target) del branch, así, se tiene disponible de inmediato.
- Branch Folding: Branch Folding se conoce como la técnica de guardar en un branch target buffer la instrucción del destino (target) del branch, y no solamente la dirección.
Data Hazards
Write After Write (WAW): Dos instrucciones escriben al mismo nombre. Si estas se reordenan y terminan en orden invertido, las instrucciones que acceden al nombre obtendrán un valor incorrecto.
Write After Read (WAR): Una instrucción lee y luego otra escribe al mismo nombre.
Los métodos para reducir o eliminar los data hazards son:
- Incorporar hardware adicional al pipeline para que estén disponibles los resultados antes (en registros temporales).
- Reordenar las instrucciones para cambiar la separación entre data dependencies.
Microprocesadores: Historia y Evolución
Microprocesador: Es el elemento de control (el más importante) en una computadora o sistema digital avanzado (PDAs, Celulares, iPods, etc.).
Lenguaje de máquina: Instrucciones que queremos que un microprocesador ejecute también están en binario.
Hitos Históricos
Texas Instruments desarrolló el primer microprocesador, el TMS 1000, el 17 de septiembre de 1971.
El TMS 1000 era un microprocesador de 4 bits que fue utilizado en una gama de calculadoras de Texas Instruments.
Intel fue fundada por Robert Noyce y Gordon Moore.
Gordon Moore es más conocido por una observación y predicción que él realizó llamada ahora Ley de Moore. Esta indica que el número de transistores en un microprocesador se duplica cada año.
El 4004 era un microprocesador de 4 bits con apenas 2,250 transistores.
La Altair 8800 fue la computadora que inspiró a dos jóvenes a fundar una empresa de software, ahora muy conocida: Bill Gates y Paul Allen en 1975.
Los principales desarrolladores tanto del 4004 como del 8008 y 8080 fueron Federico Faggin y Ted Hoff.
Los dos fundadores de Apple: Steve Jobs y Steve Wozniak.
Zilog fue fundada en 1974 por Federico Faggin, el principal diseñador de Intel.
Intel en 1978 lanzó al mercado el 8086 que daría inicio a la familia x86 (16 bits).
El primer microprocesador de 8 bits fue el 8008 de Intel.
Intel lanzó en 1985 el 80386, este procesador es muy importante ya que sus instrucciones de 32 bits son aún las más utilizadas en computadoras personales. Todas las aplicaciones de 32 bits actuales para computadoras personales las utilizan.
Arquitecturas RISC
Las principales arquitecturas RISC han sido: MIPS, Sun SPARC, ARM, IBM RS6000, HP Precision, DEC Alpha, Intel i860 y el Motorola 88000.
Entre las aplicaciones más conocidas de los MIPS están: Routers Cisco, Nintendo 64, Playstation 1 y 2 y PSP.
Generaciones Posteriores
Intel lanzó en 1993 la quinta generación de procesadores x86: El Pentium, marca que apoyó fuertemente.
Pentium 4 fue lanzado al mercado a finales del 2000 por Intel.
Procesadores Dual Core: En el 2005, AMD continuó innovando con el desarrollo de los primeros procesadores x86 de doble núcleo (dual core).
En la actualidad, un Core 2 Quad tiene más de 580 millones de transistores.