Sunteți pe pagina 1din 586

En alabanza de Organización ordenador y Diseño: El hardware / software de

interfaz, ARM ® Edición

“La selección de libros de texto es a menudo un acto frustrante de compromiso-pedagogía, la cobertura de


contenido, la calidad de la exposición, el nivel de rigor, el costo. Organización ordenador y Diseño es el libro raro
que golpea a todas las notas correctas en todos los ámbitos, sin compromiso. No sólo es el libro de texto
organización equipo de primer nivel, que es un ejemplo de lo que todos los libros de texto de la informática podría y
debería ser “.

- Michael Goldweber, Xavier University

"He estado usando Organización ordenador y Diseño durante años, desde la primera edición. Esta nueva
edición es otro notable mejoría en un texto ya clásico. La evolución de la computación de escritorio a la
informática móvil a grandes volúmenes de datos aporta una nueva cobertura de procesadores embebidos,
tales como el brazo, el nuevo material sobre cómo el software y el hardware interactúan para aumentar el
rendimiento y la computación en nube. Todo esto sin sacrificar los fundamentos “.

- Ed Harcourt, Universidad de St. Lawrence

“Para Millennials: Organización ordenador y Diseño es el libro de la arquitectura de computadores que debe

tener en su biblioteca (virtual). El libro es tanto antiguos como nuevos, ya que desarrolla la ley de

principios-Moore, abstracción, caso común venerable rápido, jerarquías redundancia, la memoria, el

paralelismo y la canalización, pero que se ilustran con diseños contemporáneos.”-Mark D. Hill, Universidad de

Wisconsin-Madison

“La nueva edición de Organización ordenador y Diseño mantiene el ritmo de los avances en la emergente integrado
y sistemas de múltiples núcleos (GPU), donde las tabletas y los teléfonos inteligentes / están convirtiendo
rápidamente en nuestros nuevos sistemas de escritorio. Este texto reconoce estos cambios, pero sigue ofreciendo
una rica base de los fundamentos de la organización del equipo y el diseño que serán necesarios para los
diseñadores de hardware y software que potencia esta nueva clase de dispositivos y sistemas “.

- David Kaeli, Universidad del Noroeste

“ Organización ordenador y Diseño proporciona más de una introducción a la arquitectura de computadores. Se prepara
al lector para los cambios necesarios para cumplir con las cada vez mayores necesidades de rendimiento de los
sistemas móviles y procesamiento de grandes volúmenes de datos a la vez que las dificultades en la escala de
semiconductores están haciendo todos los sistemas de potencia limitada. En esta nueva era de la informática, hardware
y software debe ser co-diseñado y la arquitectura a nivel de sistema es tan crítica como optimizaciones a nivel de
componentes “.

- Christos Kozyrakis, Universidad Stanford

“Patterson y Hennessy abordan brillantemente los problemas en constante cambio arquitecturas de hardware del
ordenador, haciendo hincapié en las interacciones entre los componentes de hardware y software en los distintos niveles
de abstracción. Intercalando E / S y conceptos de paralelismo con una variedad de mecanismos de hardware y software
en todo el libro, la nueva edición logra una excelente presentación integral de la arquitectura de computadores para la
era post-PC. Este libro es una guía esencial para los profesionales de hardware y software que enfrentan desafíos de
eficiencia energética y paralelo, en un Tablet PC de computación en la nube “.

- Jae C. Oh, Universidad de Siracusa


Esta página se ha dejado intencionadamente en blanco
ARM ® EDI T ION

Organización ordenador y Diseño

THEHARDWARE / SOFTWAREINTERFACE
David A. Patterson ha estado enseñando la arquitectura informática de la Universidad de California, Berkeley,
desde que se unió a la facultad en 1976, donde ocupa la Cátedra Pardee de Ciencias de la Computación. Su
enseñanza ha sido honrado por el premio Distinguished Teaching de la Universidad de California, el premio
Karlstrom de ACM, y la medalla de Educación Mulligan y Premio Pregrado Enseñanza del IEEE. Patterson recibió el
Premio IEEE técnico y el Premio ACM Eckert-Mauchly por sus contribuciones a RISC, y compartió el Premio de
almacenamiento de información Johnson IEEE para las contribuciones a RAID. También compartió la Medalla John
von Neumann del IEEE y el Premio C & C con John Hennessy. Al igual que su co-autor, Patterson es un miembro
de la Academia Americana de las Artes y las Ciencias, el Computer History Museum, ACM, IEEE, y fue elegido
miembro de la Academia Nacional de Ingeniería, la Academia Nacional de las Ciencias y la Ingeniería salón de la
fama de Silicon Valley. Sirvió en el Comité Asesor de Tecnología de la Información para el presidente de Estados
Unidos, como presidente de la división de CS en el departamento de Ingeniería Eléctrica e Informática de Berkeley,
como presidente de la Asociación de Investigación de Computación, y como Presidente de la ACM. Este registro
llevó a Premios de Servicio Distinguido de la ACM, CRA, y SIGARCH.

En Berkeley, Patterson dirigió el diseño y la implementación de RISC I, que puedan VLSI el primer equipo del conjunto de
instrucciones reducido, y el fundamento de la arquitectura SPARC comercial. Era un líder de las matrices redundantes de
discos proyecto Barato (RAID), lo que llevó a los sistemas de almacenamiento fiable de muchas compañías. Él también
estuvo implicado en la Red de Estaciones de Trabajo de proyecto (ahora), lo que llevó a la tecnología de clúster utilizado
por las compañías de Internet y más tarde a la computación en nube. Estos proyectos ganaron cuatro premios de tesis de
la ACM. Sus proyectos de investigación actuales son algoritmo de Máquina-personas y Algoritmos y Specializers para
demostrablemente óptimas implementaciones con capacidad de recuperación y eficiencia. El Laboratorio de AMP está
desarrollando algoritmos de aprendizaje automático escalable, modelos de programación almacén de escala por
ordenador de usar, y herramientas de crowdsourcing para obtener información valiosa rápidamente de grandes volúmenes
de datos en la nube. El Laboratorio ASPIRE utiliza profunda hardware y software co-tuning para lograr el más alto posible
rendimiento y eficiencia energética para sistemas de computación móvil y rack.

John L. Hennessy es el décimo presidente de la Universidad de Stanford, donde ha sido miembro de la


facultad desde 1977 en los departamentos de ingeniería eléctrica y ciencias de la computación. Hennessy es
un miembro de la IEEE y ACM; un miembro de la Academia Nacional de Ingeniería, la Academia Nacional de
Ciencias, y la Sociedad Americana de Filosofía; y miembro de la Academia Americana de las Artes y las
Ciencias. Entre sus muchos premios son el Premio Eckert-Mauchly 2001 por sus contribuciones a la
tecnología RISC, el Premio de Ingeniería Informática Seymour Cray 2001, y el Premio von Neumann Juan
2000, que compartió con David Patterson. También ha recibido siete doctorados honorarios.

En 1981, se inició el proyecto MIPS en Stanford con un puñado de estudiantes graduados. Después de completar el proyecto
en 1984, se tomó una licencia de la Universidad de cofound MIPS Computer Systems (ahora MIPS Technologies), que
desarrolló uno de los primeros microprocesadores RISC comerciales. A partir de 2006, más de 2 mil millones de MIPS
microprocesadores se han enviado en dispositivos que van desde juegos de video y computadoras de mano para que las
impresoras láser y conmutadores de red. Hennessy posteriormente dirigió el DASH (Director de Arquitectura de memoria
compartida), al que el primer prototipo de caché multiprocesador escalable coherente; muchas de las ideas fundamentales han
sido adoptadas en multiprocesadores modernas. Además de sus actividades técnicas y responsabilidades universitarias, se ha
seguido trabajando con numerosas empresas de nueva creación, tanto como asesor en fase inicial y un inversor.
ARM ® EDI T ION

Organización ordenador y Diseño


THEHARDWARE / SOFTWAREINTERFACE

David A. Patterson
Universidad de California, Berkeley

John L. Hennessy
Universidad Stanford

Con contribuciones de David Kaeli Universidad del Noreste Nicole Kevin Lim Hewlett-Packard John

Alexander Perry Universidad de Adelaida Kaiyan David Kirk Nickolls NVIDIA John Y. Oliver Cal
La Universidad de Kansas Peter
NVIDIA Zachary Kurmas Grand Valley Poly, San Luis Obispo Milos

J. Ashenden Universidad Estatal James R. Larus Escuela Prvulovic Georgia Tech Partha
Ashenden Designs Pty Ltd Jason
de Informática y Comunicaciones de Ciencias Ranganathan Google Marcos

D. Bakos de la EPFL Jacob Leverich la Universidad de Smotherman la Universidad de


Universidad de Carolina del Sur, Javier Stanford Clemson

Díaz Bruguera

Universidad de Santiago de Compostela Jichuan

Chang Google

Mateo Farrens
Universidad de California, Davis

AMSTERDAM • • BOSTON HEIDELBERG • LONDRES


NUEVA YORK • OXFORD • París • SAN DIEGO SAN
FRANCISCO • SINGAPUR • • SYDNEY TOKIO
Morgan Kaufmann es una huella de Elsevier
Editorial: Todd verde
Adquisiciones Editor: Steve Merken Editor
Desarrollo: Nate McFadden Project Manager:
Lisa Jones diseñador: Mateo Limbert

Morgan Kaufmann es una huella de Elsevier


50 Hampshire Street, 5th Floor, Cambridge, MA 02139, EE.UU.

Copyright © 2017 Elsevier Inc. Todos los derechos reservados

Ninguna parte de esta publicación puede ser reproducida o transmitida en cualquier forma o por cualquier medio, electrónico o mecánico, incluyendo fotocopias, grabación, o cualquier sistema
de almacenamiento y recuperación de información, sin el permiso por escrito del editor. Los detalles sobre cómo solicitar el permiso, más información sobre las políticas de permisos del editor y
nuestros acuerdos con organizaciones como el Copyright Clearance Center y la Agencia de licencias de derechos de autor, se pueden encontrar en nuestro sitio Web: www.elsevier.com/permissions

Este libro y las contribuciones individuales contenidos en él están protegidos por derechos de autor por el editor (que no sea como puede observarse en el presente documento).

avisos
El conocimiento y las mejores prácticas en este campo están cambiando constantemente. A medida que la investigación básica y amplían nuestra comprensión, los cambios en los métodos de investigación o

prácticas profesionales, pueden llegar a ser necesario. Profesionales e investigadores siempre deben confiar en su propia experiencia y conocimiento en la evaluación y el uso de cualquier información o

métodos descritos en el presente documento. En el uso de dicha información o métodos que deben ser conscientes de su propia seguridad y la de los demás, incluidos los partidos para los que tienen la

responsabilidad profesional.

Con todo el peso de la ley, ni el editor ni los autores, colaboradores, o editores, asumen ninguna responsabilidad por cualquier lesión y / o daños a personas o bienes como una cuestión de
responsabilidad por productos, negligencia o de otra, o de cualquier uso o funcionamiento de cualquier método, productos, instrucciones o ideas contenidas en el presente documento material.

Todo el material relativo a ARM ® La tecnología se ha reproducido con permiso de ARM Limited, y sólo debe ser utilizado con fines educativos. Todos los modelos basados ​en ARM mostrados
o mencionados en el texto no debe ser utilizada, reproducida o distribuida con fines comerciales, y en ningún caso deberá haber adquirido este libro de texto se interpretará como la concesión o
de cualquier tercero, expresamente o por implicación, impedimento o de otra , una licencia de uso de cualquier otra tecnología de ARM o no saben cómo. Materiales proporcionados por ARM
son © ARM Limited (o sus filiales).

Biblioteca del Congreso de datos Catalogación en la Publicación

Un registro de catálogo de este libro se encuentra disponible en la Biblioteca del Congreso

British Library Catalogación en la Publicación de Datos

Un registro de catálogo de este libro se encuentra disponible en la Biblioteca Británica

ISBN: 978-0-12-801733-3

Para obtener información sobre todas las publicaciones del

MK visite nuestro sitio Web en www.mkp.com

Impreso y encuadernado en los Estados Unidos de América


Para Linda,
que ha sido, es, y siempre será el amor de mi vida
EXPRESIONES DE GRATITUD

Figura 1.10.4 Cortesía de Cray Inc. Figura 1.10.5 Cortesía de Apple Computer,
Las figuras 1.7, 1.8 Cortesía de iFixit ( www.ifixit.com ).

Inc. Figura 1.10.6 Cortesía del Museo de Historia de la computadora. Figuras


Figura 1.9 Cortesía de Chipworks ( www.chipworks.com ).
5.17.1, 5.17.2 Cortesía del Museo de la Ciencia, Boston. Figura 5.17.4 Cortesía
Figura 1.13 Cortesía de Intel.
de MIPS Technologies, Inc. Figura 6.15.1 Cortesía de la NASA Ames Research
Las figuras 1.10.1, 1.10.2, 4.15.2 Cortesía del Instituto Charles Babbage, Universidad de

Minnesota Bibliotecas, de Minneapolis. Figuras 1.10.3, 4.15.1, 4.15.3, 5.12.3, 6.14.2 Center.

Cortesía de IBM.
Contenido

xv Prefacio

CAPÍTULOS

1 Las abstracciones y Tecnología 2 del ordenador

1.1 Introducción 3
1.2 Ocho Grandes ideas en Arquitectura de Computadores 11
1.3 por debajo de su Programa 13
1.4 Bajo las cubiertas 16
1.5 Tecnologías para la construcción procesadores y la memoria 24
28 1.6 Rendimiento
1.7 La energía de la pared 40
1.8 El cambio radical: el cambio de monoprocesadores a 43 multiprocesadores
1.9 cosas reales: Evaluación comparativa de la Intel Core i7 46
1.10 Falacias y errores 49
1.11 Observaciones finales 52
1,12 perspectiva histórica y lectura adicional 54
1.13 Ejercicios 54

2 Instrucciones: idioma del equipo 60

2.1 Introducción 62
2.2 Operaciones del Hardware 63
2.3 Operandos del Hardware 67
2.4 con y sin signo Números 75
2.5 Instrucciones de Representación en el ordenador 82
2.6 Operaciones lógicas 90
2.7 Instrucciones para hacer las Decisiones 93
2,8 de procedimientos de apoyo Computer Hardware 100
2.9 La comunicación con personas 110
2.10 LEGv8 direccionamiento para Wide Immediates y direcciones 115
2,11 Paralelismo e instrucciones de sincronización 125
2.12 Traducción e iniciar un programa 128
2.13 Ordenar AC Ejemplo de ponerlo todo junto 137
2.14 Arrays frente Punteros 146
X Contenido

2.15 Advanced Material: Compilación C e Interpretación de Java 150


2,16 cosas reales: Instrucciones MIPS 150
2.17 real Stuff: ARMv7 (32 bits) Instrucciones 152
Las instrucciones x86 154: 2.18 Materia real
2.19 Materia real: El resto de la Instrucción ARMv8 Set 163
2.20 Falacias y errores 169
2.21 Observaciones finales 171
2.22 perspectiva histórica y lecturas adicionales 173
2.23 Ejercicios 174

3 Aritmética para las computadoras 186

3.1 Introducción 188


3.2 Suma y resta 188
3.3 Multiplicación 191
3.4 División 197
3,5 de punto flotante 205
3.6 Paralelismo y ordenador Aritmética: Paralelismo palabra parcial 230
3.7 cosas reales: Streaming SIMD Extensions y extensiones vectoriales
avanzadas en 86 232
3.8 Materia real: El resto de las instrucciones aritméticas 234 ARMv8
3.9 El ir más rápido: palabra parcial paralelismo y Matrix Multiplicar 238
3.10 Falacias y errores 242
3.11 Observaciones finales 245
3,12 perspectiva histórica y lectura adicional 248
3.13 Ejercicios 249

4 El procesador 254
4.1 Introducción 256
4.2 Lógica Diseño Convenios 260
4.3 La construcción de un Datapath 263
4.4 una implementación simple Esquema 271
4.5 Una visión general de Pipelining 283
4.6 En tubería Datapath y Control 297
4.7 Datos de los peligros: Desvío de frente Stalling 316
4.8 Control de los peligros 328
4.9 Excepciones 336
4,10 Paralelismo a través de Instrucciones 342

4.11 Materia real: El procesador ARM Cortex-A53 e Intel Core i7 355 Tuberías
4.12 El ir más rápido: instrucción a nivel de paralelismo y la matriz 363 Multiplicar
4.13 avanzada Tema: Introducción al diseño digital utilizando un diseño de
hardware lenguaje para describir y modelo de una tubería y Más ería
Ejemplos 366
Contenido xi

4.14 Falacias y errores 366


4.15 Observaciones finales 367
4,16 perspectiva histórica y lectura adicional 368
4.17 Ejercicios 368

5 Grande y rápido: Explotación de jerarquía de la memoria 386

5.1 Introducción 388


5.2 Tecnologías de memoria 392
5.3 Los fundamentos de Caches 397
5.4 Medición y mejora caché de rendimiento 412
5.5 De ​fiar jerarquía de la memoria 432
5.6 Máquinas Virtuales 438
5.7 Memoria virtual 441
5.8 Un marco común para la jerarquía de la memoria 465
5.9 Cómo usar una máquina de estados finitos para controlar un caché simple 472

5,10 Paralelismo y jerarquía de la memoria: La coherencia de caché 477


5,11 Paralelismo y jerarquía de la memoria: Las matrices redundantes de discos baratos 481

5.12 Advanced Material: la implementación de controles de caché 482


5,13 cosas reales: El procesador ARM Cortex-A53 e Intel Core i7 Memoria Jerarquías
482
5,14 cosas reales: El resto del sistema y las instrucciones especiales ARMv8 487
5.15 El ir más rápido: El bloqueo y la caché de la matriz 488 Multiplicar
5.16 Falacias y errores 491
5.17 Observaciones finales 496
5,18 perspectiva histórica y lectura adicional 497
5.19 Ejercicios 497

6 Los procesadores paralelos de cliente a la nube 514

6.1 Introducción 516


6.2 La dificultad de crear programas de procesamiento en paralelo 518
6,3 SISD, MIMD, SIMD, SPMD, y el vector 523
6.4 Multithreading 530 Hardware
6.5 Multicore y Otros multiprocesadores de memoria compartida 533
6.6 Introducción a las unidades de procesamiento gráfico 538
6.7 Clusters, almacén Escala computadoras y otros multiprocesadores de paso de mensajes
545
6.8 Introducción a los multiprocesadores topologías de red 550
6.9 La comunicación con el mundo exterior: Cluster Redes 553
6.10 multiprocesador Puntos de referencia y el rendimiento Modelos 554
6,11 cosas reales: Evaluación comparativa y tejados del Intel Core i7 960 y la GPU NVIDIA
Tesla 564
xii Contenido

6.12 El ir más rápido: múltiples procesadores y Matrix Multiplicar 569


6.13 Falacias y errores 572
6.14 Observaciones finales 574
6,15 perspectiva histórica y lectura adicional 577
6.16 Ejercicios 577

APÉNDICE

UNA Los fundamentos de la lógica de diseño A-2

A.1 Introducción A-3


A.2 Gates, tablas de verdad, y Ecuaciones lógicas A-4
A.3 combinacional Lógica A-9
A.4 El uso de un lenguaje de descripción de hardware A-20
A.5 La construcción de una Unidad Lógica Aritmética Básica A-26
A.6 adición más rápido: Llevar a Lookahead A-37
A.7 Relojes A-47
A.8 Elementos de memoria: flip-flop, Cierres y Registros A-49
Elementos de memoria A.9: SRAM y DRAM A-57
A.10 máquinas de estado finito A-66
A.11 Timing Metodologías A-71
A.12 Campo dispositivos programables A-77
A.13 Observaciones finales A-78
A.14 Ejercicios A-79

Índice I-1

ONLINECONTENT

segundo Gráficos y Computación GPU B-2


B.1 Introducción B-3
B.2 Sistema GPU Arquitecturas B-7
Programación GPU B.3 B-12
B.4 multiproceso multiprocesador Arquitectura B-25
B.5 sistema de memoria paralelo B-36
B.6 flotante aritmética de punto B-41
B.7 real Stuff: La NVIDIA GeForce 8800 B-46
B.8 real Stuff: aplicaciones de mapeo a las GPU B-55
B.9 Falacias y errores B-72
B.10 Observaciones finales B-76
B.11 perspectiva histórica y lectura adicional B-77
Contenido xiii

De control de mapeado para Hardware C-2


do

C.1 Introducción C-3


C.2 Ejecución combinacional unidades de control C-4
C.3 La implementación de Finite-State Machine Control C-8
C.4 La implementación de la función Next-Estado con un secuenciador C-22
C.5 La traducción de un microprograma para Hardware C-28
Concluyendo C.6 Observaciones C-32
C.7 Ejercicios C-33

re
Una encuesta de RISC Arquitecturas para PC, Servidor, y
computadoras integradas D-2
D.1 Introducción D-3
D.2 modos de direccionamiento y Formatos de instrucciones D-5
D.3 Instrucciones: El MIPS Core subconjunto D-9
Instrucciones de D.4: extensiones multimedia de los RISCs de sobremesa / Servidor D-16
Instrucciones de D.5: extensiones digitales de procesamiento de señal de los RISCs Embedded D-19

Instrucciones D.6: Extensiones comunes a MIPS Core D-20


Instrucciones D.7 única para MIPS-64 D-25
Instrucciones D.8 única para Alfa D-27
Instrucciones de D.9 únicos a SPARC v9 D-29
Instrucciones D.10 única para PowerPC D-32
Instrucciones de D.11 única para PA-RISC 2.0 D-34
D.12 instrucciones exclusivas a ARM D-36
Instrucciones de D.13 única para el pulgar D-38
Instrucciones de D.14 única para SuperH D-39
Instrucciones de D.15 única para M32R D-40
D.16 Instrucciones única para MIPS-16 D-40
Comentarios finales D.17 D-43
Glosario G-1
Lectura adicional FR-1
Esta página se ha dejado intencionadamente en blanco
Prefacio

Lo más bello que podemos experimentar es el misterio. Es la fuente de todo arte y


ciencia verdaderos.

Albert Einstein, Lo que creo, 1930

Sobre este libro


Creemos que el aprendizaje en ciencias de la computación y la ingeniería debe reflejar el estado actual del
campo, así como introducir los principios que están dando forma a la informática. También creemos que los
lectores de todas las especialidades de la informática deben apreciar los paradigmas organizacionales que
determinan la capacidad, el rendimiento, la energía y, en última instancia, el éxito de los sistemas informáticos.

La moderna tecnología informática requiere que los profesionales de todas las especialidades de
computación para entender tanto de hardware como de software. La interacción entre el hardware y el
software en una variedad de niveles también ofrece un marco para comprender los fundamentos de la
computación. Si su interés principal es de hardware o software, la informática o la ingeniería eléctrica, las ideas
centrales en la organización del equipo y el diseño son los mismos. Por lo tanto, nuestro énfasis en este libro
es mostrar la relación entre el hardware y el software y centrarse en los conceptos que son la base para los
ordenadores actuales.

El reciente cambio de monoprocesador a los microprocesadores multinúcleo confirmó la solidez de esta perspectiva,
dada desde la primera edición. Mientras que los programadores podían ignorar el consejo y se basan en arquitectos de
ordenador, los autores de compiladores, e ingenieros de silicio para que sus programas se ejecutan más rápido o más sin un
cambio de eficiencia energética, que era ha terminado. Para que los programas se ejecuten más rápido, deben convertirse
en paralelo. Si bien el objetivo de muchos investigadores es hacer posible que los programadores ser conscientes de la
naturaleza paralela subyacente del hardware que son la programación, serán necesarios muchos años para realizar esta
visión. Nuestra opinión es que por lo menos durante la próxima década, la mayoría de los programadores van a tener que
entender la interfaz de hardware / software si quieren programas se ejecuten de manera eficiente en las computadoras
paralelas.

La audiencia de este libro incluye aquellos con poca experiencia en lenguaje ensamblador o el diseño de la
lógica que necesitan comprender la organización computadora básica, así como los lectores con experiencia en
lenguaje ensamblador y / o diseño de la lógica que quieran aprender cómo diseñar un ordenador o entender cómo
una sistema funciona y por qué funciona como lo hace.
xvi Prefacio

Sobre el otro libro


Algunos lectores pueden estar familiarizados con Computer Architecture: un enfoque cuantitativo, popularmente
conocido como Hennessy y Patterson. (Este libro a su vez es a menudo llamado Patterson y Hennessy.)
Nuestra motivación al escribir el libro anterior fue describir los principios de la arquitectura de computadores,
mediante fundamentos de ingeniería sólidas y las compensaciones costo / rendimiento cuantitativo. Se utilizó
un enfoque que combina ejemplos y mediciones, basado en los sistemas comerciales, para crear experiencias
de diseño realistas. Nuestro objetivo era demostrar que la arquitectura de computadores que se podía aprender
el uso de las metodologías cuantitativas en lugar de un enfoque descriptivo. Fue pensado para el profesional de
la informática seria que quería una comprensión detallada de los ordenadores.

La mayoría de los lectores de este libro no tiene intención de convertirse en arquitectos informáticos. El rendimiento y la
eficiencia energética de los sistemas de software en el futuro se verá afectada de manera espectacular, sin embargo, por la
forma en diseñadores de software así entender las técnicas básicas de hardware en el trabajo en un sistema. Por lo tanto, los
autores de compiladores, diseñadores, programadores de sistemas operativos y bases de datos, la mayoría de los ingenieros
de software necesitan una base firme en los principios presentados en este libro. Del mismo modo, los diseñadores de
hardware deben entender claramente los efectos de su trabajo sobre las aplicaciones de software.

Por lo tanto, sabía que este libro tenía que ser mucho más que un subconjunto del material en Arquitectura de
Computadores, y el material fue revisado ampliamente para que coincida con el público diferente. Estábamos tan
contentos con el resultado de que las ediciones posteriores de
Arquitectura de Computadores fueron revisados ​para eliminar la mayor parte del material de introducción; Por lo tanto, hay mucho
menos solapamiento en la actualidad que con las primeras ediciones de ambos libros.

¿Por ARMv8 para esta edición?


La elección de la arquitectura del conjunto de instrucciones es claramente crítica a la pedagogía de la arquitectura de un libro
de texto de ordenador. No queríamos un conjunto de instrucciones que requirió describir características barrocas
innecesarios para el primer conjunto de instrucciones de alguien, no importa lo popular que es. Idealmente, su conjunto de
instrucciones inicial debe ser un ejemplo, al igual que su primer amor. Sorprendentemente, a recordar tanto cariño.

Ya que había muchas opciones en el momento, para la primera edición de Arquitectura de Computadores: Un
Enfoque Cuantitativo inventamos nuestro propio conjunto de instrucciones RISC-estilo. Dada la creciente popularidad y
la sencilla elegancia del conjunto de instrucciones MIPS, cambiamos a ella para la primera edición de este libro y de
las ediciones posteriores de otro libro. MIPS nosotros y nuestros lectores ha servido bien.

La gran popularidad de la instrucción ARM configuración 14 mil millones de casos fueron enviados en 2015
condujo-algunos instructores de pedir una versión del libro basado en ARM. Incluso intentamos una versión de ella
para un subconjunto de capítulos para una edición asiática de este libro. Por desgracia, como temíamos, el
barroquismo del conjunto de instrucciones ARMv7 (32-bit de dirección) fue demasiado para que demos, por lo que no
consideró hacer el cambio permanente.
Prefacio xvii

Para nuestra sorpresa, cuando el brazo ofreció un conjunto de instrucciones de direcciones de 64 bits, que hizo tantos
cambios significativos que, en nuestra opinión, soportó más similitud con MIPS que lo hizo a ARMv7:

■ Los registros se ampliaron de 16 a 32;

■ El PC ya no es uno de estos registros;

■ La opción de ejecución condicional para cada instrucción se cayó;

■ Cargar múltiples y almacenar múltiples instrucciones fueron retirados;

■ se añadieron ramas de PC-relación con campos de dirección grandes;

■ Modos de direccionamiento se hicieron consistente para todas las instrucciones de transferencia de datos;

■ Menos instrucciones establecen códigos de condición;

y así. Aunque ARMv8 es mucho, mucho más grande que MIPS-el manual ARMv8 arquitectura de referencia es 5400
páginas de largo, hemos encontrado un subconjunto de instrucciones ARMv8 que es similar en tamaño y la naturaleza al
núcleo MIPS utilizado en las ediciones anteriores, que llamamos LEGv8 para evitar la confusión . Por lo tanto, escribimos
esta edición ARMv8.
Teniendo en cuenta que ambos ARMv8 ofrece instrucciones de dirección de 32 bits e instrucciones de dirección de 64 bits
dentro esencialmente el mismo conjunto de instrucciones, podríamos haber cambiado conjuntos de instrucciones, pero
mantuvo el tamaño de la dirección a 32 bits. Nuestro editor sondea la facultad que utilizó el libro y encontró que el 75%
prefiere ya sea direcciones más grandes o eran neutrales, por lo que aumenta el espacio de direcciones de 64 bits, lo que
puede tener más sentido hoy de 32 bits.

Los únicos cambios para la edición ARMv8 de la edición MIPS son los relacionados con el cambio de
conjuntos de instrucciones, que afecta principalmente Capitulo 2 , Capítulo 3 , La sección de memoria virtual en Capítulo
5 , Y el ejemplo corto VMIPS en Capítulo 6 . En
Capítulo 4 , Pasamos a las instrucciones ARMv8, cambiamos varias figuras, y añadimos un par de secciones de
“Elaboración”, pero los cambios eran más simples de lo que habíamos temido.
Capítulo 1 y el resto de los apéndices son prácticamente sin cambios. La extensa documentación en línea y en
combinación con la magnitud de ARMv8 hacen que sea difícil llegar a un reemplazo para la versión de MIPS Apéndice
A ( “Los ensambladores, enlazadores, y el simulador SPIM” en el MIPS Quinta Edición). En cambio, los capítulos
2, 3 y 5 son vistas generales rápidas de los cientos de instrucciones ARMv8 fuera de las instrucciones básicas
ARMv8 que cubrimos en detalle en el resto del libro. Creemos que los lectores de esta edición tendrán un buen
conocimiento de ARMv8 sin tener que arar a través de miles de páginas de documentación en línea. Y para
cualquier lector que aventurero, probablemente sería conveniente leer estas encuestas primero en conseguir un
marco sobre el que colgar en las muchas características de ARMv8.

En cuenta que estamos (todavía) no decimos que estamos cambiando permanentemente a ARMv8. Por ejemplo,
las dos versiones ARMv8 y MIPS de la quinta edición están disponibles para la venta ahora. Una posibilidad es que
habrá una demanda de ambas versiones MIPS y ARMv8 para futuras ediciones del libro, o incluso puede haber una
demanda de una tercera
xviii Prefacio

versión con otro conjunto de instrucciones. Cruzaremos ese puente cuando lleguemos a él. Por ahora,
esperamos su reacción a la retroalimentación y en este esfuerzo.

Cambios para la quinta edición


Tuvimos seis objetivos principales para la quinta edición de Organización ordenador y Diseño:
demostrar la importancia de la comprensión de hardware con un ejemplo ejecutable; resaltar los temas
principales a través de los temas mediante los iconos de margen que se introducen temprana; ejemplos se
actualizan para reflejar el cambio de la era de la PC a la era post-PC; esparcir el material sobre E / S a través
del libro en lugar de aislar en un solo capítulo; actualizar el contenido técnico para reflejar los cambios en la
industria desde la publicación de la cuarta edición en 2009; y poner apéndices y secciones opcionales en línea
en lugar de incluir un CD para reducir los costos y hacer que esta edición viable como un libro electrónico.

Antes de discutir las metas en detalle, vamos a ver la tabla de la página siguiente. Muestra las rutas
de hardware y software a través del material. Los capítulos 1, 4,
5 y 6 se encuentran en ambos caminos, sin importar la experiencia o el enfoque.
Capítulo 1 discute la importancia de la energía y cómo se motiva el cambio de un solo núcleo a los
microprocesadores multinúcleo e introduce los ocho grandes ideas en la arquitectura de computadores. Capitulo 2 es
probable que sea material de revisión para el hardware orientado, pero es una lectura esencial para el software
orientado, sobre todo para aquellos lectores interesados ​en aprender más acerca de los compiladores y lenguajes
de programación orientados a objetos. Capítulo 3 es para los lectores interesados ​en la construcción de un camino
de datos o en aprender más sobre aritmética de punto flotante. Algunos omitir partes de Capítulo 3 , Ya sea porque
no las necesitan, o porque ofrecen una revisión. Sin embargo, se introduce el ejemplo de ejecución de la matriz se
multiplican en este capítulo, que muestra cómo paralelos palabra parcial ofrece una mejora de cuatro veces, por lo
que no se salte las secciones 3.6 a 3,8. Capítulo 4 explica procesadores segmentados. secciones

4.1, 4.5, y 4.10 dan descripciones generales, y sección 4.12 da el siguiente aumento de rendimiento para multiplicar la
matriz para aquellos con un enfoque de software. Aquellos con un enfoque de hardware, sin embargo, se encuentra
que este capítulo presenta material del núcleo; También pueden, dependiendo de su origen, que quiera leer Apéndice
A en el diseño de la lógica de primer. El último capítulo de multicores, multiprocesadores, y clusters, es sobre todo el
contenido nuevo y debe ser leído por todos. Se reorganizó de manera significativa en esta edición para hacer que el
flujo de las ideas más naturales e incluir mucha más profundidad en la GPU, ordenadores almacén de escala, y la
interfaz de hardware y software de las tarjetas de interfaz de red que son clave para las agrupaciones.
Prefacio xix

Capítulo o apéndice secciones enfoque de software enfoque de hardware

1. Abstracciones y Tecnología de 01.01 a 01.11

Computadores 1.12 (Historia)

02.01 a 02.14

2. Instrucciones: Lenguaje del 2,15 (compiladores y Java)

ordenador 02.16 a 02.21

2.22 (Historia)

D. RISC Arquitecturas juego de instrucciones D.1 a D.17

3.1 a 3.5

03.06 a 03.09 (palabra parcial Paralelismo)


3. Aritmética para las computadoras

03.10 a 03.11 (Fallacies)

3.12 (Historia)

A. Los fundamentos de la lógica de diseño A1 a A13

4,1 (descripción general)

4.2 (Convenios Logic)

04.03 a 04.04 (Aplicación simple)

4,5 (Pipelining descripción general)

4,6 (Pipelined Datapath)


4. El Procesador
04.07 a 04.09 (Peligros, Excepciones)

04.10 a 04.12 (Paralelo, el Real cosas)

4.13 (Control Pipeline Verilog)

04.14 a 04.15 (Fallacies)

4.16 (Historia)

C. Control Mapping a Hardware C.1 a C.6

05.01 a 05.10

5,11 (Redundant Arrays de


Discos baratos)
5. grandes y rápidos: Explotación de
memoria Jerarquía
5,12 (Controller Cache Verilog)

05.13 a 05.16

5,17 (Historia)

6.1 a 6.8

6. Proceso Paralelo de cliente a la 6.9 (Redes)


nube 06.10 a 06.14

6,15 (Historia)

Unidades de Procesador de gráficos B. B.1 a B.13

Lea cuidadosamente Leer si tiene tiempo de leer Referencia

revisar o leer para la cultura


xx Prefacio

El primero de los seis objetivos para esta quinta edición era demostrar la importancia de la comprensión moderna de
hardware para obtener un buen rendimiento y la eficiencia energética con un ejemplo concreto. Como se mencionó
anteriormente, comenzamos con el paralelismo palabra parcial en Capítulo 3 para mejorar la matriz se multiplica por un factor de
4. Hacemos doble actuación en Capítulo 4 desenrollando el bucle para demostrar el valor de paralelismo a nivel de
instrucciones. Capítulo 5 duplica el rendimiento de nuevo mediante la optimización de cachés utilizando bloqueo. Finalmente, Capítulo
6 demuestra un aumento de velocidad de 14 a partir de 16 procesadores mediante el uso de paralelismo a nivel de hilo. Todos
los cuatro optimizaciones en complemento total de sólo 24 líneas de código C a nuestra matriz de ejemplo se multiplican inicial.

El segundo objetivo era ayudar a los lectores separan el bosque de los árboles mediante la
identificación de ocho grandes ideas de la arquitectura de computadores temprano y luego señalando
todos los lugares a los que ocurren en todo el resto del libro. Utilizamos (con suerte) fácil de recordar
iconos de margen y poner de relieve la palabra correspondiente en el texto para recordar a los lectores
de estos ocho temas. Hay cerca de 100 citas en el libro. Ningún capítulo tiene menos de siete ejemplos
de grandes ideas, y no tenía idea es citado menos de cinco veces. El rendimiento a través de
paralelismo, la canalización, y la predicción son los tres grandes ideas más popular, seguido de cerca
por la Ley de Moore. El capítulo procesador (4) es el que tiene el mayor número de ejemplos, que no es
una sorpresa ya que probablemente recibió la mayor atención de los arquitectos informáticos. La única
gran idea que se encuentra en cada capítulo es el rendimiento a través de paralelismo,

El tercer objetivo fue reconocer el cambio de generación en la computación de la era de la PC a la


era post-PC por esta edición con nuestros ejemplos y material. Así, Capítulo 1 se sumerge en los
intestinos de un tablet PC en lugar de un PC, y
Capítulo 6 describe la infraestructura de computación de la nube. También contamos con el brazo, que es el conjunto
de instrucciones de elección en los dispositivos móviles personales de la era post-PC, así como el conjunto de
instrucciones x86, que dominó la era de la PC y (hasta ahora) domina la computación en nube.

El cuarto objetivo era difundir el material de E / S a través del libro en vez de tenerlo en su propio capítulo,
tanto como difundimos paralelismo a lo largo de todos los capítulos de la cuarta edición. Por lo tanto, el material
de I / O en esta edición se puede encontrar en las Secciones 1.4, 4.9, 5.2, 5.5, 5.11 y 6.9. La idea es que los
lectores (e instructores) son más propensos a cubrir de E / S si no es segregado a su propio capítulo.

Este es un campo de rápido movimiento, y, como es siempre el caso para nuestras nuevas ediciones, una meta
importante es actualizar el contenido técnico. El ejemplo de ejecución es el ARM Cortex A53 y el procesador Intel Core
i7, lo que refleja nuestra era post-PC. Otros puntos destacados incluyen un tutorial sobre las GPU que explica su
terminología única, más profundidad en los equipos de almacén escala que componen la nube, y una inmersión
profunda en 10 tarjetas Gigabyte Ethernet.

Para mantener el libro principal corto y compatible con los libros electrónicos, colocamos el material opcional como
apéndices en línea en lugar de en un CD que acompaña al igual que en ediciones anteriores.

Por último, hemos actualizado todos los ejercicios en el libro.


Mientras que algunos elementos cambiados, hemos conservado los elementos de libros útiles de ediciones
anteriores. Para que el libro mejor como referencia, todavía colocamos las definiciones de nuevos términos en los
márgenes en su primera aparición. El elemento libro llamado
Prefacio xxi

“Rendimiento de los programas entendimiento” secciones ayuda al lector a entender el rendimiento de sus
programas y cómo mejorarlo, al igual que el “/ software de interfaz de hardware” elemento book ayudaron a los
lectores a comprender las ventajas y desventajas en esta interfaz. “The Big Picture” sección permanece de manera
que el lector ve el bosque a pesar de todos los árboles. “Examínese” secciones ayudan a los lectores para
confirmar su comprensión del material en el primer tiempo a través de las respuestas que se encuentran al final de
cada capítulo. Esta edición todavía incluye la tarjeta de referencia ARMv8 verde, que se inspiró en la “tarjeta verde”
del IBM System / 360. Esta tarjeta se ha actualizado y debe ser una referencia útil al escribir programas en
lenguaje ensamblador ARMv8.

Soporte instructor
Hemos recogido una gran cantidad de material para ayudar a los instructores a enseñar los cursos que utilizan
este libro. Las soluciones a los ejercicios, las cifras del libro, conferencia diapositivas y otros materiales están
disponibles para los instructores que se registren con el editor. Además, el sitio web complementario proporciona
enlaces a una edición libre de Comunidad de ARM DS-5 suite de software profesional que contiene un ARMv8-A
(64-bit) simulador de la arquitectura, así como el contenido avanzada adicional para el estudio adicional, apéndices,
glosario, referencias y lecturas recomendadas. Consulte el sitio Web de la editorial para más información:

textbooks.elsevier.com/9780128017333

Observaciones finales
Si lee la sección de agradecimientos siguiente, se verá que fuimos a grandes esfuerzos para corregir errores. Desde
un libro pasa por muchas impresiones, tenemos la oportunidad de hacer aún más correcciones. Si descubre algún
restantes, insectos resistentes, por favor, póngase en contacto con el editor por correo electrónico en codARMbugs @
mkp.com o por correo de baja tecnología utilizando la dirección que se encuentra en la página de derechos de autor.

Esta edición es la tercera ruptura en la colaboración de larga data entre Hennessy y Patterson, que
comenzaron en 1989. Las exigencias de funcionamiento de una de las grandes universidades del mundo
significaba que el presidente Hennessy ya no podía hacer el compromiso sustancial para crear una nueva
edición. El autor restante se sintió una vez más como un equilibrista sin red de seguridad. Por lo tanto, las
personas en los reconocimientos y colegas de Berkeley jugaron un papel aún mayor en la conformación de
los contenidos de este libro. Sin embargo, en esta ocasión sólo hay un autor culpable de que el nuevo
material en lo que está a punto de leer.

Expresiones de gratitud

Con cada edición de este libro, somos muy afortunados de recibir la ayuda de muchos lectores, revisores y
colaboradores. Cada una de estas personas ha ayudado a hacer de este libro mejor.

Agradecemos la colaboración de Khaled Benkrid y sus colegas en ARM Ltd., que revisó con
cuidado el material relacionado con ARM y proporciona información útil.
xxii Prefacio

Capítulo 6 fue tan extensamente revisada que hemos hecho una revisión independiente de las ideas y
contenidos, y yo hicimos cambios en base a la retroalimentación de cada revisor. me gustaría agradecer Christos
Kozyrakis de la Universidad de Stanford por sugerir el uso de la interfaz de red para clústeres para demostrar la
interfaz de hardware-software de E / S y sugerencias sobre la organización del resto del capítulo; Mario Flagsilk de
la Universidad de Stanford para proporcionar detalles, diagramas y mediciones de rendimiento de la NetFPGA
NIC; y la siguiente para obtener sugerencias sobre cómo mejorar el capítulo:

David Kaeli de la Universidad del Noreste, partha Ranganathan de HP Labs,


David Wood de la Universidad de Wisconsin, y mis colegas de Berkeley Siamak Faridani, Shoaib
Kamil, Yunsup Lee, Zhangxi Tan, y Andrew Waterman.
Gracias especiales a Rimas Avizenis de la Universidad de Berkeley, quien desarrolló las distintas versiones de la matriz
se multiplican y suministra los números de rendimiento también. A medida que trabajaba con su padre, mientras que yo era
un estudiante graduado de la UCLA, que era un buen simetría para trabajar con Rimas en la UCB.

También deseo agradecer a mi antiguo colaborador Randy Katz de la Universidad de Berkeley, que ayudó a
desarrollar el concepto de grandes ideas en la arquitectura de computadores como parte de la extensa revisión de una
clase de grado que hicimos juntos.
me gustaría agradecer David Kirk, John Nickolls, y sus colegas en NVIDIA (Michael Garland, John
Montrym, Doug Voorhies, Lars Nyland, Erik Lindholm, Paulius Micikevicius, Massimiliano fatica, Stuart
Oberman, y Vasily Volkov) para escribir el primer apéndice en profundidad sobre las GPU. Me gustaría volver
a expresar mi reconocimiento a Jim Larus, recientemente nombrado Decano de la Facultad de Ciencias de
Informática y Comunicaciones de la EPFL, por su disposición para contribuir a su experiencia en
programación en lenguaje ensamblador, así como para dar la bienvenida a los lectores de este libro en
relación con el uso del simulador desarrolló y mantiene.

También estoy muy agradecido a Zachary Kurmas de Grand Valley State University, que actualiza y crea
nuevos ejercicios, basados ​en los originales creadas por Perry Alexander ( La Universidad de Kansas); Jason
Bakos ( Universidad de Carolina del Sur);
Javier Bruguera ( Universidad de Santiago de Compostela); Mateo Farrens
(Universidad de California, Davis); David Kaeli ( Universidad del Noroeste); Nicole Kaiyan ( Universidad de
Adelaide); John Oliver ( Cal Poly, San Luis Obispo); Milos Prvulovic ( Georgia Tech); Jichuan Chang ( Google);
Jacob Leverich ( Stanford);
Kevin Lim ( Hewlett Packard); y Partha Ranganathan ( Google).
Adicional agradecimiento a Jason Bakos para la actualización de las diapositivas de las clases. Estoy
agradecido a los muchos profesores que han respondido a las encuestas de la editorial, revisados
​nuestras propuestas, y asistido a grupos de enfoque para analizar y responder a nuestros planes para
esta edición. Incluyen las siguientes personas: Grupos de Enfoque: Bruce Barton (Suffolk County
Community College), Jeff Braun (Montana Tech), Ed Gehringer (North Carolina State), Michael
Goldweber (Universidad de Xavier), Ed Harcourt (Universidad de St. Lawrence), Mark hill (Universidad de
Wisconsin, Madison), Patrick Homer (Universidad de Arizona), Norma Jouppi (HP Labs), Dave Kaeli
(Universidad del Noreste), Christos Kozyrakis (Universidad de Stanford), Jae C. Oh (Universidad de
Syracuse), Lu Peng ( LSU), Milos Prvulovic (Georgia Tech), Partha Ranganathan (HP Labs), David Wood
(Universidad de Wisconsin), Craig Zilles (Universidad de Illinois en Urbana-Champaign).
Prefacio xxiii

y Comentarios: Mahmoud Abou-Nasr (Wayne State University), Perry Alexander (La Universidad de Kansas), Behnam Arad
(Sacramento State University), Hakan Aydin (George Mason University), Hussein Badr (Universidad Estatal de Nueva York en

Stony Brook) , Mac Baker (Instituto Militar de Virginia), Ron Barnes (George Mason University), Douglas Blough (Instituto de
Tecnología de Georgia), Kevin negrita (Seattle Pacific University), Miodrag Bolic (Universidad de Ottawa), John Bonomo
(Westminster College), Jeff Braun (Montana Tech), Tom Briggs (Universidad de Shippensburg), Mike brillante (Grove City

College), Scott Burgess (Humboldt State University), Fazli Lata (Universidad de Bilkent), Warren R. Carithers (Rochester Institute
of Technology), Bruce Carlton ( Mesa Community College), Nicholas Carter (Universidad de Illinois en

Urbana-Champaign),Anthony Cocchi (The City University of New York), Don Cooley (Utah State University), Gene Cooperman

(Universidad del Noreste), Robert D. Cobre (Allegheny College), Amy Csizmar, Dalal (Universidad de Carleton), Daniel Dalle

(Universidad de Sherbrooke) , Edward W. Davis (North Carolina State University), Nathaniel J. Davis (Instituto de Tecnología de la

Fuerza Aérea), Molisa Derk (Oklahoma City University), Andrea Di Blas (Universidad de Stanford), Derek Eager (Universidad de
Saskatchewan), Ata Elahi (Souther Connecticut State University), Ernest Ferguson (Northwest Missouri State University), Rhonda

Kay Gaede (La Universidad de Alabama), Etienne M. Gagnon (Universidad de Quebec en Montreal), Costa Gerousis (Christopher

Newport University), Paul Gillard (Memorial University of Newfoundland), Michael Goldweber (Universidad de Xavier), Georgia

Grant (Colegio de San Mateo),Paul V. Gratz (Texas A & M University), Merrill Hall (Colegio del Maestro), Tyson Hall (Universidad
Adventista del Sur), Ed Harcourt (Universidad de St. Lawrence), Justin E. Harlow (Universidad del Sur de Florida), Paul F. Hemler

(Hampden Sydney College), Jayantha Herath (St. Cloud State University), Martin Herbordt (Universidad de Boston), Steve J.

Hodges (Cabrillo), Kenneth Hopkinson (Universidad de Cornell), Bill Hsu (San Francisco State University), Dalton Hunkins

(Universidad San Buenaventura), Baback Izadi (Universidad Estatal de Nueva York-New Paltz), Reza Jafari, Robert W. Johnson
(Universidad técnica de Colorado), Bharat Joshi (Universidad de Carolina del Norte, Charlotte), Nagarajan Kandasamy

(Universidad de Drexel ), Rajiv Kapadia, Ryan Kastner (Universidad de California, Santa Bárbara),Merrill Hall (Colegio del

Maestro), Tyson Hall (Universidad Adventista del Sur), Ed Harcourt (Universidad de St. Lawrence), Justin E. Harlow (Universidad

del Sur de Florida), Paul F. Hemler (Hampden Sydney College), Jayantha Herath ( St. Cloud Universidad del Estado), Martin

Herbordt (Universidad de Boston), Steve J. Hodges (Cabrillo), Kenneth Hopkinson (Universidad de Cornell), Bill Hsu (San
Francisco State University), Dalton Hunkins (Universidad San Buenaventura), Baback Izadi (Universidad Estatal de Nueva

York-New Paltz), Reza Jafari, Robert W. Johnson (Universidad técnica de Colorado), Bharat Joshi (Universidad de Carolina del

Norte, Charlotte), Nagarajan Kandasamy (Universidad de Drexel), Rajiv Kapadia, Ryan Kastner (Universidad de California, Santa
Bárbara),Merrill Hall (Colegio del Maestro), Tyson Hall (Universidad Adventista del Sur), Ed Harcourt (Universidad de St.

Lawrence), Justin E. Harlow (Universidad del Sur de Florida), Paul F. Hemler (Hampden Sydney College), Jayantha Herath ( St.
Cloud Universidad del Estado), Martin Herbordt (Universidad de Boston), Steve J. Hodges (Cabrillo), Kenneth Hopkinson

(Universidad de Cornell), Bill Hsu (San Francisco State University), Dalton Hunkins (Universidad San Buenaventura), Baback Izadi
(Universidad Estatal de Nueva York-New Paltz), Reza Jafari, Robert W. Johnson (Universidad técnica de Colorado), Bharat Joshi (Universidad de Carolina del Norte, Charlotte), Nagar

EJ Kim (Universidad de Texas A & M University), Kim (Universidad Nacional de Seúl) Jihong, Jim Kirk
(Union University), Geoffrey S. Knauth (Lycoming College), Manish M. Kochhal (Wayne State), Suzan
Koknar-Tezel (Universidad de San José) , Angkul Kongmunvattana (Columbus State University), abril
de Kontostathis (Ursino College), Christos Kozyrakis (Universidad de Stanford), Danny Krizanc
(Wesleyan University), Ashok Kumar, S. Kumar (Universidad de Texas), Zachary Kurmas (Grand
Valley State University ), Adrian Lauf (Universidad de Louisville), Robert

N. Lea (Universidad de Houston), Alvin Lebeck (Universidad de Duke), Baoxin Li (Arizona State
University), Li Liao (Universidad de Delaware), Gary Livingston (Universidad de Massachusetts),
Michael Lyle, Douglas W. Lynn (Oregon Institute de Tecnología), Yashwant K Malaiya (Universidad
del Estado de Colorado), Stephen Mann (Universidad de Waterloo), Bill Marcos (Universidad de
Texas en Austin), Ananda Mondal (Universidad Claflin), Alvin Moser (Universidad de Seattle),
xxiv Prefacio

Walid Najjar (Universidad de California, Riverside), Vijaykrishnan Narayanan (Penn State University), Danial J.
Neebel (Loras College), Victor Nelson (Universidad de Auburn), John Nestor (Lafayette College), Jae C. Oh
(Universidad de Syracuse), Joe Oldham (Center College), Timour Paltashev, James Parkerson (Universidad de
Arkansas), Shannak Pawagi (SUNY en Stony Brook), Steve Pearce, Ted Pedersen (Universidad de Minnesota),
Lu Peng (Louisiana State University), Gregory D. Peterson (La Universidad de Tennessee), William Pierce (Hood
College), Milos Prvulovic (Georgia Tech), Partha Ranganathan (HP Labs), Dejan Rašković (Universidad de
Alaska, Fairbanks) Brad Richards (Universidad de Puget Sound), romano Rozánov, Louis Rubinfield (Universidad
de Villanova), Md Abdus Salam (Universidad del Sur), Agustín Samba (Kent State University),Robert Schaefer
(Daniel Webster College), Carolyn JC Schauble (Colorado State University), Keith Schubert (CSU San
Bernardino), William L. Schultz, Kelly Shaw (Universidad de Richmond), Shahram Shirani (Universidad de
McMaster), Scott Sigman (Drury University ), Shai Simonson (Stonehill College), Bruce Smith, David Smith, Jeff
W. Smith (Universidad de Georgia, Athens), Mark Smotherman (Universidad de Clemson), Philip Snyder (Johns
Hopkins University), Alex Sprintson (Texas A & M), TimoteoPhilip Snyder (Universidad Johns Hopkins), Alex
Sprintson (Texas A & M), TimoteoPhilip Snyder (Universidad Johns Hopkins), Alex Sprintson (Texas A & M),
Timoteo

D. Stanley (Universidad de Brigham Young), Dean Stevens (Morningside College), Nozar Tabrizi
(Universidad de Kettering), Yuval Tamir (UCLA), Alexander Taubin (Universidad de Boston), Will
Thacker (Universidad de Winthrop), Mithuna Thottethodi (Universidad de Purdue), Manghui Tu
(Universidad del Sur de Utah), Dean Tullsen (UC San Diego), Steve VanderLeest (Calvin College),
Christopher Vickery (Queens College de CUNY), Rama Viswanathan (Beloit College), Ken Vollmar
(Missouri State University), Guoping Wang ( Indiana-Purdue University), Patricia Wenner (Universidad
de Bucknell), Kent Wilken (Universidad de California, Davis), David Wolfe (Gustavus Adolphus
College), David Wood (Universidad de Wisconsin, Madison), Ki Hwan Yum (Universidad de Texas,
San Antonio), Mohamed Zahran (City College de Nueva York), Amr Zaky (Universidad de Santa
Clara), Gerald D. Zarnett (Universidad de Ryerson),Nian Zhang (Escuela de Minas de Dakota del Sur
y Tecnología), Jiling Zhong (Universidad de Troy), Zhou Huiyang (North Carolina State University),
Weiyu Zhu (Illinois Wesleyan University).

Un agradecimiento especial también va a Marcos Smotherman para la fabricación de múltiples pasadas para encontrar
fallos técnicos y escritura que mejoraron significativamente la calidad de esta edición.

Queremos agradecer a la familia Morgan Kaufmann extendida por haber accedido a publicar este libro de
nuevo bajo la hábil dirección de Todd Green, Steve Merken y Nate McFadden: Desde luego, no podría haber
completado el libro sin ellos. También queremos dar las gracias a Lisa Jones, que logró el proceso de producción
de libros, y Mateo Limbert, quien hizo el diseño de la cubierta. La funda se cierra anticipa al contenido era
post-PC de esta edición de la cubierta de la primera edición. Las contribuciones de las casi 150 personas que
hemos mencionado aquí han ayudado a hacer de esta nueva edición lo que espero que sea nuestra mejor libro
todavía. ¡Disfrutar!

David A. Patterson
Esta página se ha dejado intencionadamente en blanco
1
Las abstracciones y

Tecnología de

La civilización avanza Computadores


mediante la ampliación del
1.1 Introducción 3
número de operaciones
1.2 Ocho Grandes ideas en Arquitectura de
importantes que podemos
Computadores 11
realizar sin pensar en ellas.
1.3 A continuación de su programa 13

1.4 Debajo de las sábanas dieciséis

1.5 Tecnologías para la construcción procesadores y la memoria 24


Alfred North Whitehead,
Una Introducción a la Matemática, 1911

Organización ordenador y Diseño. DOI: http://dx.doi.org/10.1016/B978-0-12-801733-3.00001-0


2016
© 2016 Elsevier Inc. Todos los derechos reservados.
1.6 Actuación 28

1.7 La energía de la pared 40

1.8 El cambio radical: el cambio de monoprocesadores a

multiprocesadores 43

1.9 Cosas reales: Evaluación comparativa de la Intel Core i7 46

1.10 Falacias y errores 49

1.11 Observaciones finales 52


1.12 perspectiva histórica y lectura adicional 54

1.13 Ejercicios 54

1.1 Introducción

Bienvenidos a este libro! Estamos encantados de tener esta oportunidad para transmitir la emoción del mundo
de los sistemas informáticos. Esto no es un campo seco y triste, donde el progreso es glacial y donde las
nuevas ideas atrofian de negligencia. ¡No! Las computadoras son el producto de la increíblemente vibrante
industria de la tecnología de la información, todos los aspectos de los cuales son responsables de casi el 10%
del producto nacional bruto de los Estados Unidos, y cuya economía se ha convertido depende en parte de las
rápidas mejoras en la tecnología de la información prometidos por Moore Ley. Esta industria inusual abraza la
innovación a un ritmo impresionante. En los últimos 30 años, ha habido una serie de nuevos ordenadores cuya
introducción apareció a revolucionar la industria de la computación; estas revoluciones fueron interrumpidos
sólo porque alguien construyó un equipo aún mejor.

Esta carrera de innovar ha conducido a un progreso sin precedentes desde el inicio de la


computación electrónica a finales de 1940. Tenía la industria del transporte mantuvo el ritmo de la
industria informática, por ejemplo, hoy podríamos viajar de Nueva York a Londres en un segundo por
un centavo. Tome un momento para contemplar cómo una mejora tan cambiaría la sociedad-vida en
Tahití mientras se trabaja en San Francisco, ir a Moscú para una noche en el Bolshoi Ballet y se puede
apreciar las implicaciones de tal cambio.
4 Capítulo 1 abstracciones y Tecnología de Computadores

Las computadoras han dado lugar a una tercera revolución de la civilización, con la revolución de la
información tomando su lugar junto a las revoluciones agrícola e industrial. La multiplicación resultante de la
fuerza intelectual de la humanidad y llegar de forma natural ha afectado profundamente a nuestra vida
cotidiana y ha cambiado la forma en que la búsqueda de nuevos conocimientos se lleva a cabo. Ahora hay una
nueva veta de la investigación científica, con los científicos computacionales unirse a los científicos teóricos y
experimentales en la exploración de nuevas fronteras en la astronomía, biología, química y física, entre otros.

La revolución del ordenador continúa. Cada vez que el costo de la computación mejora por otro factor de 10,
las oportunidades para los ordenadores se multiplican. Las aplicaciones que eran económicamente inviable
repente se convierten en práctica. En el pasado reciente, las siguientes aplicaciones fueron “la informática ficción.”

■ Ordenadores en los automóviles: Hasta microprocesadores mejoraron dramáticamente en precio y rendimiento a


principios de 1980, el control de ordenador de los vehículos era ridícula. Hoy en día, los ordenadores reducir la

contaminación, mejorar la eficiencia de combustible a través de los controles del motor, y aumentar la seguridad a través
de las advertencias de punto ciego, advertencias de salida de carril, detección de objetos móviles, y la inflación del

airbag para proteger a los ocupantes en caso de accidente.

■ Celulares: ¿Quién habría imaginado que los avances en los sistemas informáticos conduciría a más de la
mitad del planeta que tienen teléfonos móviles, lo que permite la comunicación de persona a persona a
casi cualquier persona en cualquier parte del mundo?

■ Proyecto Genoma Humano: El costo del equipo de cómputo para mapear y analizar secuencias de ADN
humano estaba a cientos de millones de dólares. Es poco probable que alguien hubiera considerado este
proyecto tenía los gastos de la computadora sido de 10 a 100 veces más alto, ya que habría sido de 15 a
25 años antes. Además, los costes siguen bajando; que pronto será capaz de adquirir su propio genoma,
lo que permite la atención médica que se adapta a ti.

■ Red mundial: No en existencia en el momento de la primera edición de este libro, la web se ha transformado
nuestra sociedad. Para muchos, la web ha sustituido a las bibliotecas y periódicos.

■ Los motores de búsqueda: A medida que el contenido de la web creció en tamaño y en valor, la búsqueda de
información relevante se hizo cada vez más importante. Hoy en día, muchas personas dependen de los motores de
búsqueda para una parte tan grande de su vida que sería una dificultad para ir sin ellos.

Es evidente que los avances en esta tecnología ahora afectan a casi todos los aspectos de nuestra sociedad. avances
de hardware han permitido a los programadores crear software maravillosamente útil, lo que explica por qué los
ordenadores son omnipresentes. Actualmente, la ciencia ficción sugiere aplicaciones asesinas del mañana: ya en su camino
son las gafas que aumentan la realidad, la sociedad sin dinero en efectivo, y los coches que pueden conducir a sí mismos.
1.1 Introducción 5

Las clases tradicionales de Aplicaciones Informáticas y sus


características
A pesar de un conjunto común de tecnologías de hardware (ver secciones 1.4 y 1.5) se utiliza en ordenadores que van
computadora personal (PC) Un
desde electrodomésticos inteligentes a teléfonos celulares a los superordenadores más grandes, estas aplicaciones
equipo diseñado para ser utilizado por
tienen diferentes requisitos de diseño diferentes y emplean las tecnologías de hardware básicos de diferentes
un individuo, por lo general la
maneras. En términos generales, los ordenadores se utilizan en tres clases diferentes de aplicaciones.
incorporación de una pantalla gráfica,
un teclado y un ratón.
ordenadores personales (PCs) son posiblemente la forma más conocida de la informática, que los lectores de este
libro probablemente han utilizado ampliamente. Las computadoras personales destacan la entrega de un buen rendimiento
para los usuarios individuales a bajo costo y por lo general se ejecutan software de terceros. Esta clase de computación
servidor Una computadora utiliza para
impulsó la evolución de muchas tecnologías de computación, que es meramente los 35 años!
ejecutar programas más grandes para
múltiples usuarios, a menudo al mismo
servidores son la forma moderna de lo que antes eran los ordenadores mucho más grandes, y por lo general sólo se accede tiempo, y por lo general sólo se accede

a través de una red. Los servidores están orientados a que llevan las cargas de trabajo de tamaño considerable, que pueden a través de una red.

consistir en cualquiera de las aplicaciones complejas, por lo general solo una aplicación o científicos o de ingeniería manipulación

de muchos pequeños trabajos, como ocurriría en la construcción de un servidor web de gran tamaño. Estas aplicaciones se

basan generalmente en software de otra fuente (tal como un sistema de base de datos o simulación), pero a menudo se modifican
supercomputadora Una clase de
o personalizada para una función particular. Los servidores se construyen a partir de la misma tecnología básica que los ordenadores con el más alto
ordenadores de sobremesa, pero proporcionan una mayor computación, almacenamiento y entrada / capacidad de producción. rendimiento y coste; que se
En general, los servidores también ponen un mayor énfasis en la fiabilidad, ya que un accidente es generalmente más costoso de configuran como servidores y

lo que sería en un PC de un solo usuario. suelen costar decenas a cientos


de millones de dólares.

Servidores abarcan la más amplia gama de costos y la capacidad. En el extremo inferior, un servidor puede ser poco más terabyte (TB) Originalmente

que una computadora de escritorio sin una pantalla o un teclado y un costo de mil dólares. Estos servidores de gama baja se 1,099,511,627,776 (2 40) bytes, aunque las
comunicaciones y secundarias
utilizan normalmente para el almacenamiento de archivos, aplicaciones para pequeñas empresas, o simples servidores web. En
desarrolladores de sistemas de
el otro extremo se encuentran
almacenamiento empezaron a utilizar el
superordenadores , que en el presente consisten de decenas de miles de procesadores y muchos terabytes de la
término para significar
memoria, y costar decenas a cientos de millones de dólares. Supercomputadoras se utilizan por lo general para los 1.000.000.000.000 (10 12) bytes. Para
cálculos científicos y de ingeniería de gama alta, tales como la predicción del tiempo, la exploración de petróleo, reducir la confusión, ahora utilizamos el
determinación de la estructura de proteínas, y otros problemas en gran escala. Aunque tales superordenadores término tebibyte (TiB) para 2 40 bytes,

representan el pico de las capacidades de computación, que representan una fracción relativamente pequeña de los definiendo terabyte

servidores y por tanto un proporcionalmente pequeña fracción del mercado total de ordenador en términos de ingresos
total.
(TB) en el sentido de 10 12 bytes.
Figura 1.1 muestra el rango
Ordenadores integrados son la clase más grande de computadoras y abarcan una amplia gama de completo de valores decimales y
aplicaciones y rendimiento. ordenadores integrados incluyen los microprocesadores se encuentran en su coche, los binarios y nombres.
equipos de un aparato de televisión y las redes de procesadores que controlan un avión de carga o moderno buque.
ordenador incorporado
Los sistemas informáticos incorporados están diseñados para ejecutar una aplicación o un conjunto de aplicaciones
Un ordenador dentro de otro dispositivo
relacionadas que normalmente están integrados con el hardware y entrega como un solo sistema; por lo tanto, a
que se utiliza para ejecutar una
pesar del gran número de ordenadores integrados, la mayoría de los usuarios nunca realmente ver que están aplicación predeterminada o una
utilizando una computadora! colección de software.
6 Capítulo 1 abstracciones y Tecnología de Computadores

plazo término

decimal Valor abreviatura binario Abreviatura Valor% más grande


kilobyte KB 10 3 kibibyte KiB 2 10 2%

megabyte MEGABYTE 10 6 mebibyte MiB 2 20 5%

gigabyte GB 10 9 gibibyte Gibraltar 2 30 7%

terabyte tuberculosis 10 12 tebibyte TiB 2 40 10%


petabyte PB 10 15 pebibyte PiB 2 50 13%
Exabyte EB 10 18 exbibyte EiB 2 60 15%
zetabyte ZB 10 21 zebibyte ZiB 2 70 18%
yottabyte YB 10 24 yobibyte yib 2 80 21%

FIGURA 1.1 La 2 X vs. 10 Y bytes ambigüedad se resolvió mediante la adición de una notación binaria para todos los términos de tamaño comunes. En
la última columna observamos cuánto más grande es el término binario que su término correspondiente decimal, que se agrava a medida que la cabeza
hacia abajo la tabla. Estos prefijos trabajan para los bits, así como bytes, por lo gigabit ( Gb) es 10 9 mientras que los bits (gibibits GIB) es 2 30 Bits.

aplicaciones integradas a menudo tienen requisitos de las aplicaciones únicas que combinan un rendimiento
mínimo con limitaciones estrictas sobre el coste o el poder. Por ejemplo, considere un reproductor de música: el
procesador sólo tienen que ser tan rápido como sea necesario para manejar su función limitada, y más allá de eso, lo
que minimiza el costo y el poder es el objetivo más importante. A pesar de su bajo costo, ordenadores integrados a
menudo tienen baja tolerancia al fracaso, ya que los resultados pueden variar de recalcado (cuando sus nuevos
accidentes de televisión) a devastar (tal como podría ocurrir cuando el ordenador se bloquea en un avión o un barco de
carga). En aplicaciones integradas orientadas al consumidor, como por ejemplo un aparato de hogar digital, la fiabilidad
se consigue principalmente a través Simplicidad el énfasis está en hacer una función de lo más perfectamente posible.
En grandes sistemas embebidos, a menudo se emplean técnicas de redundancia desde el mundo de los servidores.
Aunque este libro se centra en ordenadores de uso general, la mayoría de los conceptos se aplican directamente, o con
ligeras modificaciones, a los ordenadores embebidos.

Elaboración: Elaboraciones son secciones cortas utilizadas en todo el texto para proporcionar más detalles sobre un
tema en particular que pueda ser de su interés. lectores desinteresados ​pueden pasar por alto una elaboración, ya que el
material subsiguiente no dependerá de los contenidos de la elaboración.

Muchos procesadores integrados están diseñados utilizando núcleos de procesador, una versión de un procesador escrito
en un lenguaje de descripción de hardware, tales como Verilog o VHDL (ver
Capítulo 4 ). El núcleo permite a un diseñador para integrar otros hardware específico de la aplicación con el núcleo del
procesador para la fabricación en un solo chip.

Bienvenidos a la Era Post-PC


La marcha continua de la tecnología trae consigo cambios generacionales en hardware que sacuden toda la
industria de tecnología de la información. Desde la última edición del libro, hemos experimentado un cambio
de este tipo, tan importante en el pasado como el interruptor de arranque hace 30 años a los ordenadores
personales. Sustitución del
1.1 Introducción 7

1400

1200

1000

800 inteligente)
millones

inteligentes de la tableta
600 celular (no incluyendo el teléfono

400
PC (no incluyendo la tableta) Teléfono

200
las ventas de teléfonos

0
2007 2008 2009 2010 2011 2012

Figura 1.2 El número fabricada por año de las tabletas y los teléfonos inteligentes, que reflejan la era post-PC, en comparación con los
ordenadores personales y teléfonos celulares tradicionales. Los teléfonos inteligentes representan el reciente crecimiento de la industria de la
telefonía celular, y pasaron para PC en 2011. Las tabletas son la categoría de más rápido crecimiento, casi el doble entre 2011 y 2012. Los PCs recientes
y las categorías de teléfonos celulares tradicionales son relativamente plana o en declive.
dispositivos móviles personales
(PMD) son pequeños dispositivos
inalámbricos para conectarse a
Internet; que se basan en las baterías
de potencia, y el software se instala de
PC es el dispositivo móvil personal (PMD) . PMD funcionan con baterías con conectividad inalámbrica a Internet y suelen
descarga de aplicaciones. ejemplos
costar cientos de dólares, y, al igual que los ordenadores, los usuarios pueden descargar el software ( “apps”) para ejecutar en convencionales son los teléfonos
ellos. A diferencia de los ordenadores, que ya no tienen un teclado y un ratón, y son más propensos a confiar en una pantalla inteligentes y las tabletas.

sensible al tacto o incluso la entrada de voz. PMD de hoy es un teléfono inteligente o un tablet PC, pero mañana puede incluir
gafas electrónicas. Figura 1.2 muestra el rápido crecimiento en el tiempo de las tabletas y los teléfonos inteligentes en
comparación con la de los ordenadores personales y teléfonos celulares tradicionales.
Computación en la nube
se refiere a grandes colecciones de
Tomando el relevo de servidor convencional es Computación en la nube , que se basa en los centros de datos servidores que proporcionan servicios a

gigantes que ahora se conocen como Computadoras (Escala almacén WSC). Empresas como Amazon y Google se través de Internet; algunos proveedores

acumulan estos WSC que contienen 100.000 servidores y luego dejar que las empresas alquilan partes de ellos para renta Por dinámicamente variando el
número de servidores como una
que puedan ofrecer servicios de software a PMD sin tener que construir WSC propios. En efecto, Software como
utilidad.
Servicio (SaaS) desplegado a través de la nube está revolucionando la industria del software tal como PMD y WSC
están revolucionando la industria del hardware. los desarrolladores de software de hoy en día a menudo tienen una
porción de su aplicación que se ejecuta en el PMD y una parte que se ejecuta en la nube. Software como Servicio (SaaS) desarrolla
software y datos como un servicio a
través de Internet, por lo general a
través de un programa fino, como un
navegador que se ejecuta en
Lo que usted puede aprender en este libro dispositivos cliente locales, en lugar de
código binario que se debe instalar, y se
programadores de éxito siempre se han preocupado por el rendimiento de sus programas, porque conseguir
ejecuta en su totalidad en ese
resultados rápidamente al usuario, es fundamental en la creación de software populares. En los años 1960 y 1970,
dispositivo. Los ejemplos incluyen
una limitación principal en el rendimiento del equipo fue el tamaño de la memoria del ordenador. Por lo tanto, los búsqueda en la web y las redes
programadores a menudo seguidas un credo simple: minimizar el espacio de memoria para crear programas sociales.
rápidamente. En el
8 Capítulo 1 abstracciones y Tecnología de Computadores

década pasada, los avances en el diseño por ordenador y tecnología de memoria han reducido en gran medida la importancia
del tamaño de memoria pequeña en la mayoría de las aplicaciones que no sean los de los sistemas informáticos incorporados.

Los programadores interesados ​en la marcha ahora tienen que entender los problemas que han sustituido el
modelo de memoria simple de los años 1960: la naturaleza paralela de los procesadores y la naturaleza
jerárquica de los recuerdos. Se demuestra la importancia de esta comprensión en los capítulos 3 a 6,
mostrando cómo mejorar el rendimiento de un programa en C en un factor de 200. Por otra parte, como se
explica en la Sección
1.7, los programadores de hoy en día tiene que preocuparse por la eficiencia energética de sus programas en ejecución,
ya sea en el PMD o en la nube, lo que también es necesario comprender lo que está por debajo de su código. Por lo tanto,
los programadores que buscan construir versiones competitivas de software tendrán que aumentar su conocimiento de la
organización del equipo.
Estamos honrados de tener la oportunidad de explicar lo que hay dentro de esta máquina revolucionaria,
desentrañando el software por debajo de su programa y el hardware bajo las sábanas de su ordenador. En el
momento de completar este libro, creemos que usted será capaz de responder a las siguientes preguntas:

■ ¿Cómo son los programas escritos en un lenguaje de alto nivel, como C o Java, traducidos a
la lengua del hardware, y cómo el hardware ejecutar el programa resultante? La comprensión
de estos conceptos es la base de la comprensión de los aspectos tanto del hardware y
software que afectan el desempeño del programa.

■ ¿Cuál es la interfaz entre el software y el hardware, el software y cómo instruir el hardware para
realizar las funciones necesarias? Estos conceptos son fundamentales para la comprensión de cómo
escribir muchos tipos de software.

■ Lo que determina el rendimiento de un programa, y ​cómo puede un programador mejorar el


rendimiento? Como veremos, esto depende del programa original, la traducción de software
de ese programa en el lenguaje de la computadora, y la eficacia del hardware en la
ejecución del programa.

■ ¿Qué técnicas pueden ser utilizadas por los diseñadores de hardware para mejorar el rendimiento? Este libro va
a introducir los conceptos básicos del diseño de la computadora moderna. El lector interesado encontrará mucho
más material sobre este tema en nuestro libro de avanzada, Computer Architecture: un enfoque cuantitativo.

■ ¿Qué técnicas pueden ser utilizadas por los diseñadores de hardware para mejorar la eficiencia energética? ¿Qué
puede hacer el programador para ayudar o dificultar la eficiencia energética?

■ ¿Cuáles son las razones y las consecuencias del reciente cambio de procesamiento secuencial para el
multinúcleo procesamiento en paralelo? Este libro da la motivación, describe los mecanismos actuales de hardware
microprocesador para soportar el paralelismo, y encuestas de la nueva generación de microprocesadores multinúcleo
Un microprocesador que contiene “” ( ver Capítulo 6 ).
múltiples procesadores ( “núcleos”)
en un solo circuito integrado. ■ Desde el primer ordenador comercial en 1951, lo que hizo gran ideas de los arquitectos de computadoras
vienen con que sentar las bases de la computación moderna?
1.1 Introducción 9

Sin la comprensión de las respuestas a estas preguntas, lo que mejora el rendimiento de su programa
en un equipo moderno o evaluar qué características podría hacer que un ordenador mejor que otro para
una aplicación en particular será un complejo proceso de ensayo y error, en lugar de un procedimiento
científico impulsado por perspicacia y análisis.

Este primer capítulo sienta las bases para el resto del libro. Presenta las ideas y definiciones
básicas, coloca los principales componentes de software y hardware en perspectiva, muestra cómo
evaluar el rendimiento y la energía, presenta circuitos integrados (la tecnología que alimenta la
revolución de la computadora), y explica el cambio a multicores.

En este capítulo y en los posteriores, es probable que vea muchas nuevas palabras o palabras que usted puede haber
oído, pero no está seguro de lo que significan. No se asuste! Sí, hay una gran cantidad de terminología especial que se
utiliza en la descripción de las computadoras modernas, pero la terminología en realidad ayuda, ya que nos permite
describir con precisión una función o capacidad. Además, los diseñadores de computadoras (incluyendo sus autores) amor utilizando

acrónimos , que son fácil de entender una vez que sabes lo que las letras representan! Para ayudarle a recordar y acrónimo Palabras construye
localizar términos, hemos incluido una destacado definición de cada término en los márgenes de la primera vez que tomando las letras iniciales de una
serie de palabras. Por ejemplo:
aparece en el texto. Después de un corto tiempo de trabajar con la terminología, que será fluida, y tus amigos
quedarán impresionados y cuando se utiliza correctamente acrónimos tales como BIOS, CPU, la memoria DIMM,
RAM es un acrónimo de Random
DRAM, PCIe, SATA, y muchos otros.
Access Memory, y UPC es un
acrónimo de la unidad central de
Para reforzar cómo los sistemas de software y hardware utilizados para ejecutar un programa afectará el rendimiento, procesamiento.
utilizamos una sección especial, La comprensión de rendimiento de los programas,
a través del libro de resumir información importante sobre el desempeño del programa. La primera de ellas aparece a
continuación.

El rendimiento de un programa depende de una combinación de la eficacia de los algoritmos utilizados en Rendimiento de los
el programa, los sistemas de software utilizados para crear y traducir el programa a instrucciones de la
programas
máquina, y la eficacia del equipo en la ejecución de esas instrucciones, que puede incluir de entrada y
salida ( I / O) operaciones. Esta tabla resume cómo el hardware y el software afectan al rendimiento. comprensión

componente de hardware o Donde se trató


software ¿Cómo afecta al rendimiento de este componente este tema?

Algoritmo Determina tanto el número de estados de nivel de fuente y el ¡Otros libros!


número de operaciones de E / S ejecutado

lenguaje de programación, Determina el número de instrucciones de ordenador para cada Capítulos 2 y 3


compilador, y la arquitectura instrucción a nivel de fuente

sistema de procesador y la Determina cómo instrucciones rápidas se pueden ejecutar Capítulos 4, 5 y 6


memoria

sistema de E / S (sistema operativo Determina la velocidad se pueden ejecutar operaciones I / O Capítulos 4, 5 y 6


y hardware)
10 Capítulo 1 abstracciones y Tecnología de Computadores

Para demostrar el impacto de las ideas de este libro, como se mencionó anteriormente, mejoramos el rendimiento
de un programa en C que se multiplica a veces matriz de un vector en una secuencia de capítulos. Cada paso
aprovecha la comprensión de cómo el hardware subyacente realmente funciona en un microprocesador moderno
para mejorar el rendimiento en un factor de 200!

■ En la categoría de paralelismo a nivel de datos, en Capítulo 3 usamos paralelismo palabra parcial a través de C
intrínsecos para aumentar el rendimiento en un factor de 3,8.

■ En la categoría de paralelismo a nivel de instrucción, en Capítulo 4 usamos bucle de desenrollar para


explotar tema instrucción múltiple y fuera de la orden de ejecución de hardware para aumentar el
rendimiento por otro factor de 2,3.

■ En la categoría de optimización de la jerarquía de memoria, en Capítulo 5 usamos


bloqueo caché para aumentar el rendimiento en grandes matrices por otro factor de
2,0 a 2,5.

■ En la categoría de paralelismo a nivel de hilo, en Capítulo 6 usamos paralelas para los bucles en OpenMP
para explotar el hardware multinúcleo para aumentar el rendimiento por otro factor de 4 a 14.

ExamíneseExamínese secciones están diseñadas para ayudar al lector a evaluar si se comprenden los principales
conceptos introducidos en un capítulo y comprender las implicaciones de estos conceptos. Algunos Examínese
preguntas tienen respuestas simples; otros son para la discusión entre un grupo. Las respuestas a las
preguntas específicas se pueden encontrar al final del capítulo. Examínese preguntas sólo aparecen al
final de una sección, por lo que es fácil de saltar si está seguro de que entiende el material.

1. El número de procesadores embebidos que se venden cada año supera en gran medida el número de
procesadores de PC e incluso post-PC. ¿Puede confirmar o negar este conocimiento basado en su
propia experiencia? Trate de contar el número de procesadores embebidos en su casa. ¿Cómo se
compara con el número de ordenadores convencionales en su casa?

2. Como se mencionó anteriormente, tanto el software como el hardware afectar al rendimiento de un programa.
¿Puede pensar en ejemplos en los que cada uno de los siguientes es el lugar adecuado para buscar un
cuello de botella?

■ El algoritmo elegido
■ El lenguaje de programación o compilador

■ El sistema operativo
■ El procesador
■ El sistema de E / S y los dispositivos
1.2 Ocho Grandes ideas en Arquitectura de Computadores 11

1.2 Ocho Grandes ideas en la computadora


Arquitectura

Ahora introducimos ocho grandes ideas que los arquitectos informáticos han inventado en los últimos 60 años de
diseño por ordenador. Estas ideas son tan poderosos que han durado mucho tiempo después de la primera
computadora que los utiliza, con los nuevos arquitectos que demuestra su admiración por la imitación de sus
predecesores. Estas ideas son temas que vamos a tejer a través de éste y los siguientes capítulos a medida que
surgen ejemplos. Para señalar su influencia, en esta sección introducimos iconos y destacó términos que
representan las grandes ideas y los usamos para identificar los cerca de 100 secciones del libro que cuentan con el
uso de las grandes ideas.

Diseño de la Ley de Moore

La única constante para los diseñadores de computadoras es un cambio rápido, que es impulsado en gran medida por

La Ley de Moore. Afirma que los recursos de circuitos integrados duplican cada 18-24 meses. La Ley de Moore
resultó de una predicción 1965 de tal crecimiento de la capacidad IC hecha por Gordon Moore, uno de los fundadores
de Intel. Como diseños de computadoras pueden llevar años, los recursos disponibles por chip pueden doblar o
cuadruplicar entre el inicio y el final del proyecto con facilidad. Al igual que un tirador al plato, arquitectos informáticos
deben anticipar que la tecnología será cuando termina el diseño en lugar de diseño para donde comienza. Utilizamos
un “arriba ya la derecha” gráfico de la Ley de Moore para representar el diseño de un cambio rápido.

Abstracción utilizar para simplificar el diseño

Ambos arquitectos y programadores tuvieron que inventar técnicas para hacerse más productiva, para el diseño de lo
contrario el tiempo se alarga de forma tan dramática como recursos crecieron por la Ley de Moore. Una técnica
importante para la productividad de hardware y software es utilizar abstracciones para caracterizar el diseño en
diferentes niveles de la representación; detalles de nivel inferior están ocultos para ofrecer un modelo más simple en
los niveles superiores. Vamos a utilizar el icono de la pintura abstracta para representar esta segunda gran idea.

Hacer el caso común rápido


Haciendo el caso común rápida tenderá a mejorar el rendimiento mejor que la optimización de los raros casos.
Irónicamente, el caso común es a menudo más simple que el caso raro y por lo tanto es generalmente más fácil
de mejorar. Este consejo de sentido común implica que conoce lo que es el caso común, que sólo es posible
con una cuidadosa experimentación y la medición (ver sección 1.6). Utilizamos un coche deportivo como el icono
para hacer el caso común rápido, ya que el viaje más común tiene uno o dos pasajeros, y es sin duda más fácil
hacer un coche deportivo rápido que un monovolumen rápido!
12 Capítulo 1 abstracciones y Tecnología de Computadores

El rendimiento a través de Paralelismo

Desde los albores de la informática, los arquitectos de computadoras han ofrecido diseños que consiguen un mayor rendimiento

de las operaciones de computación en paralelo. Veremos muchos ejemplos de paralelismo en este libro. Utilizamos múltiples

motores a reacción de un avión como nuestro icono de

el rendimiento paralelo.

El rendimiento a través de tuberias de diferentes tipos

Un patrón particular de paralelismo es tan frecuente en la arquitectura de computadores que merece su propio nombre: la

canalización. Por ejemplo, antes de que los coches de bomberos, un “cubo de la brigada” respondería a un incendio, que

muchas películas de vaqueros muestran en respuesta a un acto vil por el villano. La gente de la ciudad forman una cadena

humana para llevar a una fuente de agua al fuego, ya que podrían moverse mucho más rápidamente en la cadena de cubos

en lugar de las personas que ejecutan un lado a otro. Nuestra icono de tubería es una secuencia de tuberías, con cada

sección que representa una etapa de la tubería.

El rendimiento a través de Predicción

Siguiendo el dicho de que puede ser mejor pedir perdón que pedir permiso, la próxima gran idea es predicción. En
algunos casos, puede ser más rápido en promedio de adivinar y empezar a trabajar en lugar de esperar hasta
que sepa con certeza, en el supuesto de que el mecanismo para recuperarse de una predicción errónea no es
demasiado caro y su predicción es relativamente precisa. Utilizamos la bola de cristal de adivino como nuestro
icono de predicción.

Jerarquía de memorias
Los programadores quieren que la memoria sea rápido, grande y barato, como la velocidad de la memoria a menudo da forma a

rendimiento, la capacidad limita el tamaño de los problemas que se pueden resolver, y el costo de la memoria es a menudo hoy

en día la mayoría de los costos del equipo. Los arquitectos han descubierto que pueden hacer frente a estas demandas en

conflicto con una jerarquía de memorias,

con el más rápido, más pequeño, y el recuerdo más caro por bit en la parte superior de la jerarquía y el más lento, más
grande y más barata por bit en la parte inferior. Como veremos en el Capítulo 5 , Cachés dan al programador la ilusión de
que la memoria principal es casi tan rápido como la parte superior de la jerarquía y casi tan grande y barato como la
parte inferior de la jerarquía. Utilizamos un icono de triángulo en capas para representar la jerarquía de memoria. La
forma indica la velocidad, el costo y tamaño: cuanto más cerca de la parte superior, más rápido y más caro por bit de la
memoria; cuanto mayor sea la base de la capa, la más grande es la memoria.

Fiabilidad a través de redundancia

Las computadoras no sólo tienen que ser rápido; que necesitan para ser confiable. Desde cualquier dispositivo físico puede fallar,

hacemos sistemas confiable mediante la inclusión de componentes redundantes que pueden hacerse cargo cuando se produce

un fallo y para ayudar a detectar fallas. Nosotros usamos el tractor-remolque como nuestro icono, ya que los neumáticos dobles en

cada lado de sus ejes traseros permiten al camión para seguir conduciendo incluso cuando un neumático falla. (Es de suponer

que el conductor del camión se dirige de inmediato a un centro de reparación por lo que el neumático pinchado puede ser fijo,

restaurando así la redundancia!)


1.3 A continuación de su programa 13

En París se limitó a mirar


cuando hablé con ellos en
1.3 A continuación de su programa francés; Nunca tuvo éxito en
hacer esos idiotas entender
su propio idioma.
Una aplicación típica, como un procesador de textos o un sistema de base de datos grande, puede consistir en
millones de líneas de código y se basan en las bibliotecas de software sofisticados que implementan funciones
Mark Twain, Los inocentes en el
complejas en apoyo de la aplicación. Como veremos, el hardware en un ordenador sólo puede ejecutar
extranjero, 1869
instrucciones muy sencillas de bajo nivel. Para pasar de una aplicación compleja con las instrucciones primitivas
implica varias capas de software que interpretar o traducir operaciones de alto nivel en instrucciones simples de
la computadora, un ejemplo de la gran idea de abstracción.

Figura 1.3 muestra que estas capas de software se organizan principalmente de forma jerárquica, con
aplicaciones estando el anillo más exterior y una variedad de
sistemas de software sentado entre el hardware y el software de aplicación.
Hay muchos tipos de software de sistemas, sino dos tipos de software de sistemas son fundamentales para
todos los sistemas de ordenador hoy en día: un sistema operativo y un compilador. Un sistema operativo interfaces
entre un programa de usuario y el hardware y proporciona una variedad de servicios y funciones de supervisión.
Entre las funciones más importantes son:
sistemas de software
Software que proporciona servicios
■ Manejo de las operaciones de entrada y salida básicas
que son de utilidad común,
incluyendo los sistemas
■ La asignación de almacenamiento y memoria
operativos, compiladores,
■ Respecta a la participación protegida del ordenador entre varias aplicaciones que utilizan cargadores, y montadores.

simultáneamente

Ejemplos de sistemas operativos en uso hoy en día son Linux, iOS y Windows.
sistema operativo
programa que gestiona los recursos
de un equipo para el beneficio de
los programas que se ejecutan en
s o Ft w
o norte ese equipo de supervisión.
ountayo
algydo
g un ram
pAap
UN i

etrso s o Ft w
t mim un
ys ra
m
S

Hardware

Figura 1.3 una vista simplificada de hardware y software como capas jerárquicas, mostrado como círculos concéntricos con hardware en el
centro y la aplicación más externa software. En aplicaciones complejas, a menudo hay múltiples capas de software de aplicación, así. Por ejemplo,
un sistema de base de datos puede ejecutar en la parte superior del software de los sistemas de alojamiento de una aplicación, que a su vez se ejecuta
en la parte superior de la base de datos.
14 Capítulo 1 abstracciones y Tecnología de Computadores

compilador Un programa que Los compiladores realizar otra función vital: la traducción de un programa escrito en un lenguaje de alto
traduce instrucciones de lenguaje de nivel, como C, C ++, Java, Visual Basic o en instrucciones que el hardware puede ejecutar. Dada la
alto nivel en instrucciones en complejidad de los lenguajes de programación modernos y la sencillez de las instrucciones ejecutadas por
lenguaje ensamblador.
el hardware, la traducción de un programa de lenguaje de alto nivel a las instrucciones de hardware es
compleja. Le damos una breve visión general del proceso aquí y luego entrar en más profundidad en Capitulo
2.

Desde un lenguaje de alto nivel a la Lengua de hardware


Para hablar directamente con el hardware electrónico, necesita enviar señales eléctricas. Las señales más
fáciles para los ordenadores son para entender en y apagado, y así el alfabeto equipo está a sólo dos letras. Al
igual que las 26 letras del alfabeto Inglés no limitar la cantidad puede ser escrita, las dos letras del alfabeto
equipo no limitan lo que los ordenadores pueden hacer. Los dos símbolos para estas dos cartas son los
números 0 y 1, y que comúnmente se piensa en el lenguaje informático como números en base 2, o

dígito binario También llamada poco numeros binarios. Nos referimos a cada “letra” como una dígito binario o poco . Las computadoras son esclavos de nuestros
. Uno de los dos números en base 2 comandos, que se llaman instrucciones . Las instrucciones, que son simplemente colecciones de bits que la computadora
(0 o 1), que son los componentes de entiende y obedece, pueden ser considerados como números. Por ejemplo, los bits
información.

1000110010100000
instrucción Un comando que
hardware entiende y obedece.
decirle a un equipo a sumar dos números. Capitulo 2 explica por qué usamos los números para obtener
instrucciones y datos; no queremos robar el trueno de ese capítulo, pero el uso de números para ambas
instrucciones y datos es una base de la computación.
Los primeros programadores comunicados a los ordenadores en números binarios, pero esto era tan tedioso que
inventaron rápidamente nuevas notaciones que estaban más cerca de la forma en que piensan los seres humanos. Al
principio, estas notaciones fueron traducidos a binario con la mano, pero este proceso seguía siendo tedioso. El uso de
la computadora para ayudar a programar el equipo, los pioneros inventaron software para traducir de notación simbólica
a binario. El primero de estos programas fue nombrado ensamblador . Este programa traduce una versión simbólica de
ensamblador Un programa que una instrucción en la versión binaria. Por ejemplo, el programador escribiría
traduce una versión simbólica de
las instrucciones en la versión
binaria. AÑADIR A, B

y el ensamblador se traduciría en esta notación

1000110010100000

Esta instrucción indica a la computadora para agregar los dos números UNA y SEGUNDO. El nombre acuñado para este
lenguaje ensamblador lenguaje simbólico, todavía se utiliza hoy en día, es lenguaje ensamblador . Por el contrario, el lenguaje binario que
Una representación simbólica de comprende la máquina es la Lenguaje de máquina .
instrucciones de la máquina.
A pesar de una enorme mejora, lenguaje ensamblador está todavía lejos de las notaciones un científico

Lenguaje de máquina
podría gustaría usar para simular el flujo de fluido o que un contador puede utilizar para equilibrar las cuentas.
Una representación binaria de El lenguaje ensamblador requiere que el programador escriba una línea para cada instrucción de que el equipo
instrucciones de la máquina. va a seguir, lo que obliga al programador a pensar como el ordenador.
1.3 A continuación de su programa 15

El reconocimiento de que un programa se puede escribir para traducir un lenguaje más potente en
instrucciones de ordenador era uno de los grandes avances en los primeros días de la computación. Los
programadores de hoy deben su productividad y su cordura a la creación de lenguajes de
programación de alto nivel y compiladores que traducen programas en dichas lenguas en
instrucciones. Figura 1.4 muestra las relaciones entre estos programas y lenguajes, que son más
ejemplos de la fuerza de abstracción.

lenguaje de programación de alto


nivel Un lenguaje portátil como C, C
++, Java o Visual Basic que se
{Int temp swap (int v [], int k);
compone de palabras y la notación
algebraica que pueden ser
temp = v [k]; v [k] = v [k +
traducidos por un compilador en
1]; v [k + 1] = temp; }
lenguaje ensamblador.

compilador

(en C)
intercambiar: LSL X10, X1,3

lenguaje de alto nivel


ADD X10, X0, X10 LDUR X9,
[X10,0] LDUR X11, [X10,8]
ARMv8) programa en STUR X11, [X10,0] STUR X9,
[X10,8] BR X10

ensamblador (por

en lenguaje

(por ARMv8) programa


ensamblador del

lenguaje de máquina

programa binario en 00000000101000100000000100011000


00000000100000100001000000100001
10001101111000100000000000000000
10001110000100100000000000000100
10101110000100100000000000000000
10101101111000100000000000000100
00000011111000000000000000001000

FIGURA programa 1,4 C compilado en lenguaje ensamblador y luego montado en lenguaje de máquina binario. Aunque la
traducción del lenguaje de alto nivel a lenguaje de máquina binaria se muestra en dos pasos, algunos compiladores eliminar al
intermediario y producen el lenguaje binario de la máquina directamente. Idiomas y este programa se analizan con más detalle en Capitulo
2.
dieciséis Capítulo 1 abstracciones y Tecnología de Computadores

Un compilador permite a un programador para escribir esta expresión lenguaje de alto nivel:

A+B

El compilador compilarlo en esta declaración en lenguaje ensamblador:

AÑADIR A, B

Como puede observarse, el ensamblador se traduciría este contenido en las instrucciones binarias que indican a la
computadora para agregar los dos números UNA y SEGUNDO.
lenguajes de programación de alto nivel ofrecen varias ventajas importantes. En primer lugar, que permiten al
programador a pensar en un lenguaje más natural, el uso de las palabras en inglés y la notación algebraica, lo que resulta
en los programas que se ven mucho más como el texto que como tablas de símbolos crípticos (ver Figura 1.4 ). Además,
permiten idiomas que ser diseñado de acuerdo a su uso previsto. Por lo tanto, Fortran fue diseñado para la computación
científica, Cobol para el procesamiento de datos de la empresa, Lisp para la manipulación de símbolos, y así
sucesivamente. También hay lenguajes específicos de dominio para grupos incluso más estrechas de los usuarios, tales
como aquellos interesados ​en la simulación de fluidos, por ejemplo.

La segunda ventaja de los lenguajes de programación se mejora la productividad del programador. Una de las pocas
áreas de acuerdo generalizado en el desarrollo de software es que se necesita menos tiempo para desarrollar programas
cuando están escritas en idiomas que requieren un menor número de líneas para expresar una idea. La concisión es una
clara ventaja de lenguajes de alto nivel sobre el lenguaje ensamblador.

La última ventaja es que los lenguajes de programación permiten que los programas sean independientes del
ordenador en el que se desarrollaron, ya que los compiladores y ensambladores pueden traducir programas en
lenguaje de alto nivel a las instrucciones binarias de cualquier ordenador. Estas tres ventajas son tan fuertes que
hoy poca programación se realiza en lenguaje ensamblador.

1.4 Debajo de las sábanas

Ahora que hemos visto por debajo de su programa para descubrir el software subyacente, vamos a abrir las cubiertas
de su ordenador para aprender sobre el hardware subyacente. El hardware subyacente en cualquier ordenador realiza
las mismas funciones básicas: introducir datos, los datos de dar salida, datos de procesamiento y almacenamiento de
dispositivo de entrada
Un mecanismo mediante el cual el datos. ¿Cómo se llevan a cabo estas funciones es el tema principal de este libro, y los capítulos siguientes se ocupan

ordenador se alimenta de la de diferentes partes de estas cuatro tareas.


información, tal como un teclado.

Cuando llegamos a un punto importante en este libro, un punto tan importante que esperamos que recordará para
siempre, hacemos hincapié en que identificándola como una Cuadro grande ít. Tenemos alrededor de una docena de
dispositivo de salida
Big Pictures en este libro, siendo el primero de los cinco componentes de un ordenador que realizan las tareas de
Un mecanismo que transmite
el resultado de un cálculo a escribir, la salida, el procesamiento y el almacenamiento de datos.
un usuario, tal como una
pantalla, o a otro equipo. Dos componentes clave de las computadoras son los dispositivos de entrada , tales como el micrófono, y dispositivos de
salida , tales como el altavoz. Como el nombre sugiere, la entrada se alimenta
1.4 En virtud de las Cubiertas 17

computadora, y la salida es el resultado del cómputo enviado al usuario. Algunos dispositivos, tales como redes inalámbricas,
proporcionan tanto de entrada como de salida a la computadora.
Los capítulos 5 y 6 se describen de entrada y salida ( E / S) dispositivos en más detalle, pero tomemos un recorrido de
iniciación a través del hardware del equipo, a partir de los dispositivos de E / S externos.

Los cinco componentes clásicos de un ordenador son entrada, salida, memoria, camino de datos y
control, con los últimos dos combina a veces y llamado el procesador. Figura 1.5 muestra la
organización estándar de un ordenador. Esta organización es independiente de la tecnología de
hardware: se puede colocar cada pieza de cada equipo, pasado y presente, en una de estas cinco los GRANDE
categorías. Para ayudar a mantener todo esto en perspectiva, los cinco componentes de un
ordenador se muestran en la primera página de cada uno de los siguientes capítulos, con la porción
Imagen
de interés para ese capítulo resaltado.

FIGURA 1.5 La organización de una computadora, que muestra los cinco componentes clásicos. El procesador recibe las instrucciones y los datos
de la memoria. Entrada escribe datos en la memoria, y la salida lee datos de la memoria. De control envía las señales que determinan las operaciones de
la trayectoria de datos, la memoria, de entrada y de salida.
18 Capítulo 1 abstracciones y Tecnología de Computadores

Através del espejo


pantalla de cristal líquido (LCD) Una El dispositivo de E / S más fascinante es, probablemente, durante la representación gráfica. El mayor consumo de

tecnología de visualización mediante dispositivos móviles personales pantallas de cristal líquido (LCD) para obtener un fino, pantalla de bajo consumo. La
una fina capa de polímeros líquidos pantalla LCD no es la fuente de la luz; en cambio, se controla la transmisión de la luz. Un LCD típico incluye moléculas en
que pueden ser utilizados para forma de barra en un líquido que forman una hélice de torsión que se dobla luz que entra en la pantalla, ya sea de una
transmitir o bloquear la luz en
fuente de luz detrás de la pantalla o con menos frecuencia de la luz reflejada. Las varillas se enderezan cuando se aplica
función de si se aplica una carga.
una corriente y ya no doblar la luz. Dado que el material de cristal líquido es de entre dos pantallas polarizadas a 90 grados,
la luz no puede pasar a través de menos que se dobla. Hoy en día, la mayoría de las pantallas LCD utilizan una matriz
activa que tiene un pequeño interruptor de transistor en cada píxel para controlar la corriente de manera precisa y hacer que
pantalla de matriz activa las imágenes más nítidas. Una máscara de rojo-verde-azul asociado a cada punto en la pantalla determina la intensidad de
Una pantalla de cristal líquido
los componentes de color de tres en la imagen final; en un LCD de matriz activa de color, hay tres conmutadores de
utilizando un transistor para controlar
transistor en cada punto.
la transmisión de luz en cada píxel
individual.

La imagen se compone de una matriz de elementos de imagen, o píxeles , que puede representarse como una
pixel El elemento de imagen
matriz de bits, llamado mapa de bits. Dependiendo del tamaño de la pantalla y la resolución, la matriz de la pantalla
individuo más pequeño. Las
en un comprimido típico oscila en tamaño desde 1024 × 768-2048 × 1536. Una pantalla de color puede utilizar 8 bits
pantallas se componen de cientos
para cada uno de los tres colores (rojo, azul, y verde), por 24 bits por píxel, permitiendo millones de diferentes
de miles a millones de píxeles,
organizados en una matriz. colores que se muestran.

El soporte de hardware para gráficos de ordenador se compone principalmente de una búfer de actualización de la trama, o memoria
intermedia de trama, para almacenar el mapa de bits. La imagen que se representa en pantalla se almacena en la memoria
A través de las pantallas de
intermedia de trama, y ​el patrón de bits por píxel se lee a la pantalla de gráficos en la frecuencia de actualización. Figura 1.6 muestra
ordenador que he aterrizado un
una memoria intermedia de trama con un diseño simplificado de sólo 4 bits por píxel.
avión en la cubierta de un
habitáculo en movimiento,
El objetivo del mapa de bits es representar fielmente lo que está en la pantalla. Los retos en los sistemas
observado una partícula nuclear
gráficos se deben a que el ojo humano es muy bueno para detectar incluso los cambios sutiles en la pantalla.
alcanzó un pozo de potencial,
volado en un cohete a casi la
velocidad de la luz y observó un
ordenador revelar sus más íntimos
funcionamiento.
frame buffer

CRT pantalla de exploración de trama

Ivan Sutherland, el “padre”


de los gráficos por
ordenador, Scientific Y0 0 011 Y0
American, 1984
Y1 1 101 Y1

X0X1 X0X1

Figura 1.6 Cada coordenada en la memoria intermedia de trama a la izquierda determina la sombra de la coordenada correspondiente
para la pantalla CRT de exploración de trama a la derecha. Pixel (X 0, Y 0) contiene el patrón de bits 0011, que es un tono más claro en la
pantalla que el patrón de bits 1101 en píxeles (X 1, Y 1).
1.4 En virtud de las Cubiertas 19

Pantalla táctil
Mientras que las PC también utilizan pantallas LCD, las tabletas y los teléfonos inteligentes de la era post-PC
han reemplazado el teclado y el ratón con pantallas sensibles al tacto, que tiene el usuario ventaja maravillosa
interfaz de usuarios apuntando directamente a lo que les interesa y no indirectamente con un ratón.

circuito integrado También llamada chip


Si bien hay una variedad de maneras de implementar una pantalla táctil, muchas tabletas de hoy en día utilizan la
. Un dispositivo que combina decenas
detección capacitiva. Dado que las personas son conductores eléctricos, si un aislante como el vidrio está cubierta con
de millones de transistores.
un conductor transparente, Tocar distorsiona el campo electrostático de la pantalla, lo que resulta en un cambio en la
capacitancia. Esta tecnología puede permitir múltiples toques al mismo tiempo, que reconoce gestos que pueden
conducir a interfaces de usuario atractivas. unidad de procesador central (CPU) También
se llama procesador. La parte activa de
la computadora, que contiene el camino
de datos y control, y que añade
Al abrir la caja números, números de pruebas, señales
de E / S de usuario para activar, y así
Figura 1.7 muestra el contenido de la computadora de la tableta del iPad 2 de Apple. Como era de esperar, de los cinco
sucesivamente.
componentes clásicos de la computadora, I / O domina este dispositivo de lectura. La lista de los dispositivos de E / S
incluye una pantalla LCD capacitiva multitáctil de la pantalla, cámara frontal, la red Wi-Fi y la red cámara, micrófono,
conector para auriculares, altavoces, acelerómetro, giroscopio de mirando hacia atrás, Bluetooth. El camino de datos,
control, y la memoria son una pequeña porción de los componentes. Ruta de datos El componente
del procesador que realiza
operaciones aritméticas.
Los pequeños rectángulos en Figura 1.8 contendrá los dispositivos que impulsan nuestra tecnología avance,
llamados circuitos integrados y apodado papas fritas . El paquete A5 visto en medio de Figura 1.8 contiene dos
procesadores ARM que operan a una frecuencia de reloj de 1 GHz. los procesador es la parte activa de la
computadora, siguiendo las instrucciones de un programa a la carta. Se añade números, números de pruebas, las controlar El componente del
procesador que comanda el camino
señales de I / O para activar, y así sucesivamente. De vez en cuando, la gente llama el procesador del UPC , para el
de datos, la memoria y los
más burocrático que suenan unidad de procesador central .
dispositivos de E / S de acuerdo con
las instrucciones del programa.
Descendiendo aún más bajo en el hardware, Figura 1.9 revela detalles de un microprocesador. El procesador
comprende lógicamente dos componentes principales: camino de datos y de control, la fuerza física respectiva y el
cerebro del procesador. los Ruta de datos realiza las operaciones aritméticas, y controlar narra la trayectoria de datos,
memoria El área de almacenamiento en
memoria y dispositivos de E / S de lo que se puede hacer de acuerdo a los deseos de las instrucciones del programa. Capítulo
la que los programas se mantienen
4
cuando se están ejecutando y que
explica la trayectoria de datos y control para un diseño de mayor rendimiento.
contiene los datos necesarios para los
El paquete A5 en Figura 1.8 también incluye dos chips de memoria, cada uno con 2 gibibits de capacidad,
programas en ejecución.
suministrando de este modo 512 MiB. los memoria es donde los programas se mantienen cuando se están ejecutando;
sino que también contiene los datos necesarios para los programas en ejecución. La memoria se construye a partir de
chips de DRAM. DRACMA representa memoria de acceso aleatorio
Memoria dinámica de acceso aleatorio . Múltiples DRAM se utilizan conjuntamente para contener las instrucciones y dinámica (DRAM)
los datos de un programa. En contraste con las memorias de acceso secuencial, tales como cintas magnéticas, la RAM porción
Memoria incorporada como un circuito
integrado; que proporciona acceso
del término DRAM significa que los accesos a memoria tomar básicamente la misma cantidad de tiempo, no importa
aleatorio a cualquier lugar. Los tiempos
qué parte de la memoria que se lee.
de acceso son de 50 nanosegundos y el
coste por gigabyte en 2012 fue de $ 5 a
Descendiendo a las profundidades de cualquiera de los componentes del hardware revela una visión de la $ 10.
computadora. Dentro del procesador es otro tipo de memoria caché de memoria.
20 Capítulo 1 abstracciones y Tecnología de Computadores

Figura 1.7 Componentes del iPad 2 de Apple A1395. La parte posterior de metal del iPad (con el logotipo de Apple invertido en el centro) está en el centro. En
la parte superior es la visualización de la pantalla y la pantalla LCD multitáctil capacitiva. En el extremo derecho es el, batería de 3,8 V, 25 vatios-hora de
polímero, que se compone de tres casos de células de iones de litio y ofrece 10 horas de duración de la batería. A la extrema izquierda es la estructura de metal
que se conecta la pantalla LCD en la parte posterior de la iPad. Los pequeños componentes que rodean la parte posterior de metal en el centro son lo que
pensamos que es la computadora; que son a menudo de forma compacta para caber dentro de la caja junto a la batería en forma de L. Figura 1.8 muestra un
primer plano de la junta en forma de L a la inferior izquierda de la caja de metal, que es la placa de circuito impreso lógica que contiene el procesador y la
memoria. El pequeño rectángulo debajo de la placa lógica contienen un chip que proporciona comunicación inalámbrica: Wi-Fi, Bluetooth y sintonizador FM. Que
encaja en una pequeña ranura en la esquina inferior izquierda de la placa lógica. Cerca de la esquina superior izquierda de la caja es otro componente en forma
de L, que es un conjunto de cámara de frente que incluye la cámara, conector para auriculares y micrófono. Cerca de la esquina superior derecha de la caja es
la tabla que contiene el control de volumen y el botón de bloqueo en silencio / rotación de la pantalla junto con un giroscopio y acelerómetro. Estas dos últimas
fichas se combinan para permitir que el iPad para reconocer el movimiento de seis ejes. El pequeño rectángulo al lado de él es la cámara que mira hacia atrás.
Cerca de la parte inferior derecha de la caja es el ensamblaje de los altavoces en forma de L. El cable en la parte inferior es el conector entre la placa base y la
placa de control de la cámara / volumen. La junta entre el cable y el ensamblaje de los altavoces es el controlador de la pantalla táctil capacitiva. (Cortesía iFixit, www.ifixit.com
)

FIGURA 1.8 La placa lógica del iPad 2 de Apple en Figura 1.7 . La foto destaca cinco circuitos integrados. La gran circuito integrado en el medio es el
chip de Apple A5, que contiene núcleos de procesador ARM duales que se ejecutan en 1 GHz, así como 512 MB de memoria principal en el interior
del paquete. Figura 1.9 muestra una fotografía del chip del procesador dentro del paquete A5. El chip de tamaño similar a la izquierda es el chip de
memoria flash 32 GB de almacenamiento no volátil. Hay un espacio vacío entre los dos chips donde un segundo chip flash se puede instalar para
duplicar la capacidad de almacenamiento de la iPad. Las patatas fritas a la derecha de la A5 incluyen controlador de potencia y de E / S chips de
controlador. (Cortesía iFixit, www.ifixit.com )
1.4 En virtud de las Cubiertas 21

memoria caché Una pequeña memoria,


rápido, que actúa como un
amortiguador para un mayor memoria
más lenta.

memoria de acceso aleatorio


estática (SRAM) También memoria
construido como un circuito integrado,
Figura 1.9 El procesador de circuito integrado dentro del paquete A5. El tamaño del chip es 12,1 por 10,1 mm, y que fue fabricado originalmente en un
pero más rápido y menos densa que la
proceso de 45 nm (véase la Sección 1.5). Tiene dos procesadores ARM idénticos o núcleos en la parte central izquierda del chip y un PowerVR unidad de
DRAM.
procesador gráfico ( GPU) con cuatro caminos de datos en el cuadrante superior izquierdo. Para el lado izquierdo e inferior de los núcleos ARM son
interfaces a la memoria principal (DRAM). (Cortesía Chipworks, www.chipworks.com )

Memoria caché se compone de una pequeña memoria, rápido, que actúa como un amortiguador para la memoria
DRAM. (La definición no técnica de cache es un lugar seguro para esconder cosas.) Caché está construido con una
tecnología de memoria diferente, memoria de acceso aleatorio estática (SRAM) . SRAM es más rápido pero menos
densa, y por lo tanto más caro, que la DRAM (ver Capítulo 5 ). SRAM y DRAM son dos capas de la jerarquía de
memoria.
22 Capítulo 1 abstracciones y Tecnología de Computadores

Como se mencionó anteriormente, una de las grandes ideas para mejorar el diseño es la abstracción. Uno de los
mas importantes abstracciones es la interfaz entre el hardware y el software de nivel más bajo. Debido a su
importancia, se le da un nombre especial: la set de instrucciones arquitectura , o simplemente arquitectura , de un
ordenador. La arquitectura del conjunto de instrucciones incluye programadores cualquier cosa que necesita saber
para hacer funcionar un programa de lenguaje binario de la máquina correctamente, incluyendo instrucciones,
dispositivos I / O, y así sucesivamente. Por lo general, el sistema operativo va a encapsular los detalles de hacer S,
memoria de E / asignación, y otras funciones del sistema de bajo nivel para que los programadores de aplicaciones
no tienen que preocuparse por estos detalles. La combinación del conjunto de instrucciones básicas y la interfaz del

set de instrucciones arquitectura También


sistema operativo proporcionado por los programadores de aplicaciones se denomina aplicación de interfaz binaria
llamado arquitectura . Una interfaz (ABI) .
abstracta entre el hardware y el
software de nivel más bajo que abarca
toda la información necesaria para
escribir un programa en lenguaje de Una arquitectura del conjunto de instrucciones permite a los diseñadores de computadoras para hablar de funciones
máquina que va a funcionar independientemente del hardware que los realiza. Por ejemplo, podemos hablar de las funciones de un reloj digital
correctamente, incluyendo las
(tiempo de mantenimiento, mostrando el tiempo, ajustar la alarma) por separado del hardware de reloj (cristal de cuarzo,
instrucciones, registros, acceso a la
memoria, I / O, y así sucesivamente.
pantallas, botones de plástico LED). los diseñadores de computadoras distinguen la arquitectura de una implementación de
una arquitectura a lo largo de las mismas líneas: una implementación de hardware es que obedece a la abstracción de la
arquitectura. Estas ideas nos llevan a otro cuadro grande.

aplicación de interfaz binaria (ABI) La


porción de usuario del conjunto de
instrucciones además de las interfaces
del sistema operativo utilizado por los
programadores de aplicaciones. Se
define un estándar para la portabilidad
binaria en todos los equipos.

Tanto el hardware y software consisten en capas jerárquicas utilizando abstracción, con los detalles de
cada capa de ocultación más bajas desde el nivel anterior. Una interfaz clave entre los niveles de
abstracción es la set de instrucciones arquitectura -la interfaz entre el hardware y software de bajo nivel.
Esta interfaz permite a muchos abstracta implementaciones de la variación de coste y rendimiento para
los GRANDE ejecutar el software idénticos.
Imagen
implementación
Hardware que obedece a la
abstracción de la arquitectura.
Un lugar seguro para los datos
memoria volatil
Almacenamiento, tal como DRAM, que Hasta ahora, hemos visto cómo los datos de entrada, cálculo utilizando los datos y mostrar datos. Si nos vamos a
retiene los datos sólo si está perder energía a la computadora, sin embargo, todo se perdería debido a la memoria dentro de la computadora es volátil
recibiendo alimentación.
esto es, cuando se pierde potencia, se olvida. Por el contrario, un disco de DVD no se olvida de la película cuando
se apaga la alimentación del reproductor de DVD, y por lo tanto es una memoria no volátil tecnología.
memoria no volátil
Una forma de memoria que retiene los
datos incluso en ausencia de una fuente
de energía y que se utiliza para
almacenar programas entre
ejecuciones. Un disco DVD es no volátil.
1.4 En virtud de las Cubiertas 23

Para distinguir entre la memoria volátil que se utiliza para almacenar los datos y programas mientras se están
ejecutando y esta memoria no volátil utilizada para almacenar datos y programas entre ejecuciones, el término memoria
principal o Memoria primaria se utiliza para el primero, y memoria secundaria para despues. La memoria secundaria
forma la siguiente capa inferior de la jerarquía de memoria. DRAM han dominado la memoria principal desde 1975,
pero discos magnéticos la memoria secundaria dominada comenzando incluso antes. Debido a su tamaño y forma de
los factores, los dispositivos móviles personales utilizan memoria flash ,

una memoria de semiconductores no volátil, en lugar de discos. Figura 1.8 muestra el chip que contiene la memoria flash memoria principal También llamado Memoria
primaria .
de la iPad 2. Mientras más lento que DRAM, es mucho más barato que la DRAM además de ser no volátil. A pesar de que
La memoria se utiliza para mantener los
cuestan más que los discos por bit, que es más pequeño, se trata de capacidades mucho más pequeñas, es más robusto, programas mientras se están

y es más eficiente que los discos. Por lo tanto, la memoria flash es la memoria secundaria estándar para PMDs. Por ejecutando; por lo general se compone
de DRAM en los ordenadores de hoy en
desgracia, a diferencia de los discos y DRAM, los bits de memoria flash se desgastan después de 100.000 a 1.000.000
día.
escribe. Por lo tanto, los sistemas de archivos deben mantener un registro del número de escrituras y tener una estrategia
para evitar el desgaste de almacenamiento, como por el movimiento de datos populares. Capítulo 5 describe y discos de
memoria secundaria
memoria flash con más detalle. La memoria no volátil utilizada para
almacenar programas y datos entre
ejecuciones; por lo general se
compone de memoria flash en el PMD
La comunicación con otros ordenadores y discos magnéticos en los servidores.

Nosotros hemos explicado la forma en que puede introducir, calcular, visualizar y guardar los datos, pero todavía hay un
elemento que falta que se encuentra en los ordenadores de hoy en día: las redes de ordenadores. Al igual que el procesador se
disco magnetico También llamado disco
muestra en la Figura 1.5 está conectado a la memoria y dispositivos E / S, los ordenadores enteros redes de interconexión,
duro . Una forma de memoria secundaria
permitiendo a los usuarios de ordenador para extender el poder de computación mediante la inclusión de comunicación. Las
no volátil compone de platos recubiertos
redes se han vuelto tan populares que son la columna vertebral de los sistemas informáticos actuales; un nuevo dispositivo móvil con un material de registro magnético

personal o servidor sin una interfaz de red serían ridiculizados. ordenadores conectados en red tienen varias ventajas giratorio. Debido a que están girando los
dispositivos mecánicos, tiempos de
importantes:
acceso son aproximadamente de 5 a 20
milisegundos y el coste por gigabyte en
2012 fue de $ 0,05 a $ 0,10.
■ Comunicación: se intercambia información entre ordenadores a altas velocidades.

■ El intercambio de recursos: En lugar de que cada equipo tiene sus propios dispositivos de E / S, los equipos de la red
pueden compartir dispositivos de E / S. memoria flash
Una memoria de semiconductores no
■ el acceso no local: Mediante la conexión de ordenadores a través de largas distancias, los usuarios no tienen que ser volátil. Es más barato y más lento que la
cerca del equipo que están usando. DRAM, pero más caro por bit y más
rápido que los discos magnéticos. Los
Redes varían en longitud y el rendimiento, con el costo de la comunicación aumentando de acuerdo tanto tiempos de acceso son
con la velocidad de la comunicación y la distancia que viaja la información. Tal vez el tipo más popular de la red aproximadamente de 5 a 50
microsegundos y el coste por gigabyte
es Ethernet. Puede ser de hasta un kilómetro de largo y la transferencia a velocidades de hasta 40 gigabits por
en 2012 fue de $ 0,75 a $ 1,00.
segundo. Su longitud y velocidad de Ethernet hacen útil para conectar ordenadores en el mismo piso de un
edificio;
24 Capítulo 1 abstracciones y Tecnología de Computadores

red de área local (LAN) Una red Por lo tanto, es un ejemplo de lo que se llama genéricamente una Red de área local . Redes de área local están
diseñado para llevar datos interconectados con los interruptores que también puede proporcionar servicios de enrutamiento y seguridad. Redes
dentro de un área
de área amplia cruzar continentes y son la columna vertebral de Internet, que soporta la banda. Ellos se basan
geográficamente limitada,
normalmente en fibras ópticas y se alquilan a las empresas de telecomunicaciones.
típicamente dentro de un único
edificio.
Las redes han cambiado la cara de la informática en los últimos 30 años, tanto por ser mucho más ubicuo
red de área amplia (WAN) Una y haciendo incrementos dramáticos en el rendimiento. En la década de 1970, muy pocas personas tenían
red se extendía sobre cientos de
acceso al correo electrónico, Internet y la web no existiera, y enviar por correo físicamente cintas magnéticas
kilómetros que pueden abarcar
era la principal forma de transferir grandes cantidades de datos entre dos ubicaciones. Redes de área local
un continente.
eran casi inexistentes, y las pocas redes de área amplia existentes tenían capacidad limitada y el acceso
restringido.

A medida que la tecnología de red mejorada, se hizo considerablemente más barato y tenía
una capacidad significativamente mayor. Por ejemplo, la primera tecnología de red de área local
estandarizado, desarrollado hace unos 30 años, era una versión de Ethernet que tenía una
capacidad máxima (también llamado ancho de banda) de 10 millones de bits por segundo, por lo
general compartida por decenas, si no cientos, ordenadores. Hoy en día, la tecnología de red de
área local ofrece una capacidad de 1 a 40 gigabits por segundo, por lo general compartida por a
lo sumo unos pocos equipos. tecnologías de la comunicación óptica ha permitido un crecimiento
similar en la capacidad de las redes de área amplia, desde cientos de kilobits a gigabits y de
cientos de ordenadores conectados a una red en todo el mundo a millones de ordenadores
conectados.

Durante la última década otra innovación en la creación de redes está transformando la forma en que se comunican
los ordenadores. La tecnología inalámbrica es generalizada, lo que permitió la era post-PC. La capacidad de hacer una
radio en la misma tecnología de semiconductores de bajo costo (CMOS) que se utiliza para la memoria y
microprocesadores permitió una mejora significativa en el precio, dando lugar a una explosión en el despliegue.
tecnologías inalámbricas actualmente disponibles, llamados por el nombre estándar IEEE 802.11, permiten velocidades
de transmisión de 1 a casi 100 millones de bits por segundo. La tecnología inalámbrica es un poco diferente de las redes
alámbricas, ya que todos los usuarios en un área inmediata comparten las ondas.

Examínese ■ memoria de semiconductores DRAM, memoria flash, y almacenamiento en disco difieren significativamente. Para
cada tecnología, la lista de su volatilidad, el tiempo de acceso relativa aproximada, y el costo relativo aproximado
en comparación con la DRAM.

1.5 Tecnologías para procesadores de construcción


y memoria

Procesadores y la memoria han mejorado a un ritmo increíble, porque los diseñadores de computadoras han aceptado
desde hace tiempo lo último en tecnología electrónica para tratar de ganar la carrera para diseñar un mejor equipo. Figura
1.10 muestra las tecnologías que tienen
1.5 Tecnologías para la construcción procesadores y la memoria 25

Año La tecnología utilizada en los ordenadores El rendimiento relativo de costo / unidad

1951 Tubo vacío 1


1965 35
1975 Circuito
escala de integrado
circuitos integrados de transistores 900
1995 Muy a gran escala de circuitos integrados ultra-gran 2400000
2013 250000000000

FIGURA 1.10 El rendimiento relativo por unidad de coste de las tecnologías utilizadas en los ordenadores a través del tiempo. Fuente:
Computer Museum, Boston, con 2.013 extrapolado por los autores. Ver sección 1.12 .

ha utilizado el tiempo, con una estimación de la rendimiento relativo por unidad de coste para cada tecnología. Dado que esta
tecnología da forma a lo que los ordenadores serán capaces de hacer y lo rápido que va evolucionando, creemos que todos los
profesionales de la informática debe estar familiarizado con los conceptos básicos de circuitos integrados.

UNA transistor es simplemente un interruptor de encendido / apagado controlado por electricidad. los circuito transistor Un interruptor de

integrado ( IC) a cientos de transistores docenas combinan en un solo chip. Cuando Gordon Moore predijo la encendido / apagado controlado por

duplicación continua de los recursos, que preveía la tasa de crecimiento del número de transistores por chip. una señal eléctrica.

Para describir el enorme aumento en el número de transistores de cientos a millones de personas, el adjetivo muy
integrado (VLSI) circuito muy
gran escala se añade a la expresión, la creación de la abreviatura VLSI, para circuito integrado muy gran gran escala Un dispositivo que
escala . contiene cientos de miles a
millones de transistores.

Esta tasa de aumento de la integración ha sido notablemente estable. Figura 1.11 muestra el crecimiento de la
capacidad de DRAM desde 1977. Durante 35 años, la industria ha cuadruplicado constantemente la capacidad de cada 3
años, lo que resulta en un aumento de más de 16.000 veces! silicio Un elemento

Para entender cómo fabricar circuitos integrados, empezamos por el principio. La fabricación de un chip natural que es un
semiconductor.
comienza con silicio , una sustancia encontrada en arena. Debido a que el silicio no conduce bien la electricidad,
se llama una semiconductor . Con un proceso químico especial, es posible añadir materiales de silicona que
permiten a pequeñas áreas se transforman en uno de los tres dispositivos:
semiconductor
Una sustancia que no conduce

■ Excelentes conductores de electricidad (usando ya sea cobre microscópico o alambre de aluminio) bien la electricidad.

10000000

1000000 2G 4G
1G

512M
100.000
16M
capacidad kibibit

64M 128M256M
10000 4M

1M
1000
256K

64K
100
16K

10
1976 1978 1980 1982 1984 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2006 2008 2010 2012

Año de introducción

FIGURA 1.11 crecimiento de la capacidad por chip DRAM en el tiempo. los y- eje se mide en kibibits (2 10 bits). La industria de DRAM capacidad cuadruplicado casi cada tres años,
un aumento del 60% por año, durante 20 años. En los últimos años, la tasa se ha ralentizado y es un poco más cerca de duplicar cada dos o tres años.
26 Capítulo 1 abstracciones y Tecnología de Computadores

■ Excelentes aislantes de la electricidad (como el revestimiento de plástico o vidrio)

■ Las áreas que pueden conducir o aislar en condiciones específicas (como un interruptor) Transistores caen

en esta última categoría. Un circuito VLSI, entonces, es sólo mil millones de combinaciones de conductores,

aislantes, y conmutadores fabricados en un solo paquete pequeño.

lingote de silicio de cristal


El proceso de fabricación de circuitos integrados es crítica para el costo de los chips y por lo tanto importante para los
Una varilla compuesta de un cristal de
diseñadores de computadoras. Figura 1.12 muestra que proceso. El proceso se inicia con una lingote de silicio de cristal , que
silicio que se encuentra entre 8 y 12
pulgadas de diámetro y alrededor de se parece a una salchicha gigante. Hoy en día, son lingotes de 8-12 pulgadas de diámetro y aproximadamente 12-24
12 a 24 pulgadas de largo. pulgadas de largo. Un lingote es finamente cortada en obleas no más de 0,1 pulgadas de espesor. Estas obleas luego pasan
por una serie de etapas de procesamiento, durante los cuales se colocan los patrones de los productos químicos en cada
oblea, la creación de los transistores, conductores y aisladores discutidos anteriormente. circuitos integrados de hoy en día
oblea Una rebanada de un silicio
contienen sólo una capa de transistores, pero pueden tener de dos a ocho niveles de conductor de metal, separadas por
lingote no más de
0.1 pulgadas de espesor, que se capas de aislantes.
utilizan para crear los chips.

obleas en
lingote de silicio blanco

20 a 40 etapas de
máquina de cortar
procesamiento

matrices analizadas oblea obleas modeladas


probado

Bond morir para probador


Jugador
empaquetar de obleas

muere envasados muere envasados ​probados

probador Envía a los


parte clientes

FIGURA 1.12 El proceso de fabricación de chips. Después de ser cortado en rodajas del lingote de silicio, obleas en blanco se ponen a través de 20 a 40
pasos para crear obleas modeladas (ver Figura 1.13 ). Estas obleas modeladas se ensayaron luego con un probador de la oblea, y un mapa de las partes
buenas se hace. A continuación, las obleas se cortado en dados (ver
Figura 1.9 ). En esta figura, una oblea produjo 20 troqueles, de los cuales 17 pasado la prueba. (X significa el troquel es malo.) El rendimiento de las buenas
troqueles en este caso era 17/20, o 85%. Estas buenas matrices se unen entonces en paquetes y se prueban una vez más antes de enviar las piezas
embaladas a los clientes. Una parte mala envasados ​se encontró en esta prueba final.

Un defecto microscópico solo en la propia oblea o en una de las docenas de pasos de modelado puede resultar
defecto Un defecto microscópico en
en esa zona de la falla oblea. Estas defectos , como se les llama, hacen que sea virtualmente imposible fabricar una
una oblea o en los pasos de modelado
que pueden resultar en el fallo de la
oblea perfecto. La forma más sencilla de hacer frente a la imperfección es colocar muchos componentes
matriz que contiene ese defecto. independientes en una sola oblea. La oblea modelada se corta luego hacia arriba, o cortado en dados, en estos
componentes,
1.5 Tecnologías para la construcción procesadores y la memoria 27

FIGURA 1.13 Una oblea de 12 pulgadas (300 mm) de Intel Core i7 (Cortesía Intel). El número de matrices en esta oblea 300 mm (12 pulgadas) en un
rendimiento del 100% es 280, cada uno de 20,7 por 10,5 mm. chips de las varias docenas parcialmente redondeadas en los límites de la oblea son inútiles;
que se incluyen porque es más fácil para crear las máscaras que se utilizan para el patrón de silicio. Este troquel utiliza una tecnología de 32 nanómetros, lo
que significa que las características más pequeñas son de aproximadamente 32 nm de tamaño, aunque son típicamente algo más pequeño que el tamaño de
la característica real, que se refiere al tamaño de los transistores como “dibujado” frente a la final fabricado tamaño.

llamado muere y más informalmente conocido como papas fritas . Figura 1.13 muestra una fotografía de una oblea que contiene morir Las secciones rectangulares

microprocesadores antes de que se han cortado en dados; más temprano, Figura individuales que se cortan de una oblea,
más informalmente conocido como
1.9 muestra un troquel de microprocesador individual.
Dicing le permite descartar sólo aquellas matrices que eran bastante desafortunado para contener los
papas fritas .
defectos, en lugar de toda la oblea. Este concepto se cuantifica por el
rendimiento de un proceso, que se define como el porcentaje de buenas matrices a partir del número total de matrices sobre rendimiento El porcentaje de buena

la oblea. muere por el número total de


troqueles en la oblea.
El costo de un circuito integrado se eleva rápidamente a medida que aumenta tamaño de la pastilla, tanto por el menor
rendimiento y a los menos matrices que se ajustan en una oblea. Para reducir el costo, utilizando el siguiente proceso de
generación se reduce una gran matriz, ya que utiliza tamaños más pequeños para los dos transistores y cables. Esto mejora el

rendimiento y el recuento dado por cada oblea. Un proceso de 32 nanómetros (nm) era típico en 2012, lo que significa
esencialmente que el tamaño de la característica más pequeña sobre la matriz es de 32 nm.
28 Capítulo 1 abstracciones y Tecnología de Computadores

Una vez que haya encontrado buenos matrices, que están conectados a los pines de entrada / salida de un paquete,
usando un proceso llamado unión. Estas partes envasados ​se prueban un tiempo final, ya que los errores pueden ocurrir
en los envases, y luego se envían a los clientes.

Elaboración: El costo de un circuito integrado se puede expresar en tres ecuaciones simples:

Costo por oblea


Costo por troquel
muere por oblea rendimiento

área Die área de


Muere por waffer
la oblea

1
rendimiento
1( ( Defectos por Die área son aa / 2)) 2

La primera ecuación es sencillo para derivar. La segunda es una aproximación, ya que no resta el área cerca
de la frontera de la oblea redonda que no pueden acomodar los moldes rectangulares (ver Figura 1.13 ). La
ecuación final se basa en observaciones empíricas de los rendimientos en las fábricas de circuito integrado, con el
exponente relacionado con el número de pasos de procesamiento críticos.

Por lo tanto, dependiendo de la tasa de defectos y el tamaño de la matriz y de la oblea, los costes son generalmente no lineal en la

zona del troquel.

ExamíneseUn factor clave en la determinación del coste de un circuito integrado es el volumen. ¿Cuál de las siguientes son razones
por las cuales un chip hecho en alto volumen debe costar menos?

1. Con altos volúmenes, el proceso de fabricación se puede ajustar para un diseño particular, el aumento del
rendimiento.

2. Es menos trabajo para diseñar una parte de alto volumen de una parte de bajo volumen.

3. Las máscaras usadas para hacer el chip son caros, por lo que el coste por chip es menor para mayores volúmenes.

4. Los costos de desarrollo de ingeniería son altos y en gran medida independiente del volumen; Por lo tanto, el coste de
desarrollo por dado es menor con piezas de gran volumen.

5. Piezas de alto volumen por lo general tienen tamaños de matriz más pequeñas que las partes de bajo volumen y, por
tanto, tienen una mayor rendimiento por oblea.

1.6 Actuación

Evaluar el rendimiento de los ordenadores puede ser bastante difícil. La escala y complejidad de los sistemas de
software modernos, junto con la amplia gama de técnicas de mejora de rendimiento empleados por los
diseñadores de hardware, han realizado la evaluación del rendimiento mucho más difícil.

Cuando se trata de elegir entre distintos ordenadores, el rendimiento es un atributo importante. La medición
precisa y la comparación de diferentes equipos es fundamental para
1.6 Rendimiento 29

compradores y, por lo tanto, a los diseñadores. Las personas que venden computadoras lo saben también. A
menudo, los vendedores les gustaría que usted ver a su equipo de la mejor manera posible, si esta luz se refleja
con precisión las necesidades de aplicación del comprador. Por lo tanto, la comprensión de la mejor manera de
medir el rendimiento y las limitaciones de esas medidas es importante en la selección de un ordenador.

El resto de esta sección se describen diferentes formas en las que el rendimiento se puede determinar; a
continuación, se describen las métricas para medir el rendimiento del punto de vista tanto de un usuario de la
computadora y un diseñador. También tenemos en cuenta cómo estas métricas están relacionados y presentamos la
ecuación clásica rendimiento del procesador, lo que vamos a utilizar todo el texto.

Rendimiento definir
Cuando decimos que un ordenador tiene un mejor rendimiento que otro, ¿qué queremos decir? Aunque
esta pregunta puede parecer simple, una analogía con aviones de pasajeros muestra cómo sutil puede
ser la cuestión de rendimiento. Figura 1.14
enumera algunos aviones de pasajeros típico, junto con su velocidad de crucero, el rango, y la capacidad.
Si quisiéramos saber cuál de los aviones en esta mesa tuvo el mejor desempeño, tendríamos primero que
definir el rendimiento. Por ejemplo, teniendo en cuenta las diferentes medidas de rendimiento, vemos que
el avión con la más alta velocidad de crucero era el Concorde (retirado del servicio en 2003), el avión con
el mayor alcance es el DC-8, y el plano de mayor capacidad se el 747.

Capacidad de Gama de crucero Velocidad de crucero rendimiento de pasajeros


Avión pasajeros (millas) (Mph) (pasajeros × mph)

Boeing 777 375 4630 610 228750


Boeing 747 470 4150 610 286.700
BAC / Sud Concorde 132 4000 1350 178.200
Douglas DC-8-50 146 8720 544 79424

FIGURA 1.14 La capacidad, el rango, y la velocidad para un número de aviones comerciales. La última columna muestra la tasa a la que el
avión de transporte de pasajeros, que es las veces la capacidad de la velocidad de crucero (ignorando gama y los tiempos de despegue y
aterrizaje).

Supongamos que definimos el rendimiento en términos de velocidad. Esto deja dos definiciones posibles.
Se podría definir el plano más rápido que el que tiene la más alta velocidad de crucero, teniendo un solo
pasajero de un punto a otro en el menor tiempo. Si estaban interesados ​en el transporte de 450 pasajeros de
un punto a otro, sin embargo, el 747 sería claramente el más rápido, ya que la última columna de la figura. Del tiempo de respuesta También
mismo modo, podemos definir el rendimiento del equipo de varias maneras distintas. llamado Tiempo de ejecución .
El tiempo total requerido para el equipo
para completar una tarea, incluyendo
Si se ejecuta un programa en dos ordenadores de escritorio diferentes, se diría que el más rápido es el ordenador
los accesos de disco, los accesos a
de escritorio que hace el trabajo en primer lugar. Si se ejecuta un centro de datos que tenía varios servidores que
memoria, I / O, las actividades
ejecutan los trabajos enviados por muchos usuarios, se diría que el ordenador más rápido fue el que completó más
generales del sistema operativo, la CPU
puestos de trabajo durante un día. Como un usuario de la computadora individual, que está interesado en reducir tiempo tiempo de ejecución, y así
de respuesta -el tiempo entre el inicio y la finalización de una tarea que también se conoce como sucesivamente.
30 Capítulo 1 abstracciones y Tecnología de Computadores

rendimiento También llamado Tiempo de ejecución . administradores de centros de datos a menudo se preocupan por el aumento rendimiento o
ancho de banda . Otra medida del ancho de banda -La cantidad total de trabajo realizado en un momento dado. Por lo tanto, en la mayoría de los casos,
rendimiento, es el número de
necesitaremos diferentes métricas de rendimiento, así como diferentes conjuntos de aplicaciones a dispositivos móviles
tareas completadas por unidad de
personales de referencia, que se centran más en el tiempo de respuesta, frente a los servidores, que son más centrado en el
tiempo.
rendimiento.

Rendimiento y tiempo de respuesta

¿Los siguientes cambios en un incremento en el rendimiento del sistema informático, disminuyen el tiempo de respuesta, o
EJEMPLO ambos?

1. Sustitución del procesador en un equipo con una versión más rápida

2. Adición de procesadores adicionales a un sistema que utiliza múltiples procesadores para tareas

separadas por ejemplo, buscar en la web disminuir el tiempo de respuesta casi siempre mejora el

rendimiento. Por lo tanto, en el caso


RESPONDER 1, tanto el tiempo de respuesta y el rendimiento se mejoran. En el caso 2, nadie tarea se hace trabajo más rápido, por lo
que sólo aumenta el rendimiento.

Sin embargo, si la demanda de procesamiento en el segundo caso era casi tan grande como el

rendimiento, el sistema podría obligar a las solicitudes que hacer cola. En este caso, el aumento del rendimiento

también podría mejorar el tiempo de respuesta, ya que reduciría el tiempo de espera en la cola. Por lo tanto, en

muchos sistemas informáticos reales, ya sea cambiando el tiempo de ejecución o rendimiento menudo afecta al

otro. Al analizar el rendimiento de los ordenadores, que será principalmente de tiempo de respuesta para los

primeros capítulos. Para maximizar el rendimiento, queremos minimizar el tiempo de respuesta o tiempo de

ejecución de alguna tarea. Por lo tanto, podemos relacionar el rendimiento y el tiempo de ejecución para un

ordenador X:

1
Actuación X
Tiempo de ejecución X

Esto significa que para dos ordenadores X e Y, si el rendimiento de X es mayor que el rendimiento de Y,
tenemos

Actuación X
Actuación Y

1 1

Tiempo de ejecución X
Tiempo de ejecución Y

Ex tiempo eecution Y
Tiempo de ejecución X

Es decir, el tiempo de ejecución en Y es más larga que la de X, si X es más rápido que Y.


1.6 Rendimiento 31

En la discusión de un equipo de diseño, muchas veces queremos relacionar el rendimiento de los dos equipos diferentes
cuantitativamente. Vamos a utilizar la frase “X es norte veces más rápido que y”-o equivalentemente“X es norte veces más rápido
que Y”-para significa

Rendimiento
Rendimiento X
norte
Y

Si X es norte veces más rápido que Y, a continuación, el tiempo de ejecución en la que Y es norte veces más largo que está en X:

Rendimiento XY Tiempo de ejecución YX


norte
Rendimiento Tiempo de ejecución

Desempeño relativo

Si el equipo A ejecuta un programa en 10 segundos y el equipo B se ejecuta el mismo programa en 15


segundos, cuánto más rápido es A a B? EJEMPLO

Sabemos que A es norte veces más rápido que B si


RESPONDER
Rendimiento AB
Tiempo de ejecución licenciado
norte
Rendimiento Tiempo de ejecución en Letras

Por lo tanto el coeficiente de rendimiento es

15 10 1 5
.

y A, por tanto, es de 1,5 veces más rápido que B.

En el ejemplo anterior, también podríamos decir que el equipo B es 1,5 veces más lento que
Un equipo, ya

Rendimiento
Rendimiento UNA
15.
segundo

significa que

Actuación UNA
Actuación segundo
15.
32 Capítulo 1 abstracciones y Tecnología de Computadores

Para simplificar, se utilizará normalmente la terminología tan rápido como cuando tratamos de comparar
cuantitativamente los ordenadores. Debido a que el rendimiento y el tiempo de ejecución son recíprocos,
aumentando el rendimiento requiere disminuir el tiempo de ejecución. Para evitar la confusión potencial entre los
términos creciente y decreciente, se suele decir “mejorar el rendimiento” o “mejorar el tiempo de ejecución” cuando nos
referimos a “aumentar el rendimiento” y “tiempo de ejecución disminución”.

Medición de desempeño
El tiempo es la medida del rendimiento del equipo: el equipo que realiza la misma cantidad de trabajo en el
menor tiempo es el más rápido. Programa Tiempo de ejecución se mide en segundos por programa. Sin
embargo, el tiempo se puede definir de diferentes maneras, dependiendo de lo que se cuenta. La definición
más simple de tiempo se llama
tiempo de reloj de pared, tiempo de respuesta, o tiempo transcurrido. Estos términos significan el tiempo total para completar una
tarea, incluyendo los accesos al disco, los accesos a memoria, de entrada y salida ( E / S) actividades, el sistema operativo de

arriba, todo.

Las computadoras se comparten a menudo, sin embargo, y un procesador puede trabajar en varios programas al
mismo tiempo. En tales casos, el sistema puede tratar de optimizar el rendimiento en lugar de tratar de minimizar el tiempo
transcurrido para un programa. Por lo tanto, muchas veces queremos distinguir entre el tiempo transcurrido y el tiempo
durante el cual el procesador está trabajando en nuestro nombre. el tiempo de ejecución de la CPU o simplemente tiempo
el tiempo de ejecución de la CPU Tambiénde CPU ,
llamado tiempo de CPU . El tiempo real que reconoce esta distinción, es el momento pasa la CPU de computación para esta tarea y no incluye el tiempo
de la CPU pasa de computación para
de espera para E / S o ejecutar otros programas. (Recuerde, sin embargo, que el tiempo de respuesta
una tarea específica.
experimentado por el usuario será el tiempo transcurrido del programa, no el tiempo de CPU.) Tiempo de CPU
puede ser dividida en el tiempo de CPU empleado en el programa, llamado tiempo de CPU de usuario , y el
tiempo de CPU de usuario El tiempo de CPU empleado en el sistema operativo para realizar tareas en nombre del programa, llamado
tiempo de CPU gastado en un
programa en sí.
tiempo de CPU del sistema . La diferenciación entre el sistema y el usuario de la CPU tiempo es difícil de hacer con

tiempo de CPU del sistema El precisión, ya que a menudo es difícil asignar la responsabilidad de las actividades de operación del sistema a un programa
tiempo de CPU empleado en el de usuario en lugar de otro y debido a las diferencias de funcionalidad entre los sistemas operativos.
sistema operativo para realizar
tareas en nombre del programa.
Para mantener la coherencia, mantenemos una distinción entre el rendimiento en función del tiempo transcurrido y que con
base en el tiempo de ejecución de la CPU. Vamos a utilizar el término rendimiento de sistema para referirse al tiempo
transcurrido en un sistema sin carga y rendimiento de la CPU
para referirse a tiempo de la CPU del usuario. Nos centraremos en el rendimiento de la CPU en este capítulo, a pesar de
nuestras discusiones sobre cómo resumir el rendimiento se pueden aplicar a cualquiera tiempo transcurrido o mediciones de
tiempo de CPU.

Comprensión Las diferentes aplicaciones son sensibles a diferentes aspectos del funcionamiento de un sistema informático.
Muchas aplicaciones, especialmente aquellas que se ejecutan en servidores, dependen tanto de rendimiento de E /
rendimiento de
S, el cual, a su vez, se basa tanto en hardware y software. El tiempo total transcurrido medido por un reloj de pared
los programas es la medición de interés. En
1.6 Rendimiento 33

algunos entornos de aplicación, el usuario puede cuidar de rendimiento, tiempo de respuesta, o una combinación
compleja de los dos (por ejemplo, el rendimiento máximo con un tiempo de respuesta del peor caso). Para mejorar el
rendimiento de un programa, uno debe tener una definición clara de las cuestiones métricas de rendimiento y luego lo
proceder a encontrar los cuellos de botella de rendimiento mediante la medición de la ejecución del programa y en
busca de los cuellos de botella probables. En los siguientes capítulos, describiremos cómo buscar los cuellos de
botella y mejorar el rendimiento en diversas partes del sistema.

A pesar de que los usuarios de computadoras que nos importa el tiempo, cuando examinamos los detalles de un ciclo de reloj También llamado

equipo que es conveniente pensar en el rendimiento en otras métricas. En particular, los diseñadores de computadoras garrapata , pulso de reloj , período
de reloj , reloj , o ciclo .
pueden querer pensar en un ordenador mediante el uso de una medida que se relaciona con la rapidez con que el
El tiempo para un periodo de reloj,
hardware puede realizar funciones básicas. Casi todos los equipos se construyen usando un reloj que determina cuando
por lo general del reloj del
los eventos se llevan a cabo en el hardware. Estos intervalos de tiempo discretos son llamados ciclos de reloj ( o
procesador, que se ejecuta a una
velocidad constante.
garrapatas , reloj avanza , periodos de reloj , relojes , ciclos ). Los diseñadores se refieren a la longitud de una
período de reloj La longitud de cada
período de reloj tanto como el tiempo para una completa ciclo de reloj ( por ejemplo, a 250 picosegundos, o 250 ps) y
ciclo de reloj.
como el velocidad de reloj ( por ejemplo, 4 gigahertz, o 4 GHz), que es la inversa del periodo de reloj. En el apartado
siguiente, vamos a formalizar la relación entre los ciclos de reloj del diseñador de hardware y los segundos del usuario
de la computadora.

1. Supongamos que sabemos que una aplicación que utiliza ambos dispositivos móviles personales y la Examínese
Nube está limitado por el rendimiento de la red. Para los siguientes cambios, se indicará si sólo el
rendimiento mejora, tanto en el tiempo de respuesta y el rendimiento mejoran, o ninguno de mejora.

a. Se añade un canal de red adicional entre el PMD y la nube, aumentando el rendimiento


total de la red y reducir el retardo para obtener acceso a la red (ya que ahora hay dos
canales).
segundo. El software de red se mejora, lo que reduce el retardo de comunicación de la red,
pero no el aumento de rendimiento.
do. Más memoria se añade a la computadora.

2. El desempeño de ordenador C es cuatro veces más rápido que el rendimiento del equipo B, que se ejecuta una
aplicación determinada en 28 segundos. ¿Cuánto tiempo estará equipo C tomar para ejecutar esa
aplicación?

Rendimiento de la CPU y sus factores

Los usuarios y los diseñadores a menudo examinan los resultados utilizando diferentes métricas. Si pudiéramos
relacionar estos diferentes métricas, podríamos determinar el efecto de un cambio de diseño en el rendimiento como la
experimentada por el usuario. Dado que nos limitamos a rendimiento de la CPU en este punto, la medida de
funcionamiento la línea de fondo es la CPU
34 Capítulo 1 abstracciones y Tecnología de Computadores

Tiempo de ejecución. Una fórmula simple relaciona las métricas más básicas (ciclos de reloj y ciclo de reloj de tiempo) a
tiempo de CPU:

tiempo CPUexecution CPUCLOCK ciclos para un programa de tiempo de ciclo


para un programa de Clocck

Por otra parte, debido a la velocidad del reloj y el tiempo de ciclo de reloj son inversas,

tiempo CPUexecution ciclos CPUCLOCK para un programa de


para un programa de
rrate reloj

Esta fórmula deja claro que el diseñador de hardware puede mejorar el rendimiento al reducir el número de ciclos de
reloj necesarios para un programa o la duración del ciclo de reloj. Como veremos en capítulos posteriores, el diseñador
a menudo se enfrenta a una solución de compromiso entre el número de ciclos de reloj necesarios para un programa y
la duración de cada ciclo. Muchas de las técnicas que disminuyen el número de ciclos de reloj también pueden
aumentar el tiempo de ciclo de reloj.

Mejorando el desempeño

Nuestro programa favorito se ejecuta en 10 segundos en el equipo A, que tiene un reloj de 2 GHz. Estamos tratando
EJEMPLO de ayudar a un diseñador equipo a construir un ordenador, B, que se desarrollará este programa en 6 segundos. El
diseñador ha determinado que un aumento sustancial en la velocidad de reloj es posible, pero este incremento
afectará al resto del diseño de la CPU, haciendo que el equipo B para requerir 1,2 veces el número de ciclos de reloj
como equipo A para este programa. ¿Qué velocidad de reloj deberíamos decirle al diseñador para apuntar?

Primero vamos a encontrar el número de ciclos de reloj necesarios para el programa de A:


RESPONDER
ciclos CPUCLOCK Automóvil
CPUTIME UNA
Velocidad de reloj
club británico

Automóvil club británico


10 segundos ciclos CPUCLOCK
9 ciclos

Sesegundo
2 10
ciclos
9 ccond de 20 10 9
ciclos CPUCLOCK UNA
10 segundos 2 10 ciclos
1.6 Rendimiento 35

tiempo de CPU para B se puede encontrar utilizando la siguiente ecuación:

1 .2 Ciclos de reloj de la CPU AB


tiempo de CPU segundo
Frecuencia de reloj

9
1 .2 20 10 ciclos
6 segundos
Frecuencia de reloj
segundo

9 9 9
1 .2 20 10 ciclos 0 .2 20 10 ciclos 4 10 ciclos
Velocidad de relojsegundo 4 GHz
6 Seco NNDS segundo segundo

Para ejecutar el programa en 6 segundos, B debe tener el doble de la frecuencia de reloj de A.

Rendimiento de instrucciones

Las ecuaciones de rendimiento anterior no se incluía ninguna referencia al número de instrucciones necesarios
para el programa. Sin embargo, ya que el compilador claramente instrucciones a ejecutar generado, y el equipo
tuvo que ejecutar las instrucciones para ejecutar el programa, el tiempo de ejecución debe depender del número
de instrucciones de un programa. Una forma de pensar en el tiempo de ejecución es que es igual al número de
instrucciones ejecutadas multiplicada por el tiempo promedio por instrucción. Por lo tanto, el número de ciclos de
reloj necesarios para un programa se puede escribir como

ciclos CPUCLOCK Instrucciones para un programa de ciclos Averageclock


de instrucciones pper

El termino ciclos de reloj por instrucción , que es el número promedio de ciclos de reloj cada instrucción tarda ciclos de reloj por instrucción

en ejecutar, a menudo se abrevia como IPC . Desde diferentes instrucciones pueden tomar diferentes cantidades (CPI) Promedio del número de ciclos
de reloj por instrucción de un
de tiempo, dependiendo de lo que hacen, el IPC es un promedio de todas las instrucciones ejecutadas en el
fragmento de programa o programa.
programa. CPI ofrece una manera de comparar dos implementaciones diferentes de la arquitectura del conjunto
de instrucciones idénticas, ya que el número de instrucciones ejecutadas por un programa, por supuesto, ser el
mismo.

Utilizando la ecuación Rendimiento

Supongamos que tenemos dos implementaciones de la misma arquitectura del conjunto de instrucciones. El
equipo A tiene un tiempo de ciclo de reloj de 250 ps y un IPC de 2,0 para un programa, y ​el equipo B tiene un
EJEMPLO
tiempo de ciclo de reloj de 500 ps y un IPC de 1,2 para el mismo programa. ¿Qué equipo es más rápido para este
programa y por cuánto?
36 Capítulo 1 abstracciones y Tecnología de Computadores

Sabemos que cada equipo ejecuta el mismo número de instrucciones para el programa; vamos a llamar a este
RESPONDER número YO. En primer lugar, encontrar el número de ciclos de reloj del procesador para cada equipo:

ciclos CPUCLOCK
CPUCLOCK UNA
ciclos II 2 .0

segundo
1 .2

Ahora podemos calcular el tiempo de CPU para cada equipo:

tiempo de CPU UNA ciclos de reloj de la CPU UNA


Reloj de tiempo de ciclo

yo 2 .0 250 ps 5500 yo PD

Asimismo, para B:

CPUTIME segundo
yo 1 .2 500 PD 600 yoPD

Claramente, el equipo A es más rápido. La cantidad más rápido está dada por la relación de los tiempos de ejecución:

CPUperformance AB El tiempo de ejecución segundo


600 II ps
1 .2
CPUperformance de ejecución tim eeUNA 500 ps

Podemos concluir que el equipo A es 1,2 veces más rápido que el equipo B de este programa.

La ecuación del rendimiento de la CPU Classic

cómputo de instrucciones El Ahora podemos escribir esta ecuación básica rendimiento en términos de cómputo de instrucciones
número de instrucciones ejecutadas (El número de instrucciones ejecutadas por el programa), IPC, y el tiempo de ciclo de reloj:
por el programa.
CPUTIME tiempo de ciclo de reloj Instructioncount IPC

o, ya que la frecuencia de reloj es el inverso del tiempo de ciclo de reloj:

Instructioncount IPC
CPUTIME
Velocidad de reloj

Estas fórmulas son particularmente útiles porque se separan los tres factores clave que afectan al rendimiento.
Podemos utilizar estas fórmulas para comparar dos implementaciones diferentes o para evaluar una alternativa
de diseño si conocemos su impacto en estos tres parámetros.
1.6 Rendimiento 37

Al comparar segmentos de código

Un diseñador compilador está tratando de decidir entre dos secuencias de código para un ordenador. Los
diseñadores de hardware han suministrado los siguientes hechos: EJEMPLO

IPC para cada clase de instrucción A

segundo do

IPC 1 2 3

Para una declaración lenguaje de alto nivel en particular, el escritor del compilador está considerando dos
secuencias de código que requieren las siguientes instrucción cuenta:

Instrucción cuenta para cada clase de instrucción

secuencia de código UNA segundo do

1 2 1 2

2 4 1 1

¿Qué secuencia de código ejecuta las instrucciones de la mayoría? Que será más rápido? ¿Qué es el IPC para
cada secuencia?

Secuencia 1 ejecuta 2 + 1 + 2 = 5 instrucciones. Secuencia 2 ejecuta 4 + 1 + 1 = 6 instrucciones. Por lo tanto, la


secuencia 1 ejecuta un menor número de instrucciones. RESPONDER
Podemos utilizar la ecuación de ciclos de reloj de CPU basado en el recuento de instrucciones y el IPC para
encontrar el número total de ciclos de reloj para cada secuencia:

ciclos CPUCLOCK Σ1 IPC yo


C (yo)
en=

Esto produce ciclos

CPUCLOCK 1
(2 1 )( 12 )( 23 ) 2 2 6 10 ciclos

CPUCLOCK CY ccles 2
(4 1 )( 12 )( 13 ) 4239 ciclos

Así código de secuencia 2 es más rápido, a pesar de que ejecuta una instrucción adicional. Desde código de secuencia 2
tiene un menor número de ciclos de reloj global, pero tiene más instrucciones, debe tener un IPC menor. Los valores del
IPC se pueden calcular por

CPU IPC ciclos de reloj


IPC
Instrucción recuento

ciclos de reloj de la CPU 11


10 5
1
2 .0
cómputo de instrucciones 1

ciclos de reloj de la CPU 2


9615
IPC 2
.
Instruir recuento Iion 2
38 Capítulo 1 abstracciones y Tecnología de Computadores

Figura 1.15 muestra las mediciones básicas en diferentes niveles en el ordenador y lo que se
mide en cada caso. Podemos ver cómo se combinan estos factores para obtener el tiempo de
ejecución se mide en segundos por programa:

ciclos de reloj ciclo de reloj


Hora Segundos / Instrucciones del equipo
Programa Autoinstrucción segundos

los GRANDE
Siempre tener en cuenta que la única medida completa y fiable del rendimiento del equipo es el tiempo.
Imagen Por ejemplo, cambiar el conjunto de instrucciones para bajar el cómputo de instrucciones puede dar lugar
a una organización con un tiempo de ciclo de reloj más lento o más alto IPC que compensa la mejora en
el recuento de instrucciones. Del mismo modo, ya que el IPC depende del tipo de instrucciones se
ejecuta, el código que se ejecuta el menor número de instrucciones que puede no ser el más rápido.

Componentes del desempeño Unidades de medida

el tiempo de ejecución de la CPU para un programa Segundos para el programa

cómputo de instrucciones Instrucciones ejecutadas por el programa

ciclos de reloj por instrucción (CPI) número medio de ciclos de reloj por instrucción

tiempo de ciclo de reloj Segundos por ciclo de reloj

FIGURA 1.15 Los componentes básicos de rendimiento y cómo se mide cada uno.

¿Cómo podemos determinar el valor de estos factores en la ecuación de rendimiento? Podemos medir el tiempo de
ejecución de la CPU mediante la ejecución del programa, y ​el tiempo de ciclo de reloj se publica por lo general como
parte de la documentación de un ordenador. El cómputo de instrucciones y el IPC pueden ser más difíciles de obtener.
Por supuesto, si se conoce el tiempo de frecuencia de reloj de la CPU y la ejecución, sólo necesitamos uno de la cuenta
de instrucción o el IPC para determinar la otra.

Podemos medir el recuento de instrucciones mediante el uso de herramientas de software que perfilan la
ejecución o mediante el uso de un simulador de la arquitectura. Alternativamente, podemos utilizar los contadores de
hardware, que se incluyen en la mayoría de los procesadores, para grabar una variedad de medidas, incluyendo el
número de instrucciones ejecutadas, el IPC promedio, y, a menudo, las fuentes de pérdida de rendimiento. Dado que
el cómputo de instrucciones depende de la arquitectura, pero no sobre la aplicación exacta, podemos medir el
recuento de instrucciones sin conocer todos los detalles de la implementación. El IPC, sin embargo, depende de una
amplia variedad de detalles de diseño en el ordenador, que incluye tanto el sistema de memoria y la estructura de
procesador (como veremos en Capítulo 4

y Capítulo 5 ), Así como en la mezcla de tipos de instrucciones ejecutadas en una aplicación. Por lo tanto, el IPC varía
según la aplicación, así como entre las implementaciones con el mismo juego de instrucciones.
1.6 Rendimiento 39

El ejemplo anterior muestra el peligro de usar un solo factor (cómputo de instrucciones) para evaluar el rendimiento.
Al comparar los dos equipos, debe mirar a los tres componentes, que se combinan para formar el tiempo de ejecución. Si
algunos de los factores son idénticos, al igual que la frecuencia de reloj en el ejemplo anterior, el rendimiento se puede
determinar mediante la comparación de todos los factores no idénticos. Desde IPC varía según mezcla de instrucciones ,
mezcla de instrucciones
Una medida de la frecuencia dinámica
tanto cómputo de instrucciones y el IPC se deben comparar, incluso si las frecuencias de reloj son iguales. Varios
de las instrucciones a través de uno o
ejercicios al final de este capítulo le piden que evaluar una serie de mejoras informáticas y compilador que afectan a la
varios programas.
velocidad del reloj, el IPC, y el recuento de instrucciones. En
sección 1.10 , vamos a examinar una medida común de rendimiento que no incorpora todos los términos
y por lo tanto puede ser engañoso.

El rendimiento de un programa depende del algoritmo, el lenguaje, el compilador, la arquitectura y Rendimiento de los
el hardware real. La siguiente tabla resume cómo estos componentes afectan los factores de la programas
ecuación rendimiento de la CPU.
comprensión

componente de
hardware o
software Afecta a qué? ¿Cómo?

Algoritmo cómputo de instrucciones, El algoritmo determina el número de instrucciones de programa fuente ejecutados y
posiblemente IPC por lo tanto el número de instrucciones del procesador ejecutadas. El algoritmo
también puede afectar a la CPI, al favorecer las instrucciones lentas o más rápidas.
Por ejemplo, si el algoritmo utiliza más divisiones, tenderá a tener un IPC superior.

Lenguaje de cómputo de instrucciones, el El lenguaje de programación sin duda afecta al cómputo de instrucciones, ya que las
programación IPC declaraciones en el idioma se convierten a instrucciones del procesador, que determinan
cómputo de instrucciones. El lenguaje también puede afectar a la CPI debido a sus
características; por ejemplo, un lenguaje con un fuerte apoyo para la extracción de datos (por
ejemplo, Java) se realizará mediante indirectos, que utilizará más altas instrucciones del IPC.

Compilador cómputo de instrucciones, el La eficiencia del compilador afecta tanto al cómputo de instrucciones y los ciclos
IPC promedio por instrucción, ya que el compilador determina la traducción de las
instrucciones en lenguaje fuente en las instrucciones del ordenador. El papel del
compilador puede ser muy compleja y afectar el IPC de diversas maneras.

Set de instrucciones cómputo de instrucciones, La arquitectura del conjunto de instrucciones afecta a todos los tres aspectos de
arquitectura frecuencia de reloj, el IPC rendimiento de la CPU, ya que afecta a las instrucciones necesarias para una función, el
costo en ciclos de cada instrucción, y la velocidad del reloj global del procesador.

Elaboración: Aunque se podría esperar que el IPC mínima es de 1,0, como veremos en
Capítulo 4 , Algunos procesadores de traer y ejecutar múltiples instrucciones por ciclo de reloj. Para reflejar este enfoque,
algunos diseñadores invierten IPC para hablar IPC, o instrucciones por ciclo de reloj. Si un procesador ejecuta un promedio
de dos instrucciones por ciclo de reloj, entonces tiene un IPC de 2 y por lo tanto un IPC de 0,5.
40 Capítulo 1 abstracciones y Tecnología de Computadores

Elaboración: Aunque tradicionalmente se ha fijado el tiempo de ciclo de reloj, para ahorrar energía o aumentar temporalmente el
rendimiento, los procesadores de hoy en día pueden variar sus velocidades de reloj, por lo que tendría que utilizar el promedio velocidad
de reloj para un programa. Por ejemplo, el Core i7 de Intel va a aumentar temporalmente la frecuencia de reloj en un 10% hasta que el
chip se calienta demasiado. Intel llama a esto Modo Turbo.

Examínese

.
a. 15 0 6 1 1
8 .2segundo
.
de las tres opciones siguientes:

segundo.
¿Qué tan rápido 15 .0 6 1esperar
podemos 1. 9 9 que. lasegundo
aplicación se ejecute el uso de este nuevo compilador? Escoja la respuesta correcta

. que requiere
Java se libera . sólo 0,6 tantas instrucciones como el viejo compilador. Por desgracia, aumenta el IPC en un 1,1.
do. 1 5 1 1 0 6 27 5
. segundo
.
primas. Una aplicación dada escrito en Java se ejecuta 15 segundos en un procesador de escritorio. Un nuevo compilador de

es que nos hemos topado con el límite de potencia práctico para la refrigeración de los microprocesadores de las materias

recientemente. La razón por la que crecieron juntos es que están correlacionados, y el motivo de su reciente desaceleración
1.7 La energía de la pared
30 años. Tanto la velocidad de reloj y la potencia se incrementó rápidamente durante décadas y luego se aplanan fuera

Figura 1.16 muestra el aumento de la frecuencia de reloj y el poder de ocho generaciones de microprocesadores Intel más de

10000
3600 2667 3300 3400
2000

1000 103
95
Velocidad de reloj
200 120
Velocidad de reloj (MHz)

87
75.3 De energía (vatios)
66 25 77
100 100

dieciséis
12.5 80
Poder
10
29.1
10.1 40 60
3.3 4.1 4.9

1 0 20
i5 Ivy Puente
(1997) Pentium

(2010) Core
(2004) Core
2 Kentsfield
Pentium Pro

Clarkdale
4 Willamette
(1982)

(1985)

(1989)

Pentium 4
80286

80386

80486

Pentium

Core i5
(1993)

Prescott

(2012)
(2001)

(2007)

FIGURA 1.16 tasa de reloj y de alimentación para microprocesadores Intel x86 más de ocho generaciones y 30 años. El Pentium 4 hizo un
salto espectacular en la velocidad del reloj y el poder pero no tanto en el rendimiento. Los problemas térmicos Prescott condujo al abandono de la
línea Pentium 4. La línea de base 2 se revierte a una tubería más simple con velocidades de reloj más bajas y múltiples procesadores por chip. Las
tuberías Core i5 siguen sus pasos.
1.7 La energía de la pared 41

Aunque la energía proporciona un límite a lo que podemos enfriar, en la era post-PC del recurso realmente valioso es la
energía. duración de la batería puede rendimiento de triunfo en el dispositivo móvil personal, y los arquitectos de computadoras
escala almacén tratan de reducir los costos de energía y refrigeración 100.000 servidores ya que los costes son altos en esta
escala. Del mismo modo que la medición de tiempo en segundos es una evaluación más seguro del desempeño del programa
que una tasa como MIPS (véase la Sección 1.10), los julios métricas de energía es una medida mejor que la tarifa eléctrica es
como vatios, que es sólo julios / segundo.

La tecnología dominante para circuitos integrados CMOS se llama ( complementary metal oxide
semiconductor). Para CMOS, la principal fuente de consumo de energía es la llamada energía dinámica,
es decir, la energía que se consume cuando los transistores conmutan los estados de 0 a 1 y viceversa.
La energía dinámica depende de la carga capacitiva de cada transistor y el voltaje aplicado:

2
Tensión deαcarga de energía capacitiva

Esta ecuación es la energía de un pulso durante la transición lógica de 0 → 1 → 0 o 1 → 0 → 1. La energía de


una única transición es entonces

2
Energía α 1 2/ Tensión de carga capacitiva

La potencia requerida por transistor es sólo el producto de la energía de una transición y la frecuencia de las
transiciones:

2
Poder α 1 2/ Tensión de carga capacitiva frecuencia de conmutación

Frecuencia de conmutación es una función de la velocidad del reloj. La carga capacitiva por transistor es una función
de tanto el número de transistores conectados a una salida (llamado el
abanico de salida) y la tecnología, que determina la capacidad de los dos cables y transistores.

Con respecto a Figura 1.16 , ¿Cómo podrían crecer frecuencias de reloj en un factor de 1000, mientras

potencia aumentó sólo en un factor de 30? Energía y así poder pueden reducirse mediante la reducción de la
tensión, que se produjo con cada nueva generación de la tecnología, y la potencia es una función de la tensión al
cuadrado. Típicamente, el voltaje se redujo aproximadamente 15% por generación. En 20 años, los voltajes han
pasado de 5 V a 1 V, por lo que el aumento de la potencia es de sólo 30 veces.

Poder relativo

Supongamos que hemos desarrollado un nuevo procesador, más simple que tiene el 85% de la carga capacitiva del más

complejo procesador de más edad. Además, se supone que se puede ajustar el voltaje de manera que pueda reducir la
EJEMPLO
tensión 15% en comparación con el procesador B, que se traduce en una contracción 15% en la frecuencia. ¿Cuál es el

impacto en la dinámica de poder?


42 Capítulo 1 abstracciones y Tecnología de Computadores

poder nuevo
<carga capacitiva 0 .85 > < voltaje 0 .85 2> < F Rrequency conmutada 0 .85 >
RESPONDER 2
poder viejo
Tensión de carga capacitiva Frecuencia conmutada

Así, la relación de potencia es

4
0 .85 0 .52

Por lo tanto, el nuevo procesador usa la mitad de la potencia del procesador de edad. El problema moderno es que la

reducción adicional de la tensión parece que los transistores demasiado permeable, como los grifos de agua que no se

puede apagar completamente. Incluso hoy en día alrededor del 40% del consumo de energía en chips para servidores es

debido a una fuga. Si transistores comenzó a derramar más, todo el proceso podría llegar a ser difícil de manejar.

Para intentar abordar el problema de la energía, los diseñadores ya han unido dispositivos grandes para aumentar la
refrigeración, y apagar partes del chip que no se utilizan en un ciclo de reloj dado. Aunque hay muchas maneras más
caras para enfriar los chips y de ese modo aumentar su poder para, por ejemplo, 300 vatios, estas técnicas son
generalmente demasiado costoso para ordenadores personales e incluso servidores, por no hablar de los dispositivos
móviles personales.
Dado que los diseñadores de computadoras chocaron contra una pared de energía, que necesitaban un nuevo camino a
seguir. Eligieron una ruta diferente de la forma en que los microprocesadores diseñados por sus primeros 30 años.

Elaboración: Aunque la energía dinámica es la principal fuente de consumo de energía en CMOS, el consumo de energía
estática se produce debido a la corriente de fuga que fluye incluso cuando un transistor está apagado. En los servidores, la fuga
es típicamente responsable del 40% del consumo de energía. Por lo tanto, aumentando el número de transistores aumenta la
disipación de potencia, incluso si los transistores son siempre apagado. Una variedad de técnicas de diseño e innovaciones
tecnológicas están siendo desplegados para controlar las fugas, pero es difícil para bajar la tensión aún más.

Elaboración: El poder es un reto para los circuitos integrados por dos razones. En primer lugar, la energía debe ser llevado en
y distribuido alrededor del chip; microprocesadores modernos utilizan cientos de pines sólo para alimentación y tierra! De manera
similar, múltiples niveles de interconexión de chip se utilizan únicamente para la energía y la distribución de tierra a porciones del
chip. En segundo lugar, la energía se disipa en forma de calor y debe ser eliminado. chips para servidores pueden quemar más
de 100 vatios, y enfriar el chip y el sistema circundante es un gasto importante en los ordenadores escala almacén (véase Capítulo
6 ).
1.8 El cambio radical: el cambio de monoprocesadores a multiprocesadores 43

1.8 El cambio radical: el cambio de


Monoprocesadores a multiprocesadores

El límite de potencia ha obligado a un cambio dramático en el diseño de microprocesadores. Hasta ahora, la mayoría del
Figura 1.17 muestra la mejora en el tiempo de respuesta de los programas para los microprocesadores de escritorio a software ha sido como la música
través del tiempo. Desde 2002, la tasa se ha reducido de un factor de 1,5 por año a un factor de 1,2 por año. escrita para un artista en solitario;
con la actual generación de chips
En lugar de seguir para disminuir el tiempo de respuesta de un programa que se ejecuta en el procesador único, a de que estamos recibiendo un
partir de 2006 todas las empresas de escritorio y servidor están enviando microprocesadores con múltiples procesadores poco de experiencia con dúos y
por chip, donde el beneficio es a menudo más en el rendimiento que en el tiempo de respuesta. Para reducir la confusión cuartetos y otras agrupaciones
entre el procesador de palabras y el microprocesador, las empresas se refieren a procesadores como “núcleos”, y tales pequeñas; pero anotando una obra
microprocesadores se denominan genéricamente microprocesadores multinúcleo. Por lo tanto, un microprocesador para gran orquesta y el coro es un
“quadcore” es un chip que contiene cuatro procesadores o cuatro núcleos. tipo diferente de desafío.

En el pasado, los programadores podían confiar en las innovaciones en hardware, la arquitectura y los
compiladores de duplicar el rendimiento de sus programas cada 18 meses sin tener que cambiar una línea de código.
Hoy en día, para los programadores para conseguir una mejora significativa en el tiempo de respuesta, es necesario
Brian Hayes, Computar en un
volver a escribir sus programas para aprovechar las múltiples procesadores. Por otra parte, para obtener el beneficio
universo paralelo,
histórico de correr más rápido en los nuevos microprocesadores, los programadores tendrán que seguir para mejorar el 2007.
rendimiento de su código como el número de núcleos aumenta.

Para reforzar cómo los sistemas de software y hardware trabajan juntos, se utiliza una sección especial, Hardware
/ software de interfaz, en todo el libro, con la primera que se encuentra a continuación. Estos elementos se
resumen importantes conocimientos en este interfaz crítica.

Paralelismo siempre ha sido crucial para el rendimiento en computación, pero a menudo se oculta. Capítulo 4 explicará Interfaz de
la canalización, una técnica elegante que ejecuta programas más rápido mediante la superposición de la ejecución de
hardware /
instrucciones. Esta optimización es un ejemplo de el paralelismo a nivel de instrucción, donde la naturaleza paralela del
hardware se abstrae de distancia para que el programador y el compilador puede pensar en el hardware como
software
ejecutar instrucciones de forma secuencial.

Obligando a los programadores ser conscientes de que el hardware paralelo y volver a escribir sus programas a ser
paralelos había sido el “tercer carril” de la arquitectura de computadores, para las empresas en el pasado que dependía
de un cambio en el comportamiento fallido (ver
sección 6.15 ). Desde este punto de vista histórico, es sorprendente que toda la industria de TI ha apostado
su futuro que los programadores finalmente pasar con éxito a la programación explícitamente paralelo.
44 Capítulo 1 abstracciones y Tecnología de Computadores

100.000
Intel Xeon 4 núcleos 3.6 GHz (impulso a 4,0)
Intel Core i7 de 4 núcleos a 3,4 GHz (3,8 GHz impulso a)
Intel Xeon de 6 núcleos, 3,3 GHz (3,6 GHz impulso a) 34967
Intel Xeon de 4 núcleos, 3,3 GHz (3,6 GHz impulso a)
31999
Extreme 4 núcleos de 3,2 GHz (3,5 GHz impulso a)
Intel Core Duo Extreme 2 núcleos, 3,0 GHz Intel Core i7
Extreme 2 núcleos, 2,9 GHz 19,48421,87124,129
14387
10000 AMD Athlon 64, 2,8 GHz
11865
AMD Athlon, 2.6 GHz Intel Core 2
Intel Xeon EE 3,2 GHz
Intel placa base D850EMVR (3,06 GHz, el procesador Pentium 4 con tecnología Hyper-threading) 6043 6681 7108
4195
IBM Power4, 1.3 GHz
3016
base, procesador de 1,0 GHz Pentium III
1779
Estación de trabajo profesional XP1000, 667 MHz Intel VC820 21264A placa
MHz 21264 1267
1000
993
Rendimiento (frente a VAX-11/780)

5/600, 600 MHz 21164 Digital AlphaServer 8400 6/575, 575


649
Alphastation digital 5/500, 500 MHz AlphaServer 4000
481
Digital Alphastation 5/300, 300 MHz
280 22% / año
Digital Alphastation 4/266, 266 MHz
183
IBM POWERstation 100, 150 MHz 117
100
Digital 3000 AXP / 500, 150 MHz
80
HP 9000/750, 66 MHz
51

IBM RS6000 / 540, 30 MHz MIPS 24 52% / año


M2000, 25 MHz MIPS M / 120, 16,7 MHz 18
Sun-4/260, 16,7 MHz VAX 8700, 22 MHz
13
10
9

AX-11/780, 5 MHz

25% / año 1,5, VAX-11/785


1 1
1978 1980 1984 y dos
mil novecientos ochenta 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2006 2008 2010 2012 2014

FIGURA 1.17 El crecimiento en el rendimiento del procesador desde mediados de la década de 1980. Este rendimiento parcelas tabla con relación a la VAX 11/780 medido por los puntos de referencia
SPECint (véase la Sección 1.10). Antes de mediados de la década de 1980, el crecimiento fue en gran medida el rendimiento del procesador Tecnología en impulsado con un promedio de alrededor del 25% por
año. El aumento en el crecimiento de alrededor del 52% desde entonces es atribuible a las ideas arquitectónicas y de organización más avanzada. La mejora del rendimiento anual más alta de 52% desde
mediados de la década de 1980 significó el rendimiento fue de aproximadamente un factor de siete más grande en 2002 de lo que hubiera sido si se mantuvo en el 25%. Desde 2002, los límites del poder,
disponible paralelismo a nivel de instrucción, y la latencia de la memoria a largo han frenado el rendimiento monoprocesador recientemente, a aproximadamente 22% por año.

¿Por qué ha sido tan difícil para los programadores escribir programas paralelos de manera explícita? La
primera razón es que la programación paralela es mediante la programación de rendimiento definición, lo que
aumenta la dificultad de la programación. No sólo el programa tiene que ser correcta, resolver un problema
importante, y proporcionar una interfaz útil para las personas u otros programas que invocan; El programa también
debe ser rápido. De lo contrario, si usted no necesita el rendimiento, acaba de escribir un programa secuencial.

La segunda razón es que rápido para el hardware paralelo significa que el programador debe dividir una
aplicación para que cada procesador tiene más o menos la misma cantidad que hacer al mismo tiempo, y que los
gastos generales de la programación y la coordinación no desperdiciar los beneficios potenciales de rendimiento de
paralelismo.
Como analogía, supongamos que la tarea era escribir un artículo periodístico. Ocho periodistas que trabajan en la
misma historia potencialmente podrían escribir una historia de ocho veces más rápido. Para lograr este aumento de la
velocidad, se necesitaría para romper la tarea de manera que cada reportero tuvo algo que ver al mismo tiempo. Por lo
tanto, debe programar las sub-tareas. Si algo salió mal y sólo un reportero tomó más tiempo que los otros siete lo hicieron,
a continuación, se disminuirían los beneficios de tener ocho escritores. Por lo tanto, debe equilibrar el
1.8 El cambio radical: el cambio de monoprocesadores a multiprocesadores 45

carga uniformemente para obtener la aceleración deseada. Otro peligro sería si los reporteros tenían que pasar mucho
tiempo hablando entre sí para escribir sus secciones. También se quedaría corto si una parte de la historia, tales como la
conclusión, no pudo ser escrito hasta que se cumplieron todas las otras partes. Por lo tanto, se debe tener cuidado para reducir
la comunicación y los gastos generales de sincronización. Por tanto esta analogía y la programación paralela, los desafíos
incluyen la programación, balanceo de carga, el tiempo para la sincronización, y los gastos generales para la
comunicación entre las partes. Como se puede adivinar, el reto es más rígido con más reporteros para un artículo
periodístico y más procesadores para la programación paralela.

Para reflejar este cambio radical en la industria, los siguientes cinco capítulos de esta edición del libro Cada uno tiene
una sección sobre las implicaciones de la revolución paralelo al capítulo:

■ Capitulo 2 , sección 2.11 : Paralelismo e instrucciones de sincronización. Por lo general, las tareas paralelas
independientes tienen que coordinar a veces, como para decir cuando hayan completado su trabajo. En este
capítulo se explican las instrucciones usadas por los procesadores de múltiples núcleos para sincronizar tareas.

■ Capítulo 3 , sección 3.6 : Paralelismo y Computer Aritmética: palabra parcial paralelismo. Tal vez la forma más
simple de paralelismo para construir implica la computación en elementos en paralelo, por ejemplo cuando la
multiplicación de dos vectores. paralelismo palabra parcial se aprovecha de los recursos suministrados por La
Ley de Moore al proveedor de unidades aritméticas más amplios que pueden operar en muchas operandos de
forma simultánea.

■ Capítulo 4 , sección 4.10 : Paralelismo a través de Instrucciones. Dada la dificultad de la programación en


paralelo de forma explícita, tremendo esfuerzo se invirtió en la década de 1990 en tener el hardware y el
compilador descubrir paralelismo implícito, inicialmente a través de la canalización. En este capítulo se
describen algunas de estas técnicas agresivas, incluyendo ir a buscar y ejecutar múltiples instrucciones
simultáneamente y adivinanzas sobre los resultados de las decisiones y ejecutar instrucciones
especulativamente usando predicción.

■ Capítulo 5 , sección 5.10 : paralelismo y Las jerarquías de memoria: La coherencia de caché. Una forma de reducir el
costo de la comunicación es que todos los procesadores utilizan el mismo espacio de direcciones, de modo que

cualquier procesador puede leer o escribir datos. Teniendo en cuenta que todos los procesadores de hoy en día utilizan

la memoria caché para guardar una copia temporal de los datos en la memoria más rápido cerca del procesador, es

fácil imaginar que la programación paralela sería aún más difícil si los cachés asociadas con cada procesador tenían

valores inconsistentes de los datos compartidos. En este capítulo se describen los mecanismos que mantienen los

datos en todas las memorias caché coherente.

■ Capítulo 5 , sección 5.11 : El paralelismo y la jerarquía de la memoria: Las matrices redundantes de


discos baratos. En esta sección se describe cómo el uso de muchos discos en conjunto pueden ofrecer
mucho más alto rendimiento, que fue la inspiración original de Las matrices redundantes de discos
baratos ( RAID). La popularidad real de RAID resultó ser el mayor fiabilidad que ofrece mediante la
inclusión de un número modesto de discos redundantes. La sección se explican las diferencias en el
rendimiento, el coste y la fiabilidad entre los diferentes niveles de RAID.
46 Capítulo 1 abstracciones y Tecnología de Computadores

Además de estas secciones, hay un capítulo completo sobre el procesamiento paralelo. Capítulo 6
entra en más detalles sobre los retos de la programación en paralelo; presenta los dos enfoques opuestos a la
comunicación de abordar compartida y paso de mensajes explícitos; describe un modelo restringido de
paralelismo que es más fácil de programar; discute la dificultad de la evaluación comparativa de procesadores
paralelos; introduce un nuevo modelo de funcionamiento sencillo para microprocesadores multinúcleo; y,
finalmente, describe y evalúa cuatro ejemplos de microprocesadores multinúcleo utilizando este modelo.

Pensé [ordenadores] sería una Como se mencionó anteriormente, Capítulos 3 a 6 uso vector matriz se multiplican como un ejemplo se ejecuta para mostrar

idea de aplicación universal, como cómo cada tipo de paralelismo puede aumentar significativamente el rendimiento.

un libro es. Pero no creía que fuera apéndice B describe un componente de hardware cada vez más popular que se incluye con los ordenadores de
a desarrollar tan rápido como lo sobremesa, el unidad de procesamiento gráfico ( GPU). Inventado para acelerar los gráficos, las GPU están convirtiendo en
hizo, porque no me imagino que plataformas de programación en su propio derecho. Como era de esperar, teniendo en cuenta estos tiempos, se basan en las
nos gustaría poder conseguir GPU paralelismo.
tantas partes en un chip que apéndice B describe la GPU NVIDIA y resalta partes de su entorno de programación
finalmente llegamos. El transistor paralela.
llegó inesperadamente. Todo
ocurrió mucho más rápido de lo
que esperábamos.

1.9 Cosas reales: Evaluación comparativa de la


Intel Core i7
J. Presper Eckert, coinventor
de ENIAC, hablando en 1991 Cada capítulo tiene una sección titulada “real Stuff” que une los conceptos en el libro con una computadora
puede usar todos los días. Estas secciones cubren la tecnología subyacente de las computadoras modernas.
Para esta primera sección “real Stuff”, nos fijamos en la forma en circuitos integrados se fabrican y cómo se
miden el rendimiento y la potencia, con el procesador Intel Core i7 como el ejemplo.
carga de trabajo Un conjunto de
programas se ejecutan en un equipo
que es o bien la colección real de
aplicaciones ejecutadas por un usuario SPEC CPU Benchmark
o construidas a partir de los programas
Un usuario de la computadora que dirige el día mismos programas a día sería el candidato perfecto para evaluar un nuevo
reales a la aproximación de una mezcla
tal. Una carga de trabajo típica equipo. El conjunto de programas de gestión formarían una carga de trabajo . Para evaluar dos sistemas informáticos, un

especifica tanto los programas y las usuario simplemente comparar el tiempo de ejecución de la carga de trabajo en los dos equipos. La mayoría de los usuarios,
frecuencias relativas. sin embargo, no están en esta situación. En su lugar, tienen que depender de otros métodos que miden el rendimiento de un
equipo candidato, con la esperanza de que los métodos reflejarán lo bien que el equipo llevará a cabo con la carga de
trabajo del usuario. Esta alternativa es generalmente seguido por la evaluación del ordenador usando un conjunto de los
puntos de referencia -Programas elegido específicamente para medir el rendimiento. Los puntos de referencia forman una
carga de trabajo que las esperanzas de usuario se predecir el rendimiento de la carga de trabajo real. Como hemos señalado
anteriormente, para hacer la caso común rápida , primero tiene que conocer con precisión cuyo caso es común, por lo
general, desempeñan un papel fundamental en la arquitectura de computadores.

punto de referencia Un programa


seleccionado para su uso en
SPEC ( Rendimiento Sistema de Evaluación Cooperativa) es un esfuerzo financiado y apoyado por un número de

comparar el rendimiento del equipo. vendedores de ordenadores para crear conjuntos estándar de puntos de referencia para los sistemas informáticos modernos.
En 1989, SPEC creado originalmente un punto de referencia
1.9 cosas reales: Evaluación comparativa de la Intel Core i7 47

Ejecución Referencia
Conde de tiempo de ciclo de reloj T ime T ime (segundos)
instrucciones x 10 9
Descripción Nombre IPC (10 segundos x -9) (segundos) SPECratio

Interpretado Perl procesamiento de cadenas 2252 0.60 0,376 508 9770 19.2
Ordenación de bloques bzip2 2390 0.70 0,376 629 9650 15.4
compresión de GNU

compilador de C gcc 794 1.20 0,376 358 8050 22.5

optimización combinatoria mpc 221 2.66 0,376 221 9120 41.2

Ir juego (AI) ir 1274 1.10 0,376 527 10490 19.9

secuencia de búsqueda de genes hmmer 2616 0.60 0,376 590 9330 15.8

Juego de ajedrez (AI) Sjeng 1948 0.80 0,376 586 12100 20.7
Computadora cuántica libquantum 659 0.44 0,376 109 20720 190,0
simulación

Compresión de video h264avc 3793 0.50 0,376 713 22130 31.0


Evento discreto omnetpp 367 2.10 0,376 290 6250 21.5
Bibliotecas juegos de simulación /

hallazgo ruta una estrella 1250 1.00 0,376 470 7020 14.9

análisis XML xalancbmk 1045 0.70 0,376 275 6900 25.1

Significado geometrico - - - - - - 25.7

FIGURA 1.18 SPECINTC2006 puntos de referencia que se ejecutan en un 2,66 GHz Intel Core i7 920. Como la ecuación en la página 36 se explica, el tiempo de ejecución es el producto de los
tres factores en esta tabla: cómputo de instrucciones en mil millones, relojes (por instrucción IPC), y el ciclo de reloj de tiempo en nanosegundos. SPECratio es simplemente el tiempo de referencia,
que se suministra por SPEC, dividido por el tiempo de ejecución medido. El número único citado SPECINTC2006 es la media geométrica de los SPECratios.

establecer centrándose en el rendimiento del procesador (que ahora se llama SPEC89), que ha evolucionado a través de cinco

generaciones. La última es SPEC CPU2006, que consiste en un conjunto de 12 puntos de referencia enteros (CINT2006) y 17

puntos de referencia de punto flotante (CFP2006). Los puntos de referencia enteros varían de parte de un compilador C para un

programa de ajedrez para una simulación por ordenador cuántico. Los puntos de referencia de punto flotante incluyen códigos
estructurados de rejilla para el modelado de elementos finitos, códigos de método de partículas de dinámica molecular, y los

códigos de álgebra lineales dispersos para la dinámica de fluidos.

Figura 1.18 describe los puntos de referencia SPEC enteros y su tiempo de ejecución en el procesador Intel Core i7 y
muestra los factores que explican el tiempo de ejecución: cómputo de instrucciones, IPC, y tiempo de ciclo de reloj. Tenga en
cuenta que el IPC varía en más de un factor de 5.
Para simplificar la comercialización de computadoras, SPEC decidió reportar un único número que resume los
12 puntos de referencia enteros. Dividiendo el tiempo de ejecución de un procesador de referencia por el tiempo de
ejecución del equipo evaluado normaliza las mediciones de tiempo de ejecución; esta normalización da una
medida, llamada SPECratio, que tiene la ventaja de que los resultados numéricos más grandes indican un
rendimiento más rápido. Es decir, el SPECratio es el inverso del tiempo de ejecución. A CINT2006 o resumen
CFP2006 medición se obtiene tomando la media geométrica de los SPECratios.

Elaboración: Al comparar los dos equipos que utilizan SPECratios, aplicar la media geométrica de modo que dé la
misma respuesta relativa sin importar qué computadora se utiliza para normalizar los resultados. Si un promedio de los
valores de tiempo de ejecución normalizados con una media aritmética, los resultados variarían dependiendo del
ordenador que elegimos como referencia.
48 Capítulo 1 abstracciones y Tecnología de Computadores

La fórmula para la media geométrica es

Πejecución
Proporción de tiempo de
eenn

donde relación de tiempo de ejecución yo es el tiempo de ejecución, normalizado al equipo de referencia, para la yo ésimo programa de un
total de norte en la carga de trabajo, y

Π una
yo
una una
2 ... una
norte
en significa
1 que el producto 1

Benchmark SPEC Poder


Dada la creciente importancia de la energía y la potencia, SPEC añadió un punto de referencia para medir la potencia. Se informa
de consumo de energía de los servidores en los diferentes niveles de carga de trabajo, dividido en incrementos de 10%, durante
un período de tiempo. Figura 1.19 muestra los resultados para un servidor que utilizan procesadores Intel Nehalem similares a los
anteriores.

Rendimiento Energía promedio


Cargar Target% (ssj_ops) (vatios)

100% 865618 258


90% 786688 242
80% 698051 224
70% 607826 204
60% 521391 185
50% 436757 170
40% 345919 157
30% 262071 146
20% 176061 135
10% 86784 121
0% 0 80
suma global 4787166 1922
Σ ssj_ops / Σ potencia = 2490

FIGURA 1.19 SPECpower_ssj2008 se ejecuta en un dual socket 2,66 GHz Intel Xeon X5650 con 16 GB de DRAM y
un disco 100 GB SSD.

SPECpower comenzó con otro punto de referencia SPEC para las aplicaciones empresariales Java
(SPECjbb2005), que ejerce los procesadores, memorias caché y la memoria principal, así como la máquina virtual de
Java, compilador, recolector de basura, y piezas del sistema operativo. El rendimiento se mide en el rendimiento, y
las unidades son operaciones comerciales por segundo. Una vez más, para simplificar la comercialización de
computadoras, SPEC
1.10 Falacias y errores 49

forúnculos estos números abajo a un número, llamado “ssj_ops generales por vatio.” La fórmula para esta
única métrica de resumen es

• 10 • • 110 •
• •• • ••
ssj_ops generales por vatio • Σ ssj_ops yo•
• Σ poder ••
•• •• •• yo
• yo 0 • yo 0 •

donde ssj_ops yo es el rendimiento en cada incremento de 10% y el poder yo es la energía consumida en cada nivel
de rendimiento.

1.10 Falacias y errores

El propósito de una sección sobre las falacias y las trampas, que se encuentra en cada capítulo, es explicar algunos La ciencia debe comenzar
conceptos erróneos comúnmente aceptadas que pueden surgir. Nosotros los llamamos falacias. Cuando se habla de con mitos, y la crítica de
una falacia, tratamos de dar un contraejemplo. También se discuten escollos, o fácilmente cometido errores. A los mitos.
menudo, las trampas son generalizaciones de los principios que son verdaderas en un contexto limitado. El propósito
Sir Karl Popper, La
de estas secciones es ayudar a evitar este tipo de errores en los ordenadores puede diseñar o utilizar. falacias coste filosofía de la ciencia,
/ rendimiento y las trampas han atrapado a muchos un arquitecto de ordenadores, incluidos nosotros. En 1957
consecuencia, esta sección no sufre ninguna escasez de ejemplos pertinentes. Comenzamos con una trampa que
atrapa a muchos diseñadores y revela una relación importante en el diseño del equipo.

Trampa: Contar con la mejora de un aspecto de un ordenador para aumentar el rendimiento general en
una cantidad proporcional al tamaño de la mejora.

La gran idea de hacer la caso común rápida tiene un corolario desmoralizador que ha plagado a los
diseñadores de hardware y software. Nos recuerda que la oportunidad de mejora se ve afectada por la
cantidad de tiempo consume el evento.
Un problema de diseño sencillo ilustra bien. Supongamos que un programa se ejecuta en 100 segundos en un
ordenador, con operaciones de multiplicación responsables de 80 segundos de este tiempo. ¿Cuánto tengo que mejorar
la velocidad de multiplicación si quiero que mi programa se ejecute cinco veces más rápido?

El tiempo de ejecución del programa después de hacer la mejora está dada por la siguiente ecuación
simple conocido como Ley de Amdahl : Ley de Amdahl
Una regla que indica que la mejora
Executiontimeaf mejora er del rendimiento posible con una
mejora dado está limitada por la
timea ejecución? ejada por la mejora cantidad que se utiliza la
timeuna ejecución? ected
característica mejorada. Es una
mejora uf cantidad
versión cuantitativa de la ley de
rendimientos decrecientes.
Para este problema:

80 segundos
Ejecución timea? Er mejora ( 100 80 segundos )
norte
50 Capítulo 1 abstracciones y Tecnología de Computadores

Como queremos que el rendimiento sea cinco veces más rápido, el nuevo tiempo de ejecución debe ser de 20
segundos, dando

80 segundos
20 segundos 20 segundos
norte

segundos
0 80
norte

Es decir, no es sin cantidad por el cual podemos mejorar-multiplicar para lograr un aumento de cinco veces en el
rendimiento, si las cuentas se multiplican por sólo el 80% de la carga de trabajo. La mejora de rendimiento posible con
una mejora dado está limitada por la cantidad que se utiliza la característica mejorada. En la vida cotidiana este concepto
también produce lo que llamamos la ley de rendimientos decrecientes.

Podemos utilizar la ley de Amdahl para estimar las mejoras de rendimiento cuando sabemos que el tiempo
consumido para alguna función y su potencial de aceleración. Ley de Amdahl, junto con la ecuación de
rendimiento de la CPU, es una herramienta útil para evaluar posibles mejoras. Ley de Amdahl se explora con
más detalle en los ejercicios.
Ley de Amdahl también se utiliza para argumentar a favor de límites prácticos para el número de procesadores en
paralelo. Examinamos este argumento en la sección Falacias y errores de
Capítulo 6 .

Falacia: Las computadoras en la baja utilización usan poca energía.

cuestiones de eficiencia de energía en usos bajos debido a cargas de trabajo varían. La utilización de servidores de
ordenador escala almacén de Google, por ejemplo, es entre 10% y 50% la mayor parte del tiempo y en el 100% de menos
de 1% del tiempo. Incluso teniendo en cuenta 5 años para aprender a manejar bien el punto de referencia SPECpower, el
ordenador configurado de manera especial con los mejores resultados en 2012 todavía utiliza el 33% de la potencia de
pico en el 10% de la carga. Sistemas en el campo que no están configurados para el punto de referencia SPECpower son
sin duda peor.

Dado que las cargas de trabajo de servidores varían pero el uso de una gran fracción de la potencia pico, Luiz Barroso y Urs

Hölzle [2007] sostienen que hay que rediseñar el hardware para lograr la ‘computación de energía proporcional.’ Si utilizan
servidores futuras, por ejemplo, el 10% de la potencia pico en 10% de la carga de trabajo, se podría reducir la factura de

electricidad de los centros de datos y llegar a ser buenos ciudadanos corporativos en una era de creciente preocupación por CO 2 las

emisiones.

Falacia: Diseñando para el rendimiento y el diseño para la eficiencia energética son objetivos no relacionados.

Dado que la energía es poder sobre el tiempo, es a menudo el caso de que las optimizaciones de hardware o software que
tienen menos tiempo ahorrar energía en general, incluso si la optimización tarda un poco más energía cuando se utiliza. Una
de las razones es que todo el resto del equipo está consumiendo energía mientras se ejecuta el programa, por lo que
incluso si la parte optimizado utiliza un poco más de energía, la reducción del tiempo puede ahorrar la energía de todo el
sistema.

Escollo: El uso de un subconjunto de la ecuación de rendimiento como una métrica de rendimiento.

Ya hemos advertido sobre el peligro de rendimiento basado en la predicción simplemente uno de la


velocidad del reloj, cómputo de instrucciones, o IPC. Otro error común es usar sólo dos de los tres factores
para comparar el rendimiento. Aunque el uso de
1.10 Falacias y errores 51

dos de los tres factores pueden ser válidas en un contexto limitado, el concepto también es mal utilizado fácilmente. De
hecho, casi todas las propuestas alternativas al uso del tiempo como la métrica de rendimiento han llevado finalmente a las
declaraciones engañosas, resultados distorsionados, o interpretaciones incorrectas.

Una alternativa a tiempo es MIPS (millones de instrucciones por segundo) . Para un programa dado, MIPS es millones de instrucciones por

simplemente segundo (MIPS)


Una medición de la velocidad de la

Tiempo de ejecución 10 ejecución del programa basado en el


MIPS Instructioncount 6 número de millones de instrucciones.
MIPS se calcula como el cómputo de
instrucciones dividido por el producto
Desde MIPS es un índice de ejecución de instrucciones, MIPS especifica el rendimiento a la inversa de tiempo de ejecución; del tiempo de ejecución y 10 6.
ordenadores más rápidos tienen una calificación más alta MIPS. Las buenas noticias sobre MIPS es que es fácil de entender,
y los ordenadores más rápidos significa MIPS más grandes, que coincide con la intuición.

Hay tres problemas con el uso de MIPS como una medida para comparar los ordenadores. En primer lugar, MIPS
especifica la velocidad de ejecución de instrucciones, pero no tiene en cuenta las capacidades de las instrucciones. No
podemos comparar las computadoras con diferentes conjuntos de instrucciones MIPS utilizando, ya que los conteos de
instrucción sin duda diferentes. En segundo lugar, MIPS varía entre los programas en el mismo equipo; por lo tanto, un
equipo no puede tener una sola calificación MIPS. Por ejemplo, mediante la sustitución de tiempo de ejecución, vemos la
relación entre MIPS, frecuencia de reloj, y el IPC:

Instructioncount clo tasa de


MIPS CCK CPI 10 6
Instructioncount IPC 10 6
Velocidad de reloj

El IPC varió en un factor de 5 para CPU2006 SPEC en un equipo Intel Core i7 en Figura 1.18 , Por lo MIPS
también lo hace. Por último, y lo más importante, si un nuevo programa ejecuta más instrucciones, pero cada
instrucción es más rápido, MIPS puede variar independientemente de rendimiento!

Tenga en cuenta las siguientes medidas de rendimiento para un programa:


Examínese

Medición Un equipo el equipo B

cómputo de instrucciones 10 mil millones 8 mil millones

Velocidad de reloj 4 GHz 4 GHz

IPC 1.0 1.1

a. ¿Qué equipo tiene la más alta calificación MIPS?

segundo. ¿Qué equipo es más rápido?


52 Capítulo 1 abstracciones y Tecnología de Computadores

1.11 Observaciones finales

Dónde ... la ENIAC está Aunque es difícil predecir exactamente qué nivel de costo / rendimiento ordenadores tendrán en el futuro, es
equipado con una apuesta segura que van a ser mucho mejores de lo que son hoy. Para participar en estos avances, los
18.000 tubos de vacío y pesa 30 diseñadores y programadores informáticos deben comprender una amplia variedad de temas.
toneladas, las computadoras en
el futuro pueden tener 1.000 Ambos diseñadores de hardware y software construyen sistemas informáticos en capas jerárquicas, con los
tubos de vacío y tal vez pesan detalles de cada capa de ocultación más bajas desde el nivel anterior. Esta gran idea de abstracción es fundamental
tan sólo 1 ½ toneladas. para la comprensión de los sistemas informáticos de hoy en día, pero eso no quiere decir que los diseñadores
pueden limitarse a saber una sola abstracción. Quizás el ejemplo más importante de la abstracción es la interfaz
entre el hardware y software de bajo nivel, llamada set de instrucciones arquitectura. El mantenimiento de la
Popular Mechanics, arquitectura del conjunto de instrucciones como una constante permite muchas implementaciones de esta
de marzo de 1949
arquitectura, presumiblemente varían en costo y rendimiento para ejecutar el software idénticos. En el lado negativo,
la arquitectura puede impedir la introducción de innovaciones que requieren la interfaz para cambiar.

Hay un método fiable para determinar e informar el rendimiento mediante el uso de los tiempos de ejecución de los
programas reales como la métrica. Este tiempo de ejecución está relacionada con otras mediciones importantes que
podemos hacer por la siguiente ecuación:

Programa Programa ciclos de reloj de SSeconds

segundos instrucciones instrucciones ciclo de reloj

Vamos a utilizar esta ecuación y sus factores constitutivos muchas veces. Sin embargo, recuerde que
individualmente los factores no determinan el rendimiento: sólo el producto, que es igual al tiempo de
ejecución, es una medida fiable del rendimiento.

El tiempo de ejecución es la única medida válida y irreprochable de rendimiento. Muchas


otras métricas se han propuesto y hallado falto. A veces, estas métricas son defectuosos
los GRANDE desde el principio al no refleja el tiempo de ejecución; otras veces una métrica que es el

Imagen sonido en un contexto limitado se extiende y se utiliza más allá de ese contexto o sin la
aclaración adicional necesario para que sea válida.
1.11 Observaciones finales 53

La tecnología de hardware clave para los procesadores modernos es el silicio. De igual importancia para la

comprensión de la tecnología de circuitos integrados es una comprensión de las tasas esperadas de los cambios

tecnológicos, como predice La Ley de Moore. Mientras que los combustibles de silicio el rápido avance de hardware, nuevas

ideas en la organización de los ordenadores han mejorado relación precio / rendimiento. Dos de las ideas claves están

explotando el paralelismo en el programa, normalmente hoy a través de múltiples procesadores, y la explotación de la

localidad de accesos a una jerarquía de memoria, típicamente a través de caches.

La eficiencia energética ha reemplazado área del troquel como el recurso más crítico del diseño de
microprocesadores. Ahorro de energía de al tratar de aumentar el rendimiento ha obligado a la industria de
hardware para cambiar a los microprocesadores multinúcleo, lo que requiere la industria del software para cambiar
al hardware de la programación paralela.
Paralelismo Ahora se requiere para el funcionamiento.
diseños de computadoras siempre han sido medidos por el costo y el rendimiento, así como otros factores
importantes como la energía, la fiabilidad, coste de propiedad y la escalabilidad. Aunque este capítulo se ha
centrado en el precio, el rendimiento y la energía, los mejores diseños serán lograr un equilibrio adecuado para un
mercado determinado entre todos los factores.

Hoja de Ruta para este libro

Al final de estas abstracciones es los cinco componentes clásicos de un ordenador: camino de datos, control, la
memoria, de entrada y de salida (consulte Figura 1.5 ). Estos cinco componentes también sirven como marco
para el resto de los capítulos de este libro:

■ Ruta de datos: Capítulo 3 , Capítulo 4 , Capítulo 6 y apéndice B

■ Controlar: Capítulo 4 , Capítulo 6 y apéndice B

■ Memoria: Capítulo 5

■ Entrada: Los capítulos 5 y 6

■ Salida: Capítulos 5 y 6 Como se mencionó anteriormente, Capítulo 4 describe cómo los procesadores de explotar el

paralelismo implícito,

Capítulo 6 describe los microprocesadores multinúcleo explícitamente paralelas que están en el corazón de la
revolución paralelo, y apéndice B describe el chip procesador de gráficos altamente paralelo. Capítulo 5 describe
cómo una jerarquía de memoria explota localidad. Capitulo 2 describe conjuntos de instrucciones, la interfaz entre los
compiladores y el ordenador y pone de relieve el papel de los compiladores y lenguajes de programación en el uso de
las características del conjunto de instrucciones. Capítulo 3 describe cómo las computadoras manejan los datos
aritméticos. Apéndice A introduce la lógica de diseño.
54 Capítulo 1 abstracciones y Tecnología de Computadores

1.12 Perspectiva histórica y más


1.12
Leyendo

Un campo activo de la ciencia es Para cada capítulo en el texto, una sección dedicada a una perspectiva histórica se puede encontrar en línea en
como un inmenso hormiguero; el un sitio que acompaña a este libro. Podemos seguir el desarrollo de una idea a través de una serie de
individuo casi desaparece en la ordenadores o describir algunos proyectos importantes, y proporcionar referencias en caso de estar interesado en
masa de las mentes que caen sondear aún más.
una sobre otra información, la La perspectiva histórica de este capítulo proporciona un fondo para algunas de las ideas clave que se
realización de un lugar a otro, presentan en este capítulo inicial. Su propósito es dar a la historia humana detrás de los avances tecnológicos
pasando a su alrededor a la y colocar logros en su contexto histórico. Al estudiar el pasado, usted puede ser capaz de entender mejor las
velocidad de la luz. fuerzas que darán forma a la computación en el futuro. Cada sección Perspectiva Histórica termina en línea
con las sugerencias para la lectura adicional, que también se recogen por separado en línea bajo la sección “ Otras
lecturas . " El resto de
sección 1.12 se encuentra en línea.
Lewis Thomas, “Ciencias
Naturales”, en La vida de una
célula, 1974

1.13 Ceremonias

Las calificaciones de tiempo relativo de ejercicios se muestran en corchetes después de cada serie de ejercicios. En
promedio, un ejercicio de clasificación [10] le llevará dos veces más que uno clasificado [5]. Las secciones del texto
que debe ser leído antes de intentar un ejercicio se indica entre paréntesis angulares; por ejemplo, <§1.4> significa
que debe haber leído la Sección 1.4, bajo las mantas para ayudar a resolver este ejercicio.

1.1 [ 2] <§1.1> Aparte de los teléfonos celulares inteligentes utilizadas por mil millones de personas, enumerar y describir otros
cuatro tipos de computadoras.

1.2 [ 5] <§1.2> Los ocho grandes ideas en la arquitectura de computadores son similares a las ideas de otros campos.
Coinciden con los ocho ideas de la arquitectura de computadores, “Diseño de la Ley de Moore”, “Uso de abstracción para
simplificar el diseño”, “Hacer el caso común Rápido”, “Rendimiento a través de paralelismo”, “Rendimiento a través de
tuberias de diferentes tipos”, “Rendimiento a través de Predicción”, “ jerarquía de memorias,”y‘fiabilidad a través de la
redundancia’para las siguientes ideas de otros campos:

a. líneas de montaje en la fabricación de automóviles

segundo. cables de puente colgante

do. Aviones y sistemas de navegación marítima que incorporan información sobre el viento

re. ascensores expresos en los edificios


1.12 perspectiva histórica y lectura adicional 54.e1

Un campo activo de la ciencia es


como un inmenso hormiguero; el
1.12 Perspectiva histórica y más individuo casi desaparece en la
masa de las mentes que caen
Leyendo
una sobre otra información, la
realización de un lugar a otro,
Para cada capítulo en el texto, una sección dedicada a una perspectiva histórica se puede encontrar en línea. pasando a su alrededor a la
Podemos seguir el desarrollo de una idea a través de una serie de máquinas o describir algunos proyectos velocidad de la luz.
importantes, y proporcionar referencias en caso de estar interesado en sondear aún más.

La perspectiva histórica de este capítulo proporciona un fondo para algunas de las ideas clave que se
presentan en el mismo. Su propósito es dar a la historia humana detrás de los avances tecnológicos y colocar Lewis Thomas, “Ciencias
logros en su contexto histórico. Al aprender del pasado, puede estar en mejores condiciones de comprender Naturales”, en La vida de una
las fuerzas que darán forma a la computación en el futuro. Cada sección de perspectiva histórica termina con célula, 1974
sugerencias para la lectura adicional, que también se recogen por separado en la sección en línea “Lectura
adicional”.

Los primeros ordenadores electrónicos

John Presper Eckert y John Mauchly en la Escuela Moore de la Universidad de Pennsylvania construyeron lo que es
ampliamente aceptado ser el primero, ordenador de propósito general electrónica operativo del mundo. Esta máquina,
llamada ENIAC ( Integrador numérico electrónico y calculadora), fue financiado por el Ejército de los Estados Unidos y
comenzó a trabajar durante la Segunda Guerra Mundial, pero no se dio a conocer públicamente hasta 1946. ENIAC era
una máquina de propósito general que se utiliza para calcular las tablas de artillería de la cocción.

Figura e1.12.1 muestra el ordenador en forma de U, que era de 80 pies de largo por 8.5 pies

FIGURA e1.12.1 ENIAC, la primera computadora electrónica de propósito general del mundo.
54.e2 1.12 perspectiva histórica y lectura adicional

de altura y varios pies de ancho. Cada uno de los 20 registros de 10 dígitos fue de 2 pies de largo. En total, ENIAC utiliza
18.000 tubos de vacío.
En cuanto a tamaño, ENIAC era dos órdenes de magnitud más grandes que las máquinas construidas hoy en día, sin
embargo, era más de ocho órdenes de magnitud más lento, realizando 1900 sumas por segundo. ENIAC proporciona
saltos condicionales y era programable, distinguiendo claramente de calculadoras anteriores. La programación se realiza
de forma manual al conectar los cables y el establecimiento de los interruptores, y se introducen los datos en tarjetas
perforadas. Programación para los cálculos necesarios habitualmente desde media hora a un día entero. ENIAC era una
máquina de propósito general, limitada principalmente por una pequeña cantidad de almacenamiento y programación
tedioso.

En 1944, John von Neumann se sintió atraído por el proyecto ENIAC. El grupo quería mejorar la forma
en que se introducen los programas y discutido almacenar programas como números; Von Neumann ayudó
a cristalizar las ideas y escribió un memorándum proponiendo una computadora con programa almacenado
llamado EDVAC ( Variable discreta electrónica computadora automática). Herman Goldstine distribuye la nota
y poner el nombre de von Neumann en él, para gran consternación de Eckert y Mauchly, cuyos nombres
fueron omitidos. Esta nota se ha servido de base para el término comúnmente utilizado equipo de von
Neumann. Varios pioneros en el campo de la informática creen que este término da demasiado crédito a von
Neumann, que escribió las ideas, y demasiado poco a los ingenieros, Eckert y Mauchly, que trabajaban en
las máquinas. Por esta razón, el término no aparece en otras partes de este libro o en las secciones en línea.

En 1946, Maurice Wilkes, de la Universidad de Cambridge visitó la Escuela Moore para asistir a la última parte de
una serie de conferencias sobre la evolución de los ordenadores electrónicos. Cuando regresó a Cambridge, Wilkes
decidió embarcarse en un proyecto para construir una computadora con programa almacenado llamado EDSAC ( Almacenamiento
de retardo calculadora electrónica automática). EDSAC comenzó a trabajar en 1949 y fue la primera a gran escala del
mundo, operacional, almacenado-programa informático [ Wilkes, 1985 ]. (Un pequeño prototipo llamado la Marca-I,
construido en la Universidad de Manchester en 1948, que podría llamarse la primera máquina programable con memoria
operativa.) Sección 2.5 en el Capítulo 2 explica el concepto de programa almacenado.

En 1947, Eckert y Mauchly solicitó una patente en los equipos electrónicos. El decano de la Escuela
Moore exigió que la patente sea entregado a la universidad, lo que puede haber contribuido a Eckert y
Mauchly concluyen que deben salir. Su partida paralizó el proyecto EDVAC, lo que retrasa la finalización
hasta 1952.
Goldstine dejó para unirse a von Neumann en el Instituto de Estudios Avanzados (IAS) en Princeton en
1946. Junto con Arthur Burks, emitieron un informe basado en la nota escrita anteriormente [Burks y col., 1946].
El papel era increíble para el período; la lectura de hoy, nunca se imaginaría este documento de referencia fue
escrito hace más de 50 años, ya que analiza la mayor parte de los conceptos arquitectónicos visto en las
computadoras modernas. En este trabajo se llevó a la máquina de la NIC integrada por Julian Bigelow. Tenía
un total de 1024 palabras de 40 bits y era aproximadamente 10 veces más rápido que el ENIAC. El grupo
pensó en uso de la máquina, publicó una serie de informes,
1.12 perspectiva histórica y lectura adicional 54.e3

y animó a los visitantes. Estos informes y visitantes inspirado el desarrollo de una serie de nuevos
equipos.
Recientemente, ha habido una cierta controversia acerca de la obra de John Atanasoff, que construyó un
ordenador electrónico a pequeña escala a principios de 1940. Su máquina, diseñada en la Universidad Estatal de
Iowa, fue un ordenador de propósito especial que nunca fue completamente operativa. Mauchly visitó brevemente
Atanasoff antes de construir ENIAC. La presencia de la máquina Atanasoff, junto con los retrasos en la presentación
de las patentes ENIAC (el trabajo se clasificó y las patentes no podía ser presentada hasta después de la guerra) y la
distribución de papel EDVAC de von Neumann, se utilizan para romper la patente Eckert- Mauchly. A pesar de la
controversia sobre el papel aún continúa Atanasoff 's, Eckert y Mauchly se dan generalmente el crédito para la
construcción del primer trabajo, de propósito general, computadora electrónica [Stern, 1980].

Otro equipo pionero que merece el crédito era una máquina de propósito especial construido por
Konrad Zuse en Alemania a finales de 1930 y principios de 1940. Aunque Zuse tenía el diseño de un
ordenador programable listo, el gobierno alemán decidió no financiar investigaciones científicas que
tienen más de dos años debido a que los burócratas espera que la guerra sería ganada antes de dicho
plazo.
Al otro lado del Canal Inglés, durante los ordenadores electrónicos de propósito especial de la Segunda Guerra Mundial se
construyeron para descifrar los mensajes alemanes interceptados. Un equipo en Bletchley Park, incluyendo a Alan Turing,
construyó el Coloso en 1943. Las máquinas fueron mantenidos en secreto hasta 1970; después de la guerra, el grupo tuvo poco
impacto en los equipos británicos comerciales.

Aunque la labor de ENIAC fue adelante, Howard Aiken fue la construcción de un equipo electromecánico llamado
Mark-I en la Universidad de Harvard (un nombre que el Manchester adoptado más adelante por su máquina). Siguió el
Mark-I con una máquina de relé, el Mark-II, y un par de máquinas de tubo de vacío, el Mark-III y Mark-IV. En contraste
con las máquinas anteriores, como EDSAC, que utilizan una sola memoria para las instrucciones y datos, el Mark-III y
Mark-IV tenían memorias separadas para instrucciones y datos. Las máquinas fueron considerados como reaccionaria
por los defensores de los ordenadores de programa almacenado; el termino

arquitectura Harvard fue acuñado para describir las máquinas con memorias distintas. Pagar respecto a la historia, este
término se utiliza hoy en día en un sentido diferente para describir las máquinas con una sola memoria principal pero con
cachés separadas para instrucciones y datos.
El proyecto se inició torbellino en el MIT en 1947 y estaba dirigido a aplicaciones en el procesamiento de señales de
radar en tiempo real. A pesar de que dio lugar a varias invenciones, su innovación más importante fue la memoria de
núcleos magnéticos. Torbellino tenía 2048 palabras de 16 bits de núcleo magnético. núcleos magnéticos sirvió como la
principal tecnología de memoria durante casi 30 años.

La evolución del mercado


En diciembre de 1947, Eckert y Mauchly formaron Eckert-Mauchly Computer Corporation. Su primera
máquina, el BINAC, fue construido por Northrop y se mostró en agosto de 1949. Después de algunas
dificultades financieras, su firma fue adquirida por Remington-Rand, donde se construyó el UNIVAC
(Universal Automatic
54.e4 1.12 perspectiva histórica y lectura adicional

Computadora), diseñado para ser vendido como un ordenador de propósito general ( Figura e1.12.2 ). entregado
originalmente en junio de 1951, UNIVAC vende por alrededor de $ 1 millón y fue el primer éxito de la
computadora-48 sistemas comerciales se construyeron! Esta máquina temprana, junto con muchas otras piezas
fascinantes de la ciencia informática, puede verse en el Computer History Museum en Mountain View, California.

FIGURA e1.12.2 UNIVAC I, el primer ordenador comercial en los Estados Unidos. Se predijo correctamente el resultado de la elección
presidencial de 1952, pero su pronóstico inicial fue retenido de difusión porque los expertos pusieron en duda el uso de tales resultados
tempranos.

IBM había estado en el negocio de tarjetas y de automatización de oficinas perforada, pero no empezar a construir
computadoras hasta 1950. El primer ordenador de IBM, la IBM 701, enviado en 1952, y, finalmente, se vendieron 19
unidades. A principios de la década de 1950, muchas personas se mostraron pesimistas sobre el futuro de los ordenadores,
en la creencia de que el mercado y las oportunidades de estas máquinas “altamente especializados” eran bastante
limitadas.
En 1964, después de invertir $ 5 mil millones, IBM hizo un movimiento audaz con el anuncio del System /
360. Un portavoz de IBM, dijo lo siguiente en el tiempo:

No estamos en absoluto humilde de este anuncio. Este es el anuncio de producto más importante que esta
corporación ha hecho nunca en su historia. No es un ordenador en cualquier sentido anterior. No es un producto,
sino una línea de productos ... que se extiende en el rendimiento de la parte baja de la línea de computadoras a la
muy alta.
1.12 perspectiva histórica y lectura adicional 54.e5

FIGURA e1.12.3 IBM System / 360 ordenadores: los modelos 40, 50, 65, y 75 fueron introducidos en 1964. Estos cuatro modelos variaban en coste y rendimiento en un factor de casi 10;
crece a 25 si se incluyen los modelos 20 y 30 (no se muestra). La velocidad del reloj, la gama de tamaños de memoria, y el precio aproximado para sólo el procesador y la memoria de tamaño
medio de: (a) modelo 40, 1,6 MHz, 32 KB-256 KB, $ 225,000; (B) Modelo de 50, 2,0 MHz, 128 KB-256 KB, $ 550,000; (C) Modelo de 65, 5,0 MHz, 256 KB-1 MB, $ 1,200,000; y (d) modelo 75,
5.1 MHz, 256 KB-1 MB, $ 1,900,000. Adición de dispositivos I / O típicamente aumentado el precio por factores de 1/8 a 3/5, con factores más altos para los modelos más baratos.

Traslado de la idea de la arquitectura abstracción en una realidad comercial, IBM anunció seis implementaciones
de la arquitectura 360 / Sistema que variaban en precio y rendimiento en un factor de 25. Figura e1.12.3 muestra
cuatro de estos modelos. IBM apuesta de su empresa en el éxito de una familia de ordenadores, e IBM ganó. El
System / 360 y sus sucesores dominaron el mercado de las computadoras de gran tamaño.

Alrededor de un año después, Digital Equipment Corporation ( DEC) dio a conocer el PDP-8, el primer
comercial miniordenador. Esta pequeña máquina fue un gran avance en el diseño de bajo costo, lo que permite
DEC para ofrecer un ordenador por menos de $ 20.000. Miniordenadores fueron los precursores de los
microprocesadores, con Intel la invención del primer microprocesador en 1971-el Intel 4004.
54.e6 1.12 perspectiva histórica y lectura adicional

En 1963 llegó el anuncio de la primera supercomputadora. Este anuncio se produjo ni de las


grandes empresas ni siquiera de los centros de alta tecnología. Seymour Cray dirigió el diseño de la
Control Data Corporation CDC 6600 en Minnesota. Esta máquina incluye muchas ideas que están
empezando a ser encontrados en los últimos microprocesadores. Cray tarde dejó CDC para formar
Cray Research, Inc., en Wisconsin. En 1976, se anunció el Cray-1 ( Figura e1.12.4 ). Esta máquina era a
la vez el más rápido del mundo, el más caro, y el equipo con la mejor relación costo / rendimiento para
los programas científicos.

FIGURA e1.12.4 Cray-1, el primer superordenador vector comercial, anunciada en 1976.


Esta máquina tenía la distinción inusual de ser tanto el ordenador más rápido para aplicaciones científicas y el equipo con la mejor relación precio /
rendimiento para estas aplicaciones. Visto desde la parte superior, el ordenador parece a la letra DO. Seymour Cray falleció en 1996 a causa de las
lesiones sufridas en un accidente automovilístico. En el momento de su muerte, este 70 años de edad, pionero de la informática estaba trabajando
en su visión de la próxima generación de superordenadores. ( Ver www.cray.com para más detalles.)

Mientras Seymour Cray fue la creación de equipo más caro del mundo, otros diseñadores de todo el
mundo estaban mirando usando el microprocesador para crear un equipo tan barato que usted podría tener en
casa. No existe una única fuente principal para la computadora personal, pero en 1977, el de Apple IIe ( Figura
e1.12.5 ) De Steve Jobs y Steve Wozniak establecer normas para el bajo costo, alto volumen y alta fiabilidad
que define la industria de los ordenadores personales.
1.12 perspectiva histórica y lectura adicional 54.e7

FIGURA e1.12.5 Apple IIe Plus. Diseñado por Steve Wozniak, Apple IIe establece normas de coste y fiabilidad para la
industria.

Sin embargo, incluso con una ventaja de 4 años, los ordenadores personales de Apple terminó en segundo
lugar en popularidad. El IBM Personal Computer, anunciada en 1981, se convirtió en el equipo más vendido de
cualquier tipo; su éxito dio el microprocesador Intel más popular y Microsoft el sistema operativo más popular. Hoy
en día, el CD más popular es el sistema operativo de Microsoft, a pesar de que cuesta muchas veces más que un
CD de música! Por supuesto, durante los más de 30 años que el ordenador personal compatible con IBM ha
existido, ha evolucionado mucho. De hecho, los primeros ordenadores personales tenían procesadores de 16 bits y
64 kilobytes de memoria, y una baja densidad, disquete lento fue el único de almacenamiento no volátil! disquetes
fueron desarrollados originalmente por IBM para la carga de los programas de diagnóstico en ordenadores
centrales, pero eran un dispositivo importante de E / S en equipos personales de casi 20 años antes de la llegada
de los CD y en instalación de redes obsoletas como un método para el intercambio de datos.

Por supuesto, los microprocesadores de Intel también han evolucionado desde la primera PC, que utiliza un procesador
de 16 bits con una interfaz externa de 8 bits! En el capítulo 2, escribimos acerca de la evolución de la arquitectura Intel.

Los primeros ordenadores personales eran bastante simples, con los sistemas operativos primitivos poca o
ninguna capacidad de gráficos, no hay dispositivos señaladores, y en comparación con las de hoy. El equipo
que inspiró muchos de los conceptos de arquitectura y software que caracterizan a las máquinas de escritorio
modernos fue el Xerox Alto, se muestra en la Figura e1.12.6 . El Alto fue creado como un prototipo experimental
de un ordenador futuro; hubo varios cientos de Altos construido, incluyendo una significativa
54.e8 1.12 perspectiva histórica y lectura adicional

FIGURA e1.12.6 El Xerox Alto fue la inspiración principal para el equipo de escritorio moderno. Se incluyó un ratón, un
esquema de mapa de bits, una interfaz de usuario basada en Windows, y una conexión de red local.

número que fueron donados a las universidades. Entre las tecnologías incorporadas en el Alto fueron los siguientes:

■ una pantalla de gráficos de mapa de bits integrado con un ordenador (pantallas gráficas anteriores actuó como
terminales, por lo general conectados a las computadoras más grandes)

■ un ratón, que fue inventado anteriormente, pero incluye en cada Alto y se utiliza ampliamente en la
interfaz de usuario

■ una red de área local (LAN), que se convirtió en el precursor de la Ethernet

■ una interfaz de usuario basada en Windows y con un WYSIWYG (lo que ves es lo que obtienes)
editor y programas de dibujo interactivas
1.12 perspectiva histórica y lectura adicional 54.e9

Además, tanto los servidores de archivos y servidores de impresión se desarrollaron y se interconectan a


través de la red de área local, y las conexiones entre la red de área local y la amplia zona de ARPAnet
produjeron las primeras versiones de las redes al estilo de Internet. El Xerox Alto era muy influyente y
claramente afectado el diseño de una amplia variedad de ordenadores y sistemas de software, incluyendo el
Apple Macintosh, el PC compatible con IBM, MacOS y Windows, y el Sol y otras estaciones de trabajo
tempranos.

Medición de desempeño
Desde los primeros días de la computación, los diseñadores han determinado el rendimiento goals- ENIAC era
ser 1000 veces más rápido que el Harvard Mark-I y el IBM Stretch (7030) iba a ser 100 veces más rápido que el
ordenador más rápido que existían entonces. Lo que no estaba claro, sin embargo, fue cómo esta actuación fue
a medir.
La medida de rendimiento inicial fue el tiempo requerido para realizar una operación individual, tal como la
adición. Como la mayoría de las instrucciones tomaron el mismo tiempo de ejecución, el momento de uno era el
mismo que los demás. Como los tiempos de ejecución de instrucciones en un ordenador se hicieron más diversa,
sin embargo, el tiempo requerido para una operación ya no era útil para hacer comparaciones.

Para tener en cuenta estas diferencias, una mezcla de instrucciones se calculó mediante la medición de la
frecuencia relativa de instrucciones en un ordenador a través de muchos programas. Multiplicando el tiempo para
cada instrucción por su peso en la mezcla dio al usuario la
tiempo medio de ejecución de instrucciones. ( Si se mide en ciclos de reloj, el tiempo medio de ejecución de instrucciones es el
mismo que el IPC promedio.) Puesto que los conjuntos de instrucciones fueron similares, esta fue una comparación más
precisa que añadir veces. De promedio de tiempo de ejecución de instrucciones, entonces, era sólo un pequeño paso para
MIPS. MIPS tenía la virtud de ser fácil de entender; Por lo tanto, creció en popularidad.

La búsqueda de un programa de media


A medida que los procesadores son cada vez más sofisticados y se basó en las jerarquías de memoria (el tema
del capítulo 5) y la canalización (el tema del capítulo 4), un tiempo de ejecución de cada instrucción ya no
existía; ni el tiempo ni la ejecución de MIPS, por lo tanto, podrían calcularse a partir de la mezcla de
instrucciones y el manual.
Aunque pueda parecer obvio hoy que lo que hay que hacer habría sido el desarrollo de un conjunto de aplicaciones reales
que podrían ser utilizados como puntos de referencia estándar, esta era una tarea difícil hasta tiempos relativamente
recientes. Las variaciones en los sistemas operativos y los estándares del lenguaje hacen que sea difícil para crear grandes
programas que podrían ser trasladados de un ordenador a otro, simplemente volviendo a compilar.

En su lugar, el siguiente paso fue la evaluación comparativa utilizando los programas sintéticos. El programa de
la piedra de afilar sintética fue creada mediante la medición de los programas científicos escritos en Algol-60 (véase
Curnow y Wichmann de [1976] descripción). Esta
54.e10 1.12 perspectiva histórica y lectura adicional

programa se convirtió en Fortran y fue ampliamente utilizado para caracterizar el desempeño del programa
científico. rendimiento de la piedra de afilar es típicamente citado en las piedras de afilar por segundo, el número de
ejecuciones de una única iteración de la piedra de afilar de referencia! Dhrystone es otro punto de referencia
sintética que todavía se utiliza en algunos círculos informáticos incorporados (véase [1984] descripción y
metodología de Weicker).
Casi al mismo tiempo se desarrolló la piedra de afilar, el concepto de los puntos de referencia del kernel
ganó popularidad. Granos son pequeñas piezas, que requieren mucho tiempo de los programas reales que se
extraen y luego se utilizan como puntos de referencia. Este enfoque fue desarrollado principalmente para la
evaluación comparativa de los ordenadores de gama alta, especialmente los superordenadores. Livermore Loops y
Linpack son los ejemplos más conocidos. Los bucles Livermore consisten de una serie de 21 pequeños fragmentos
de bucle. Linpack consiste en una parte de un paquete de álgebra subrutina lineal. Los granos son los más
utilizados para aislar el rendimiento de las funciones individuales de un ordenador y para explicar las razones de las
diferencias en el rendimiento de los programas reales. Dado que las aplicaciones científicas suelen utilizar pequeñas
piezas de código que se ejecutan durante mucho tiempo, que caracteriza el rendimiento con los núcleos es más
popular en esta clase de aplicación. Aunque los núcleos ayudan a iluminar el rendimiento,

Especular sobre Rendimiento


Un avance importante en la evaluación del rendimiento fue la formación del grupo Sistema de Evaluación del
Desempeño Cooperativa (SPEC) en 1988. SPEC comprende representantes de muchas empresas informáticas,
siendo los fundadores Apollo / Hewlett-Packard, DEC, MIPS, y Sun-que han acordado un conjunto de programas
y entradas reales que todos se ejecutarán. Vale la pena señalar que SPEC no podría haber llegado a ser antes de
los sistemas operativos portátiles y la popularidad de los lenguajes de alto nivel. Ahora compiladores, también, se
aceptan como una parte apropiada del rendimiento de los sistemas informáticos y deben ser medidos en cualquier
evaluación.

La historia nos enseña que, si bien el esfuerzo SPEC puede ser útil con los ordenadores
actuales, no va a satisfacer las necesidades de la próxima generación sin cambiar. En 1991, se
añadió una medida de rendimiento, basado en la ejecución de varias versiones de la referencia.
Es más útil para evaluar el uso de timeshared de un solo procesador o un multiprocesador.
También se han añadido otros puntos de referencia del sistema que incluyen actividades de E / S
intensivas-OS intensiva y I. Otro cambio fue la decisión de retirar algunos puntos de referencia y
añadir otros. Un resultado de la dificultad de encontrar los puntos de referencia fue que la versión
inicial de los puntos de referencia SPEC (llamados SPEC89) contenía seis puntos de referencia
de punto flotante pero sólo cuatro puntos de referencia enteros.
1.12 perspectiva histórica y lectura adicional 54.e11

En 1992, se introdujo un nuevo conjunto de referencia (llamada SPEC92). Se incorpora puntos de


referencia adicionales, dejó caer matrix300, y proporciona medios separados (SPEC INT y SPECfp) para
programas enteros y de coma flotante. Además, la medida SPECbase, que no permite parámetros de
optimización específicas del programa, se añadió a proporcionar a los usuarios una medición de los resultados
que se asemejan más a lo que podrían experimentar en sus propios programas. Los números SPECfp
muestran el mayor aumento en comparación con la base de medida SPECfp, que varía típicamente de 15% a
30% más alto.

En 1995, el conjunto de referencia se actualiza una vez más, la adición de algunos nuevos puntos de referencia
enteros y de coma flotante, así como la eliminación de algunos puntos de referencia que sufrían de defectos o habían
tiempos de funcionamiento que se habían vuelto demasiado pequeño dado el factor de 20 o más de mejora del
rendimiento ya la primera versión SPEC. SPEC95 también cambió el equipo de base para la normalización a una estación
Sun SPARC 10/40, ya que las versiones de funcionamiento del equipo de base original se hacía difícil de encontrar!

La versión más reciente de SPEC es SPEC2006. Tal vez lo más sorprendente es que todos los
programas de punto flotante en SPEC2006 son nuevos, y para programas enteros sólo dos son de
SPEC2000, uno de SPEC95, ninguno de SPEC92, y uno de SPEC89. El único superviviente de SPEC89 es
el compilador gcc.
SPEC también ha añadido conjuntos de herramientas más allá de las suites originales dirigidos a rendimiento de la CPU.
En 2008, SPEC proporciona conjuntos de referencia para los gráficos, de alto rendimiento de computación científica,
computación orientada a objetos, sistemas de archivos, servidores web y clientes, Java, aplicaciones de ingeniería CAD, y de
alimentación.

El crecimiento de Embedded Computing


procesadores embebidos han existido desde hace mucho tiempo; de hecho, los primeros miniordenadores y los
primeros microprocesadores fueron desarrollados originalmente para controlar las funciones en un laboratorio o
aplicación industrial. Durante muchos años, el uso dominante de procesadores embebidos fue para aplicaciones
de control industrial, y aunque este uso continuado creciendo, los procesadores tendía a ser muy barato y el
rendimiento relativamente bajo. Por ejemplo, el procesador de mayor venta en el mundo sigue siendo un
microcontrolador de 8 bits utilizado en automóviles, algunos electrodomésticos, y otras aplicaciones sencillas.

La década de 1980 y principios de 1990 vio el surgimiento de nuevas oportunidades para los
procesadores embebidos, que van desde los videojuegos más avanzados y decodificadores a los teléfonos
celulares y asistentes digitales personales. El número cada vez mayor de dispositivos de información y el
crecimiento de las redes han impulsado oleadas dramáticos en el número de procesadores integrados, así
como los requisitos de rendimiento. Para evaluar el rendimiento, la comunidad incrustado se inspiró en SPEC
para crear el Embedded Consortium Benchmark microprocesador (EEMBC). Inició en

1997, que consta de una colección de núcleos organizados en suites que se ocupan de diferentes porciones de
la industria incrustado. Se anunció la segunda generación de estos puntos de referencia en 2007.
54.e12 1.12 perspectiva histórica y lectura adicional

Medio Siglo de Progreso


Desde 1951, ha habido miles de nuevos equipos que utilizan una amplia gama de tecnologías y que tienen
capacidades muy variables. Figura e1.12.7 resume las principales características de algunas máquinas
mencionadas en esta sección y muestra los dramáticos cambios que han ocurrido en poco más de 50
años. Después de ajustar por la inflación, el precio / rendimiento ha mejorado en casi 100 mil millones en 55
años, o alrededor de 58% por año. Otra manera de decirlo es que hemos visto un factor de

10.000 mejora en el costo y en un factor de 10 millones mejora en el rendimiento.

Ajustado
Precio / Precio precio /
Tamaño De energía Rendimiento Memoria rendimiento vs. ajustado rendimiento vs.
Año Nombre (cu. Ft.) (vatios) (añade / seg) (KB) Precio UNIVAC (2.007 $) UNIVAC

1951 UNIVAC 1000 125000 2000 48 $ 1.000.000 de 0,000,00 1 $ 7,670724 millones 00,000,00 1

1964 IBM S / 360 60 10000 500.000 64 $ 1.000.000 de 0000, 263 $ 6018.798 mil 00.000, 319
modelo 50

1965 PDP-8 8 500 330.000 4 0,0 $ 16.000 0,0 10855 0,0 $ 94.685 00,0 13.367

1976 Cray-1 58 60000 166000000 32.000 $ 4,000,000 0,0 21.842 $ 13,509,798 00,0 47127

1981 PC de IBM 1 000, 150 240.000 256 0,00 $ 3.000 0,0 42105 0,00 $ 6,859 00, 134208

1991 HP 9000 / 2 000, 500 50000000 16384 0,00 $ 7.400 3556188 0,00 $ 11,807 16241889
modelo 750

1996 Intel Ppro 2 000, 500 400000000 16384 0,00 $ 4.400 47846890 0,00 $ 6,211 247021234
PC (200 MHz)

2003 Intel Pentium 4 2 500 6000000000 262144 $ 1.600 1875000000 $ 2,009 11451750000
PC (3,0 GHz)

2007 AMD de Barcelona 2 250 20000000000 2097152 $ 800 12500000000 $ 800 95884051042
PC (2,5 GHz)

FIGURA e1.12.7 Características de los ordenadores comerciales clave desde 1950, en dólares reales y en dólares de 2007 ajustados por la inflación. La última fila asume que
podemos aprovechar plenamente el potencial de rendimiento de los cuatro núcleos en Barcelona. En contraste con
Figura e1.12.3 , Aquí el precio de la IBM S / 360 modelo 50 incluye dispositivos de E / S. ( Fuente: El Museo y el Índice de Precios historia de la computadora para los productos industriales).

Los lectores interesados ​en la historia de la computadora deben consultar Anales de la Historia de la computación, una
revista dedicada a la historia de la informática. También han aparecido varios libros que describen los primeros días
de la computación, muchos de ellos escritos por los pioneros incluidos Goldstine [1972] , Metropolis et al. [1980] y Wilkes
[1985] .
1.12 perspectiva histórica y lectura adicional 54.e13

Otras lecturas

Barroso, L. y U. Hölze [2007]. “El caso para la informática de energía proporcional”, IEEE Computer Diciembre.

Un motivo para cambiar la naturaleza de los componentes del ordenador para que utilicen mucha menos energía cuando se utiliza la ligera.

Bell, CG [1996]. Los pioneros de ordenador y Pioneer Computers, ACM y el Museo de ordenador, cintas de vídeo.

Dos cintas de vídeo sobre la historia de la informática, producidas por Gordon y Gwen Bell, incluyendo las siguientes máquinas y sus
inventores: Harvard Mark I, ENIAC, EDSAC, máquina de la NIC, y muchos otros.

Burks, AW, HH Goldstine, y J. von Neumann [1946]. “Discusión preliminar del diseño lógico de un instrumento de cálculo electrónico,”
Informe al departamento de la artillería del Ejército de EE.UU., p. 1; también aparece en Papeles de John von Neumann, W. y A.
Aspray Burks (Eds.), MIT Press, Cambridge, MA, y Tomash Editores, Los Ángeles, 1987, 97-146.

Un hardware clásico artículo explicando y software antes de la primera computadora de programa almacenado se construyó. Citamos ampliamente de
ella en el capítulo 3. Se explicó al mismo tiempo los ordenadores al mundo y era una fuente de controversia debido a que el primer borrador no dio
crédito a Eckert y Mauchly.

Campbell-Kelly, M. y W. Aspray [1996]. Ordenador: Una historia de la máquina de la Información, Basic Books, Nueva York.

Dos historiadores crónica de la historia dramática. El New York Times lo llama bien escrito y con autoridad.

Ceruzzi, PF [1998]. Una historia de la moderna informática, MIT Press, Cambridge, MA.

Contiene una buena descripción de la historia posterior de la informática: el circuito integrado y su impacto, los ordenadores personales, UNIX e
Internet.

Curnow, HJ y BA Wichmann [1976]. “Un punto de referencia sintético”, El ordenador J. 19 (1): 80.

Describe el primer test sintético importante, la piedra de afilar, y la forma en que fue creado.

Flemming, PJ y JJ Wallace [1986]. “¿Cómo no mentir con estadísticas: La forma correcta para resumir los resultados de referencia”, Comm.
ACM 29: 3 (marzo), 218-21.

Describe algunos de los principios que subyacen en el uso de diferentes medios para resumir los resultados de rendimiento.

Goldstine, HH [1972]. La computadora: De Pascal a von Neumann, Princeton University Press, Princeton, Nueva Jersey.

Una visión personal de la computación por uno de los pioneros que trabajaron con von Neumann.

Hayes, B. [2007]. “Computing en un universo paralelo”, American Scientist Vol. 95 (noviembre-diciembre): 476-480.

Una visión general del desafío computación paralela escrito para el profano.

Hennessy, JL y DA Patterson [2007]. Capítulo 1 de Arquitectura de Ordenadores: un enfoque cuantitativo,


cuarta edición, Morgan Kaufmann Publishers, San Francisco.

Sección 1.5 entra en más detalles sobre el poder, la Sección 1.6 contiene muchos más detalles sobre el coste de los circuitos integrados y explica las
razones de la diferencia entre el precio y el coste, y la Sección 1.8 da más detalles sobre la evaluación del desempeño.

Lampson, BW [1986]. “Personal computación distribuida; El software Alto y Ethernet.”En Conferencia ACM sobre la Historia de las
estaciones de trabajo personales (enero).
54.e14 1.12 perspectiva histórica y lectura adicional

Thacker, CR [1986]. “Personal computación distribuida: El Alto y hardware Ethernet,” En Conferencia ACM sobre la Historia de las
estaciones de trabajo personales (enero).

Estos dos documentos describen el software y el hardware del hito Alto.

Metropolis, N., J. Howlett, y G.-C. Rota (Eds.) [1980]. Una Historia de la computación en el siglo XX,
Academic Press, Nueva York.

Una colección de ensayos que describen las personas, software, computadoras y laboratorios implicados en los primeros ordenadores comerciales y
experimentales. La mayoría de los autores eran personalmente involucrado en los proyectos. Una excelente bibliografía de los primeros informes concluye
este interesante libro.

Public Broadcasting System [1992]. La máquina que cambió el mundo, cintas de vídeo.

Estos cinco programas de 1 hora incluyen imágenes raras y entrevistas con los pioneros de la industria informática.

Slater, R. [1987]. Retratos en silicio, MIT Press, Cambridge, MA.

biografías cortas de 31 pioneros de la informática.

Stern, N. [1980]. “¿Quién inventó la primera computadora electrónica digital?” Anales de la Historia de la Informática
2: 4 (Octubre), 375-76.

La perspectiva de un historiador sobre Atanasoff frente Eckert y Mauchly.

Weicker, RP [1984]. “Dhrystone: a sistemas sintéticos de programación de referencia”, Comunicaciones del ACM 27 (10): 1013-1030.

Descripción de un programa de evaluación comparativa sintético para sistemas de código.

Wilkes, MV [1985]. Memorias de un pionero de la informática, MIT Press, Cambridge, MA.

Una visión personal de la computación por uno de los pioneros.


1.13 Ejercicios 55

mi. mostrador de reserva de la biblioteca

F. El aumento del área de la puerta de un transistor CMOS para disminuir su tiempo de conmutación

sol. Adición de catapultas electromagnéticas de aeronaves (que son eléctricamente accionado en oposición a los
modelos actuales a vapor), permitidos por la generación de energía aumentado ofrecida por la nueva tecnología de
reactores

h. La construcción de automóviles auto-conducción cuyos sistemas de control parcialmente depender de los sistemas de sensores

existentes ya instalados en el vehículo de base, como los sistemas de salida de carril y sistemas de control de crucero inteligente

1.3 [ 2] <§1.3> Describir los pasos que transforman un programa escrito en un lenguaje de alto nivel tal como C en
una representación que se ejecuta directamente por un procesador de ordenador.

1.4 [ 2] <§1.4> Supongamos una pantalla a color utilizando 8 bits para cada uno de los colores primarios (rojo, verde, azul)
por píxel y un tamaño de trama de 1280 × 1024.

a. ¿Cuál es el tamaño mínimo en bytes del buffer de cuadro para almacenar un marco?

segundo. ¿Por cuánto tiempo se necesitaría, como mínimo, para la trama que se envía a través de un 100 Mbit / s de la red?

1,5 [ 4] <§ 1.6> Considere tres diferentes procesadores P1, P2, P3 y ejecutar el mismo conjunto de
instrucciones. P1 tiene una tasa de reloj de 3 GHz y un IPC de 1,5. P2 tiene una
frecuencia de reloj de 2,5 GHz y un IPC de 1,0. P3 tiene una velocidad de reloj de 4,0 GHz y tiene un IPC de 2,2.

a. ¿Qué procesador tiene el más alto rendimiento expresado en instrucciones por segundo?

segundo. Si los procesadores cada ejecutar un programa en 10 segundos, encontrar el número de ciclos y el número
de instrucciones.

do. Estamos tratando de reducir el tiempo de ejecución en un 30%, pero esto conduce a un aumento del 20% en el IPC. ¿Qué

velocidad de reloj deberíamos tener que conseguir esta reducción del tiempo?

1.6 [ 20] <§ 1.6> Considere dos implementaciones diferentes de la misma arquitectura del conjunto de
instrucciones. Las instrucciones se pueden dividir en cuatro clases según su CPI (clases A, B, C, y D). P1 con
una frecuencia de reloj de 2,5 GHz y los IPC de 1, 2,
3 y 3, y P2 con una frecuencia de reloj de 3 GHz y los IPC de 2, 2, 2 y 2. Dado un programa con un recuento de

instrucciones dinámica de 1.0E6 instrucciones dividida en clases de la siguiente manera: 10% de clase A, 20 % clase

B, 50% de clase C, y 20% de clase D, que es más rápido: P1 o P2?

a. ¿Qué es el IPC global para cada aplicación?

segundo. Encontrar los ciclos de reloj requeridos en ambos casos.


56 Capítulo 1 abstracciones y Tecnología de Computadores

1.7 [ 15] <> § 1.6 Los compiladores pueden tener un profundo impacto en el rendimiento de una aplicación. Supongamos
que para un programa, los resultados del compilador A en un recuento de instrucciones dinámica de 1.0E9 y tiene un
tiempo de ejecución de 1,1 s, mientras que el compilador B resulta un valor de instrucción dinámica de 1.2E9 y un tiempo
de ejecución de 1,5 s.

a. Encuentra el IPC promedio para cada programa dado que el procesador tiene un tiempo de ciclo de reloj de 1 ns.

segundo. Asumir los programas compilados se ejecutan en dos procesadores diferentes. Si los tiempos de ejecución de
los dos procesadores son los mismos, cuánto más rápido es el reloj del procesador que ejecuta código de compilador de A
frente al reloj del procesador que ejecuta código de compilador de B?

do. Un nuevo compilador es desarrollado que utiliza sólo 6.0E8 instrucciones y tiene un promedio de 1.1 IPC. ¿Cuál es la
aceleración de la utilización de este nuevo compilador frente a la utilización del compilador A o B en el procesador original?

1.8 El procesador Pentium 4 Prescott, lanzado en 2004, tenía una frecuencia de reloj de
3.6 GHz y la tensión de 1,25 V. Se supone que, en promedio, que consume 10 W de potencia estática y 90 W de
potencia dinámico.

El Ivy Bridge Core i5, lanzado en 2012, tiene una velocidad de reloj de 3,4 GHz y el voltaje de 0,9 V. Se supone
que, en promedio, se consumen 30 W de potencia estática y 40 W de potencia dinámica.

1.8.1 [ 5] <§1.7> Para cada procesador encontrar las cargas capacitivas promedio.

1.8.2 [ 5] <§1.7> Encuentre el porcentaje de la potencia total disipada compuesta por energía estática y la relación
de potencia estática para poder dinámico para cada tecnología.

1.8.3 [ 15] <§1.7> Si el total de energía se disipa a reducirse en un 10%, ¿cuánto se debe reducir la tensión
para mantener la misma corriente de fuga? Nota: potencia se define como el producto del voltaje y la
corriente.

1.9 Supongamos por aritmética, carga / almacenamiento, y las instrucciones de ramificación, un procesador tiene IPC de 1, 12
y 5, respectivamente. También suponer que en un solo procesador un programa requiere la ejecución de 2.56E9 instrucciones
aritméticas, instrucciones 1.28E9 carga / almacenamiento, y 256 millones de instrucciones de bifurcación. Supongamos que
cada procesador tiene una frecuencia de reloj de 2 GHz.

Supongamos que, como el programa se parallelized para funcionar sobre múltiples núcleos, el número de aritméticas y de carga /
almacenamiento de instrucciones por el procesador se divide por 0,7 × pag ( dónde
pag es el número de procesadores), pero el número de instrucciones de ramificación por procesador sigue siendo el mismo.

1.9.1 [ 5] <§1.7> Encuentre el tiempo total de ejecución de este programa en 1, 2, 4, y 8 procesadores, y mostrar el
aumento de velocidad relativa de la 2, 4, y 8 procesadores resultan en relación con el resultado solo procesador.
1.13 Ejercicios 57

1.9.2 [ 10] <§§1.6, 1.8> Si se duplicó el IPC de las instrucciones aritméticas, lo que podría ser el
impacto en el tiempo de ejecución del programa en 1, 2, 4 u 8 procesadores?

1.9.3 [ 10] <§§1.6, 1.8> ¿En qué caso de que el IPC de instrucciones de carga / tienda reducirse a fin de que un único
procesador para que coincida con el rendimiento de cuatro procesadores utilizando los valores del IPC originales?

1.10 Supongamos que una oblea de 15 cm de diámetro tiene un costo de 12, contiene 84 matrices, y tiene

0.020 defectos / cm 2. Supongamos que una oblea de 20 cm de diámetro tiene un costo de 15, contiene 100 troqueles, y tiene

0.031 defectos / cm 2.

1.10.1 [ 10] <§1.5> Encuentre el rendimiento tanto para obleas.

1.10.2 [ 5] <§1.5> Encuentre el costo por troquel para ambas obleas.

1.10.3 [ 5] <§1.5> Si el número de matrices por oblea se incrementa en 10% y los defectos unidad aumenta de superficie por
un 15%, encontrar el área de troquel y el rendimiento.

1.10.4 [ 5] <§1.5> Supongamos un proceso de fabricación mejora el rendimiento de 0,92 a


0.95. Encontrar los defectos por unidad de área para cada versión de la tecnología dada un área de matriz de 200 mm 2.

1.11 Los resultados de la prueba patrón bzip2 SPEC CPU2006 que se ejecuta en un procesador AMD Barcelona se encuentra en

un recuento de instrucciones de 2.389E12, un tiempo de ejecución de 750 s, y un tiempo de referencia de 9650 s.

1.11.1 [ 5] <§§1.6, 1.9> Encuentra el IPC si el tiempo de ciclo de reloj es 0.333 ns.

1.11.2 [ 5] <§1.9> Encuentre el SPECratio.

1.11.3 [ 5] <§§1.6, 1.9> Encuentra el aumento del tiempo de CPU si el número de instrucciones de que el
índice se incrementó en un 10% sin afectar el IPC.

1.11.4 [ 5] <§§1.6, 1.9> Encuentre el aumento en el tiempo de la CPU si el número de instrucciones del punto de
referencia se incrementa en 10% y el IPC se incrementa en 5%.

1.11.5 [ 5] <§§1.6, 1.9> Calcule el cambio de la SPECratio para este cambio.

1.11.6 [ 10] <§ 1.6> Supongamos que estamos desarrollando una nueva versión del procesador AMD Barcelona
con una frecuencia de reloj de 4 GHz. Hemos añadido algunas instrucciones adicionales para el conjunto de
instrucciones de tal manera que el número de instrucciones se ha reducido en un 15%. El tiempo de ejecución se
reduce a 700 s y el nuevo SPECratio es 13,7. Encontrar el nuevo IPC.

1.11.7 [ 10] <§ 1.6> Este valor CPI es mayor que el obtenido en 1.11.1 como la frecuencia de reloj se
incrementó de 3 GHz a 4 GHz. Determinar si el incremento del IPC es similar a la de la velocidad de reloj.
Si son diferentes, ¿por qué?

1.11.8 [ 5] <§ 1.6> Por cuánto se ha reducido el tiempo de CPU?


58 Capítulo 1 abstracciones y Tecnología de Computadores

1.11.9 [ 10] <§ 1.6> En un segundo punto de referencia, libquantum, asumen un tiempo de ejecución de 960
ns, CPI de 1,61, y tasa de reloj de 3 GHz. Si el tiempo de ejecución se reduce en un 10% adicional sin
afectar a la CPI y con una frecuencia de reloj de 4 GHz, determinar el número de instrucciones.

1.11.10 [ 10] <§ 1.6> Determinar la velocidad de reloj requerida para dar una reducción adicional del 10% en
tiempo de CPU mientras se mantiene el número de instrucciones y con la CPI sin cambios.

1.11.11 [ 10] <§ 1.6> Determinar la frecuencia de reloj si el IPC se reduce en un 15% y el tiempo de CPU en un 20%
mientras que el número de instrucciones no se modifica.

1.12 Sección 1.10 cita como una trampa de la utilización de un subconjunto de la ecuación de rendimiento como una
métrica de rendimiento. Para ilustrar esto, considere las siguientes dos procesadores. P1 tiene una frecuencia de reloj
de 4 GHz, CPI promedio de 0,9, y requiere la ejecución de 5.0E9 instrucciones. P2 tiene una frecuencia de reloj de 3
GHz, un promedio de IPC
0,75, y requiere la ejecución de 1.0E9 instrucciones.

1.12.1 [ 5] <§§1.6, 1.10> Un error habitual es considerar el equipo con la frecuencia de reloj más grande por
tener el más alto rendimiento. Comprobar si esto es cierto para P1 y P2.

1.12.2 [ 10] <§§1.6, 1.10> Otra falacia es considerar que el procesador que ejecute el mayor número de
instrucciones que se necesita un mayor tiempo de CPU. Teniendo en cuenta que el procesador P1 está
ejecutando una secuencia de instrucciones 1.0E9 y que el IPC de procesadores P1 y P2 no cambian, determinar
el número de instrucciones que P2 puede ejecutar en el mismo momento en que P1 necesita ejecutar 1.0E9
instrucciones.

1.12.3 [ 10] <§§1.6, 1.10> A error común es el uso de MIPS ( millones de instrucciones por segundo) para
comparar el rendimiento de dos procesadores diferentes, y considerar que el procesador MIPS con los más
grandes tiene el rendimiento más grande. Comprobar si esto es cierto para P1 y P2.

1.12.4 [ 10] <§1.10> Otra figura rendimiento común es MFLOPS (millones de operaciones de coma

flotante por segundo), definido como MFLOPS No hay FPoperations ExecutionTime 1E6

. /( )

pero esta cifra tiene los mismos problemas que MIPS. Asumir las instrucciones de coma flotante que el 40% de las
instrucciones ejecutadas tanto en P1 y P2 están. Encuentra las figuras Mflops para los procesadores.

1.13 Otro escollo citado en la Sección 1.10 está a la espera de mejorar el rendimiento general de un ordenador
mediante la mejora de sólo un aspecto de la computadora. Considere un equipo que ejecuta un programa que
requiere 250 s, con 70 s pasaron a ejecutar instrucciones de PF, 85 s instrucciones del ejecutado L /, y 40 s pasaron
la ejecución de las instrucciones de bifurcación.

1.13.1 [ 5] <§1.10> Por cuánto se reduce el tiempo total si el plazo para las operaciones de PF se reduce en
un 20%?
1.13 Ejercicios 59

1.13.2 [ 5] <§1.10> Por cuánto es el tiempo para las operaciones INT reducirse si el tiempo total se reduce en
un 20%?

1.13.3 [ 5] <§1.10> Can el tiempo total se puede reducir en un 20% mediante la reducción de sólo el tiempo para instrucciones
de ramificación?

1.14 Supongamos que un programa requiere la ejecución de 50 × 10 6 instrucciones de FP, 110 × 10 6 instrucciones INT,
80 × 10 6 L / instrucciones S, y 16 × 10 6 las instrucciones de bifurcación. El IPC para cada tipo de instrucción es 1, 1, 4, y
2, respectivamente. Supongamos que el procesador tiene una frecuencia de reloj de 2 GHz.

1.14.1 [ 10] <§1.10> Por lo mucho que hay que mejorar el IPC de instrucciones de FP si queremos que el programa se
ejecute dos veces más rápido?

1.14.2 [ 10] <§1.10> Por lo mucho que hay que mejorar el IPC de L Instrucciones / S si queremos que el programa se
ejecute dos veces más rápido?

1.14.3 [ 5] <§1.10> Por cuánto es el tiempo de ejecución del programa de mejora si el IPC de
instrucciones INT y FP se reduce en un 40% y el IPC de la L / S y Rama se reduce en un 30%?

1.15 [ 5] <§1.8> Cuando un programa está adaptado para funcionar en múltiples procesadores en un sistema

multiprocesador, el tiempo de ejecución en cada procesador se compone de tiempo y el tiempo de sobrecarga necesaria

para secciones críticas bloqueados de computación y / o para enviar datos desde un procesador a otro. Supongamos un

programa requiere t = 100 s de tiempo de ejecución en un procesador. cuando se ejecuta

pag procesadores, cada procesador requiere t / p s, así como un adicional de 4 s de sobrecarga, con independencia del
número de procesadores. Calcular el tiempo de ejecución por procesador para 2, 4, 8, 16, 32, 64, y 128 procesadores.
Para cada caso, la lista de la aceleración correspondiente con relación a un único procesador y la relación entre la
aceleración real en comparación con la aceleración ideal (speedup si había ninguna sobrecarga).

§ 1.1, página 10: Preguntas para la discusión: muchas respuestas son aceptables. § 1.4, página 24: La memoria DRAM: Las respuestas
volátil, el tiempo de acceso corto de 50 a 70 nanosegundos, y el coste por GB es de $ 5 a $ 10. La memoria del disco: no a Examínese
volátil, los tiempos de acceso son 100.000 a 400.000 veces más lenta que la DRAM, y el coste por GB es 100 veces más
barata que la DRAM. La memoria flash: no volátil, tiempos de acceso son de 100 a 1000 veces más lenta que la DRAM, y
el coste por GB es de 7 a 10 veces más barato que DRAM.

§1.5, página 28: 1, 3, y 4 son razones válidas. Respuesta 5 puede ser cierto en general debido a un volumen alto puede hacer
que la inversión adicional para reducir el tamaño de la pastilla por, digamos, un 10% de una buena decisión económica, pero no
tiene que ser verdad. § 1.6, página 33: 1. a: ambos, b: la latencia, c: ninguno. 7 segundos. § 1.6, página 40: b.

§1.10, página 51: a. El equipo A tiene la más alta calificación de MIPS. segundo. El equipo B es más rápido.
2
Instrucciones:
Lenguaje del
ordenador
Hablo español con Dios,
italiano con las mujeres, 2.1 Introducción 62

francés con los hombres, y el 2.2 Operaciones del Hardware 63


2.3 Operandos del Hardware 67
alemán a mi caballo.
2.4 Firmado y números sin signo 75

2.5 En representación de las instrucciones en el

Charles V, emperador romano santo ordenador 82


(1500-1558)
2.6 Operaciones lógicas 90

2.7 Las instrucciones para la Toma de Decisiones 93

Organización ordenador y Diseño. DOI: http://dx.doi.org/10.1016/B978-0-12-801733-3.00004-6


2017
© 2016 Elsevier Inc. Todos los derechos reservados.
2.8 De procedimientos de apoyo Hardware 100

2.9 La comunicación con la gente 110

2.10 LEGv8 direccionamiento para Immediates anchas y direcciones 115

2,11 Paralelismo e instrucciones: Sincronización 125

2.12 Traducción e iniciar un programa 128

2.13 Ordenar AC Ejemplo de ponerlo todo junto 137

2.14 Arrays frente Punteros 146

2.15 Advanced Material: Compilación C e Interpretación de Java 150

2,16 cosas reales: Instrucciones de MIPS 150

2.17 real Stuff: ARMv7 (32 bits) Instrucciones 152

2,18 cosas reales: las instrucciones x86 154

2,19 cosas reales: El resto del conjunto de instrucciones ARMv8 163

2.20 Falacias y errores 169

2.21 Observaciones finales 171

2.22 perspectiva histórica y lectura adicional 173

2.23 Ejercicios 174

Los componentes clásicos cinco de un ordenador


62 Capítulo 2 Instrucciones: Lenguaje del ordenador

2.1 Introducción

Para comandar el hardware de un ordenador, debe hablar su lenguaje. Las palabras del lenguaje de un
ordenador se denominan instrucciones, y su vocabulario se llama
conjunto de instrucciones El conjunto de instrucciones . En este capítulo, verá el conjunto de instrucciones de un ordenador real, tanto en forma
vocabulario de comandos entendidos escrita por la gente y en la forma leído por el ordenador. Introducimos las instrucciones de una manera de arriba
por una arquitectura dada.
hacia abajo. A partir de una notación que se parece a un lenguaje de programación restringida, refinamos hacerlo
paso a paso hasta que vea el idioma real de un ordenador real. Capítulo 3 continúa el descenso hacia abajo, al
presentar el hardware para la aritmética y la representación de los números en coma flotante.

Se podría pensar que las lenguas de los ordenadores serían tan diversos como los de la gente, pero en realidad, los
lenguajes de programación son bastante similares, más como dialectos regionales que los lenguajes independientes. Por lo
tanto, una vez que aprenda uno, es fácil de recoger otros.
El conjunto de instrucciones es elegido ARMv8, que viene de ARM Holdings plc y fue anunciado en 2011. Por razones
pedagógicas, vamos a utilizar un subconjunto de instrucciones ARMv8 en este libro. Vamos a utilizar el término ARMv8
cuando se habla del conjunto de instrucciones original completo, y LEGv8 cuando se refiere al subconjunto de enseñanza,
que es, por supuesto, sobre la base de conjunto de instrucciones ARMv8 de ARM. (LEGv8 está pensado como un juego
de palabras con ARMv8, pero también es un backronym para “Disminuir extrínseca locuacidad.”) Vamos a identificar las
diferencias entre los dos en las elaboraciones. Tenga en cuenta que este capítulo y varios otros tienen una sección para
dar una visión general del resto de las características en ARMv8 que no están en LEGv8 (véanse las Secciones 2.19, 3.8
y 5.14).

Para demostrar lo fácil que es para recoger a otros conjuntos de instrucciones, vamos a echar un vistazo rápido a otros tres
conjuntos de instrucciones populares.

1. MIPS es un elegante ejemplo de los conjuntos de instrucciones diseñadas desde los años 1980.

2. ARMv7 es una instrucción de más edad también de establecer ARM Holdings plc, pero con direcciones de
32 bits en lugar de 64 bits de ARMv8. Más de 14 mil millones de chips con procesadores ARM fueron
fabricados en 2015, por lo que los juegos de instrucciones más populares en el mundo. Irónicamente, en
opinión de los autores, y como se verá, ARMv8 está más cerca de lo que es MIPS a ARMv7.

3. El último ejemplo es el Intel x86, que alimenta tanto el PC y la nube de la era post-PC.

Esta similitud de conjuntos de instrucciones se debe a que todos los equipos están construidos a partir de
tecnologías de hardware basados ​en los principios subyacentes similares, y porque hay algunas operaciones
básicas que todos los equipos debe proporcionar. Por otra parte, los diseñadores de computadoras tienen un
objetivo común: encontrar un lenguaje que hace que sea fácil de construir el hardware y el compilador y aumentar al
máximo el rendimiento y minimizando costes y energía. Este objetivo es de larga tradición; la siguiente cita fue
escrito antes de poder comprar una computadora, y es tan cierto hoy como lo fue en 1947:

Es fácil ver por métodos lógico-formales que existen ciertas [] conjuntos de instrucciones que se encuentran en
abstracto adecuada para controlar y causar la ejecución de cualquier
2.2 Operaciones del Hardware 63

secuencia de operaciones. ... Las consideraciones muy decisivas desde el punto de vista actual, en la
selección de un [conjunto de instrucciones], son más de carácter práctico: la simplicidad del equipo exigido
por el [sistema de instrucción], y la claridad de su aplicación a los problemas realmente importantes juntos
con la velocidad de su manejo de esos problemas.

Burks, Goldstine, y von Neumann, 1947

La “simplicidad del equipo” es tan valioso una consideración para los ordenadores de hoy en día como lo fue
para los de la década de 1950. El objetivo de este capítulo es el de enseñar un conjunto de instrucciones que sigue
este consejo, que muestra tanto la forma en que se representa en el hardware y la relación entre los lenguajes de
programación de alto nivel y éste más primitivo. Nuestros ejemplos están en el lenguaje de programación C;
Sección
2.15 muestra como éstos cambiarían para un lenguaje orientado a objetos como Java.
Al aprender cómo representar instrucciones, también descubrirá el secreto de la informática: la concepto de
programa almacenado . Por otra parte, se le ejercer sus habilidades de “lengua extranjera” escribiendo programas en el concepto de programa almacenado La
lenguaje de la computadora y ejecutarlas en el simulador que viene con este libro. También podrá ver el impacto de los idea de que las instrucciones y los
datos de muchos tipos se pueden
lenguajes de programación y optimización del compilador en el rendimiento. Se concluye con una mirada a la evolución
almacenar en la memoria como
histórica de los conjuntos de instrucciones y una visión general de otros dialectos de ordenador.
números y por lo tanto ser fácil de
cambiar, lo que lleva a la computadora
Revelamos nuestro primer conjunto de instrucciones de una pieza a la vez, dando la razón, junto con las estructuras de programa almacenado.
informáticas. Esto de arriba hacia abajo, tutorial paso a paso teje los componentes con sus explicaciones, por lo que el
idioma del equipo sea más agradable al paladar. Figura 2.1
da un adelanto de la cubierta del conjunto de instrucciones en este capítulo.

2.2 Operaciones del Hardware

Cada equipo debe ser capaz de realizar cálculos aritméticos. La notación LEGv8 lenguaje ensamblador Ciertamente debe haber
instrucciones para realizar
las operaciones aritméticas
ADD a, b, c
fundamentales.
da instrucciones a un ordenador para añadir las dos variables segundo y do y poner en su suma a.
Esta notación es rígido en el que cada instrucción aritmética LEGv8 realiza una sola operación y siempre debe Burks, Goldstine, y von
tener exactamente tres variables. Por ejemplo, supongamos que queremos colocar la suma de cuatro variables segundo,Neumann, 1947
do, re, y mi en la variable a. ( En esta sección, estamos siendo deliberadamente vago sobre lo que es una “variable”; En
la siguiente sección, vamos a explicar en detalle).

La siguiente secuencia de instrucciones añade las cuatro variables:

ADD a, b, c // La suma de b y c se coloca en una


ADD a, a, d // La suma de b, c, y d se encuentra ahora en una
AÑADIR A, A, E // La suma de b, c, d, y e es ahora en una

Por lo tanto, se necesitan tres instrucciones para sumar las cuatro variables.
64 Capítulo 2 Instrucciones: Lenguaje del ordenador

operandos LEGv8

Nombre Ejemplo comentarios

ubicaciones rápidos para los datos. En LEGv8, los datos deben estar en registros de realizar cálculos aritméticos, regístrese XZR siempre

32 registros X0-X30, XZR es igual a 0.

2 62 palabras de Memoria [0], Memoria [4],. . . , Memoria Sólo se puede acceder por instrucciones de transferencia de datos. LEGv8 utiliza direcciones de byte, por lo que las direcciones

memoria [4.611.686.018.427.387, 904] secuenciales de doble palabra difieren en 8. La memoria almacena las estructuras de datos, matrices, y se derramó registros.

lenguaje ensamblador LEGv8

Categoría I norte structio norte Ejemplo Sentido comentarios

añadir ADD X1, X2, X3 X1 = X2 + X3 X1 = X2 Tres operandos de registro


sustraer X1 SUB, X2, X3 - X3 X1 = X2 + 20 X1 Tres operandos de registro
añadir inmediata ADDI X1, X2, 20 = X2 - 20 X1 = X2 + Se utiliza para añadir constantes

restar inmediata SUBI X1, X2, 20 X3 X1 = X2 - X3 Se utiliza para restar constantes


agregar y configurar las banderas ADDS X1, X2, X3 Añadir, establecer códigos de condición

Aritmética restar y establecer SUBS X1, X2, X3 Restar, establecer códigos de condición

indicadores

agregar indicadores inmediatos y ADDIS X1, X2, 20 X1 = X2 + 20 Añadir, establecer códigos de condición constantes

establecer

restar banderas inmediatas y Subis X1, X2, 20 X1 = X2 - 20 Restar, establecer códigos de condición constantes
establecidos

registro de carga LDUR X1, [X2,40] X1 = Memoria [X2 + 40] Doble palabra de la memoria para registrar

tienda de registro STUR X1, [X2,40] Memoria [X2 + 40] = X1 Doble palabra de registro de la memoria

cargar palabra firmado LDURSW X1, [X2,40] X1 = Memoria [X2 + 40] Memoria Palabra de la memoria para registrar

tienda de palabra STURW X1, [X2,40] [X2 + 40] = X1 X1 = Memoria [X2 + Palabras del registro en la memoria

media carga LDURH X1, [X2,40] 40] memoria media palabra para registrarse

tienda de la mitad STURH X1, [X2,40] Memoria [X2 + 40] = X1 X1 = Media palabra registro para la memoria

bytes de carga LDURB X1, [X2,40] Memoria [X2 + 40] Memoria [X2 + Byte de la memoria para registrar
tienda de bytes STURB X1, [X2,40] 40] = X1 X1 = Memoria [X2] Byte del registro de la memoria
cargar registro LDXR X1, [X2,0] Carga; Primera mitad de intercambio atómica

exclusiva

Transferencia de datos tienda de registro STXR X1, X3 [X2] Memoria [X2] = X1; X3 = 0 o 1 Almacenar; Segunda mitad del intercambio atómica

exclusivo

mover amplia con cero MOVZ X1,20, LSL 0 X1 = 20 o 20 * 2 dieciséis o 20 Las cargas de 16 bits constantes, ceros de descanso

* 2 32 o 20 * 2 48

mover con gran fortaleza MOVK X1,20, LSL 0 X1 = 20 o 20 * 2 dieciséis o 20 Las cargas de 16 bits constantes, descanso sin

* 2 32 o 20 * 2 48 cambios

FIGURA 2.1 LEGv8 lenguaje ensamblador revelado en este capítulo. Esta información también se encuentra en la Columna 1 de la tarjeta de datos LEGv8 de referencia en la parte delantera
de este libro.
2.2 Operaciones del Hardware sesenta y cinco

y Y X1, X2, X3 X1 = X2 y X1 X3 = X2 Tres reg. operandos; bit por bit y


incluido o La ORR X1, X2, X3 | X3 X1 = X2 ^ X1 X3 Tres reg. operandos; bit por bit OR
exclusivo o EOR X1, X2, X3 = X2 y 20 X1 = X2 | Tres reg. operandos; bit a bit XOR
e inmediata ANDI X1, X2, 20 20 Bit por bit y Reg. con una constante
incluido o ORRI X1, X2, 20 Bit por bit o reg. con una constante
Lógico
inmediata

exclusiva o EORI X1, X2, 20 X1 = X2 ^ 20 Bit a bit XOR reg. con una constante
inmediata

izquierdo lógico turno LSL X1, X2, 10 X1 = X2 << 10 X1 = X2 Desviación a la izquierda por la constante

lógica desplazamiento a la derecha LSR X1, X2, 10 >> 10 Desplazamiento a la derecha por la constante

comparar y rama de igual CBZ X1, 25 si (X1 == 0) ir a la PC + 100 Equal 0 de ensayo; PC-rama relativa
a0

bifurcación comparar y ramificarse en no CBNZ X1, 25 Si (X1! = 0) ir a la PC + 100 No igual 0 de ensayo; PC-rama relativa
condicional es igual a 0

rama condicional B.cond 25 si (condición verdadera) hasta llegar a la PC + códigos de condiciones de ensayo; si es cierto, rama

100

rama segundo 2500 ir a la PC + 10000 Ramificarse a la dirección de destino;

PC-relativa

salto rama de registro BR X30 ir a X30 Para el interruptor, Procedimiento de devolución

incondicional

rama con enlace 2500


licenciado en Derecho X30 = PC + 4; PC + 10000 Por llamada a procedimiento PC-relación

Figura 2.1 (Continuación).

Las palabras a la derecha de las barras dobles (//) en cada línea de arriba son
comentarios para el lector humano, por lo que el equipo los ignora. Tenga en cuenta que a diferencia de otros lenguajes de
programación, cada línea de este lenguaje puede contener como máximo una instrucción. Otra diferencia con respecto a C
es que los comentarios siempre terminan al final de una línea.

El número natural de operandos para una operación como la adición es tres: los dos números que
se suman y un lugar para poner la suma. Requiriendo cada instrucción tener exactamente tres
operandos, ni más ni menos, se ajusta a la filosofía de mantener el hardware simple: hardware para
un número variable de operandos es más complicado que el hardware para un número fijo. Esta
situación ilustra el primero de los tres principios básicos de diseño de hardware:

Diseño Principio 1: La simplicidad favorece la regularidad.

Ahora podemos mostrar, en los dos ejemplos que siguen, la relación de los programas escritos en lenguajes
de programación de alto nivel a los programas en esta notación más primitivo.
66 Capítulo 2 Instrucciones: Lenguaje del ordenador

Compilación de dos declaraciones de asignación de C en LEGv8

Este segmento de un programa de C contiene las cinco variables una, segundo, do, re, y mi. Desde Java evolucionó a partir de
EJEMPLO C, este ejemplo y el siguiente trabajo de unos pocos de lenguaje de programación, ya sea de alto nivel:

a = b + c; d = a - mi;

los compilador traduce de C a LEGv8 instrucciones en lenguaje ensamblador. Mostrar el código LEGv8
producido por un compilador.

Una instrucción LEGv8 opera sobre dos operandos de origen y coloca el resultado en un operando de destino. Por
RESPONDER lo tanto, las dos afirmaciones anteriores sencillos de compilación directamente en estas dos instrucciones en
lenguaje ensamblador LEGv8:

ADD a, b, c SUB d,
a, e

Compilación de un Asignación Complex C en LEGv8


EJEMPLO
Una declaración algo complicado contiene las cinco variables F, sol, h, yo, y j:

f = (g + h) - ( i + j);

Lo que podría producir un compilador de C?

El compilador debe romper esta declaración en varias instrucciones de montaje, ya que sólo se realiza
RESPONDER una operación por la instrucción LEGv8. La primera instrucción LEGv8 calcula la suma de sol y h. Hay que
colocar el resultado en algún lugar, por lo que el compilador crea una variable temporal, llamado T0:

AÑADIR t0, g, h // t0 variable temporal contiene g + h

Aunque la siguiente operación de resta es, tenemos que calcular la suma de yo y


j antes de que podamos restar. Por lo tanto, la segunda instrucción coloca la suma de yo y

j en otra variable temporal creado por el compilador, denominado t1:

AÑADIR t1, i, j // t1 variable temporal contiene i + j

Por último, la instrucción de resta resta la segunda suma de la primera y coloca la diferencia en
la variable F, completando el código compilado:

f SUB, T0, T1 // F consigue t0 - t1, que es (g + h) - ( i + j)


2.3 Operandos del Hardware 67

Para una función dada, que lenguaje de programación probable que toma la mayor cantidad de líneas de código? Ponga las tres Examínese
representaciones a continuación en orden.

1. Java

2. C

3. lenguaje ensamblador LEGv8

Elaboración: Para aumentar la portabilidad, Java fue concebido originalmente como confiar en un intérprete de software.
El conjunto de instrucciones de este intérprete se llama bytecodes Java
(ver sección 2.15 ), lo cual es bastante diferente del conjunto de instrucciones LEGv8. Para obtener un rendimiento cercano al programa

equivalente de C, Java sistemas de hoy en día suelen compilar Java bytecodes en los conjuntos de instrucciones nativas como LEGv8.

Debido a esta recopilación se realiza normalmente mucho más tarde que para los programas de C, tales compiladores Java a menudo se

llaman Justo a tiempo ( JIT) compiladores. Sección 2.12 muestra cómo se utilizan los equipos conjuntos de investigación más tarde de los

compiladores de C en el proceso de puesta en marcha, y la Sección 2.13 muestra las consecuencias de rendimiento de la compilación frente

a la interpretación de los programas Java.

2.3 Operandos del Hardware

A diferencia de los programas en lenguajes de alto nivel, los operandos de instrucciones aritméticas están restringidas;
deben ser de un número limitado de lugares especiales construidas directamente en hardware llamado registros. Los
registros son primitivas utilizadas en el diseño de hardware que también son visibles para el programador cuando el
equipo se ha completado, por lo que pueden pensar en registros como los ladrillos de construcción del equipo. El
tamaño de un registro en la arquitectura LEGv8 es de 64 bits; grupos de 64 bits se producen con tanta frecuencia que
se les da el nombre doble palabra en la arquitectura LEGv8. (Otro tamaño popular es un grupo de 32 bits, llamado palabra
en la arquitectura LEGv8.) doble palabra Otra unidad natural de
acceso en un ordenador, por lo
general un grupo de 64 bits; se
Una diferencia importante entre las variables de un lenguaje de programación y los registros es el número
corresponde con el tamaño de un
limitado de registros, por lo general 32 en los ordenadores actuales, como LEGv8. (Ver
registro en la arquitectura LEGv8.
sección 2.22 para la historia de la cantidad de registros.) Por lo tanto,
continuando en nuestro top-down, la evolución gradual de la representación simbólica de la lengua LEGv8,
en esta sección hemos añadido la restricción de que los tres operandos de instrucciones aritméticas LEGv8 palabra Una unidad natural de acceso

deben ser elegidos cada de uno de los 32 registros de 64 bits. en un ordenador, por lo general un
grupo de 32 bits.

La razón para el límite de 32 registros se pueden encontrar en el segundo de los tres principios fundamentales de
diseño de la tecnología de hardware:

Diseño Principio 2: Cuanto más pequeños, más rápidos.

Un número muy grande de registros puede aumentar el tiempo de ciclo de reloj, simplemente porque se necesita señales
electrónicas ya cuando tienen que viajar más lejos.
Directrices como “más pequeño es más rápido” no son absolutos; 31 registros pueden no ser más rápido que 32.
Aun así, la verdad detrás de estas observaciones hace que los diseñadores de computadoras tomarlos en serio. En
este caso, el diseñador debe equilibrar el deseo de
68 Capítulo 2 Instrucciones: Lenguaje del ordenador

programas para varios registros con el deseo del diseñador para mantener el rápido ciclo de reloj. Otra razón
para no usar más de un 32 es el número de bits que se necesitaría en el formato de instrucción, como demuestra
la Sección 2.5.
Capítulo 4 muestra el papel central que registra el juego en la construcción de hardware; como veremos más adelante en
ese capítulo, el uso efectivo de los registros es fundamental para el rendimiento del programa.

Aunque podríamos simplemente escribir las instrucciones para el uso de números registros, de 0 a 31, la convención
se LEGv8 X seguido por el número del registro, a excepción de unos pocos nombres de registro que vamos a cubrir más
tarde.

Compilación de un Asignación C utilizando los registros


EJEMPLO
Es el trabajo del compilador para las variables del programa asociados con registros. Tomemos, por ejemplo, la
instrucción de asignación de nuestro ejemplo anterior:

f = (g + h) - ( i + j);

las variables F, sol, h, yo, y j son asignados a los registros X19, X20, X21, X22,
y X23, respectivamente. ¿Cuál es el código compilado LEGv8? El programa compilado es muy similar al

ejemplo anterior, excepto sustituimos las variables con los nombres de los registros mencionados

RESPONDER anteriormente, además de dos registros temporales, X9 y X10, que corresponden a las variables temporales

anteriores:

AÑADIR X9, X20, X21 // registrar X9 contiene g + h ADD X10, X22, X23 // registro X10 contiene i + j SUB
X19, X9, X10 // f consigue X9 - X10, que es (g + h) - ( i + j)

memoria Operandos
Los lenguajes de programación tienen variables simples que contienen elementos de datos individuales, como en estos ejemplos,
pero también tienen más complejas estructuras de datos-arrays y estructuras. Estas estructuras de datos compuestos pueden
contener muchos más elementos de datos que los que hay registros en un ordenador. ¿Cómo puede representar una
computadora y tener acceso a tales estructuras de gran tamaño?

Recordar los cinco componentes de un ordenador introducido en Capítulo 1 y se repite en la página 61. El procesador
puede mantener sólo una pequeña cantidad de datos en registros, pero la memoria del ordenador contiene miles de
elementos de datos. Por lo tanto, estructuras de datos (arrays y estructuras) se mantienen en la memoria.

instrucción de transferencia de
datos Un comando que mueve datos
Como se explicó anteriormente, las operaciones aritméticas se producen sólo en un registro de instrucciones LEGv8;

entre la memoria y registros. por lo tanto, LEGv8 debe incluir instrucciones que transfieren datos entre la memoria y registros. Dichas instrucciones se
denominan instrucciones de transferencia de datos .
2.3 Operandos del Hardware 69

Para acceder a una palabra o palabra doble en la memoria, la instrucción debe suministrar la memoria dirección . La
dirección Un valor usado para delinear
memoria es simplemente una matriz grande, unidimensional, con la dirección que actúa como el índice para esa la localización de un elemento de
matriz, a partir de 0. Por ejemplo, en Figura 2.2 , La dirección del tercer elemento de datos es 2, y el valor de la datos específico dentro de una matriz

memoria [2] es 10. de memoria.

2 100

1 10

0 101

Dirección Datos 1

Procesador Memoria

Figura 2.2 Las direcciones de memoria y contenido de la memoria en esos lugares. Si estos elementos eran palabras dobles, estas direcciones
sería incorrecto, ya que en realidad LEGv8 utiliza direccionamiento de byte, con cada palabra doble representación de 8 bytes. Figura 2.3 muestra la
memoria correcta para hacer frente a las direcciones de doble palabra secuenciales.

La instrucción de transferencia de datos que copia los datos de la memoria a un registro que tradicionalmente
se llama carga. El formato de la instrucción de carga es el nombre de la operación, seguido por el registro se va a
cargar, a continuación, registrar y una constante utilizada para acceder a la memoria. La suma de la parte
constante de la instrucción y el contenido del segundo registro forma la dirección de memoria. El verdadero nombre
LEGv8 de esta instrucción es LDUR, de pie durante Registro de carga.

Elaboración: los T en LDUR representa sin escala inmediata como opuesta a escamoso
inmediata, lo que se explica en la Sección 2.19.

Compilar una asignación cuando un operando está en la memoria


EJEMPLO
Vamos a suponer que UNA es una matriz de 100 palabras dobles y que el compilador ha asociado las
variables sol y h con los registros X20 y X21 como antes. Supongamos también que la dirección de partida, o dirección
de base, de la matriz es en X22.
Recopilar esta instrucción de asignación C:

g = h + A [8];

Aunque no existe una sola operación en esta instrucción de asignación, uno de los operandos es en la memoria, por
lo que debemos primera transferencia A [8] a un registro. La dirección RESPONDER
70 Capítulo 2 Instrucciones: Lenguaje del ordenador

de este elemento de la matriz es la suma de la base de la matriz UNA, encontrado en el registro X22,

más el número para seleccionar el elemento 8. Los datos deben ser colocados en un registro temporal para su uso en
la siguiente instrucción. Residencia en Figura 2.2 , La instrucción primera es compilado

LDUR X9, [X22, # 8] // X9 reg temporal para crear una [8]

(Vamos a hacer un ligero ajuste a esta instrucción, pero vamos a utilizar esta versión simplificada por
ahora.) La siguiente instrucción puede operar sobre el valor de X9 ( lo que equivale A [8]) ya que es en
un registro. La instrucción debe añadir h
(contenida en X21) a A [8] ( contenida en X9) y poner la suma en el registro correspondiente a g ( asociado
con X20):

AÑADIR X20, X21, X9 // g = h + A [8]

El registro añadió para formar la dirección ( X22) que se llama el registro de base, y la constante en una instrucción de
transferencia de datos (8) se denomina compensar.

Interfaz de Además de asociar las variables con registros, el compilador asigna estructuras de datos como matrices y
estructuras a ubicaciones en la memoria. El compilador puede entonces colocar la dirección de inicio de en las
hardware /
instrucciones de transferencia de datos.
software Desde 8 bits bytes son útiles en muchos programas, virtualmente todas las arquitecturas de hoy direcciones bytes
individuales. Por lo tanto, la dirección de una doble palabra coincide con la dirección de uno de los 8 bytes dentro de la
palabra doble, y las direcciones de palabras dobles secuenciales difieren por 8. Por ejemplo, Figura 2.3 muestra las
direcciones LEGv8 reales de las palabras dobles en Figura 2.2 ; la dirección de byte de la tercera palabra doble es de
16.
Las computadoras se dividen en aquellos que utilizan la dirección del byte más a la izquierda o la “gran final” como la

dirección de palabra doble en comparación con aquellos que utilizan el byte más a la derecha o “pequeña final”. LEGv8 puede

funcionar ya sea como bigEndian o ascendente hacia la izquierda. Dado que las cuestiones de orden sólo si se accede a los datos

idénticos tanto como una palabra doble y hasta ocho bytes, pocos tienen que ser conscientes de la “endianess”.

Byte abordar también afecta el índice de matriz. Para obtener la dirección correcta de bytes en el código anterior, el
desplazamiento que se añade a la base de registro X22 debe ser de 8 × 8, o 64,
de modo que la dirección de carga seleccionará A [8] y no A [8/8]. ( Ver la relacionada Trampa en la página 171 de la Sección
2.20.)
La instrucción complementaria a la carga se denomina tradicionalmente almacenar; Se copia de datos desde un registro
en la memoria. El formato de una tienda es similar a la de una carga: el nombre de la operación, seguido por el registro para
ser almacenados, a continuación, el registro de base, y, finalmente, el desplazamiento para seleccionar el elemento de
matriz. Una vez más, la dirección LEGv8 se especifica en parte por una constante y en parte por el contenido de un registro.
El nombre real es LEGv8 STUR, de pie durante tienda de registro.
2.3 Operandos del Hardware 71

100

24 10

16 101

08 1

Dirección de datos Byte

Procesador Memoria

Figura 2.3 actuales direcciones de memoria LEGv8 y contenido de la memoria de esas palabras dobles. Las direcciones
modificados se resaltan para contrastar con Figura 2.2 . Desde LEGv8 aborda cada byte, direcciones de doble palabra son múltiplos de
8: hay 8 bytes en una palabra doble.

Elaboración: En muchas arquitecturas, las palabras deben comenzar en direcciones que son múltiplos de 4 y palabras dobles debe restricción de alineación
comenzar en direcciones que son múltiplos de 8. Este requisito se denomina una restricción de alineación . ( Capítulo 4 sugiere por qué El requisito de que los datos estén
la alineación conduce a las transferencias de datos más rápidas.) ARMv8 e Intel x86 hacen no tener restricciones de alineación, pero alineados en la memoria de los límites

ARMv7 y MIPS hacen. naturales.

Elaboración: No es cierto que ARMv8 no tiene restricciones de alineación. A pesar de que es compatible con el acceso no alineado
a la memoria normal para la mayoría de las instrucciones de transferencia de datos, pila accesos y recuperaciones de instrucción no
tener restricciones de alineación.

Como las direcciones de las cargas y las tiendas son números binarios, podemos ver por qué la DRAM de memoria
Interfaz de
principal viene en tamaños binarios en lugar de en tamaños decimales. Es decir, en gibibytes (2 30) o tebibytes (2 40), no en
gigabytes (10 9) o terabytes (10 12); ver Figura 1.1 .
hardware /
software

El uso de la compilación de carga y almacenamiento

asumir la variable h se asocia con registro X21 y la dirección base de la matriz UNA es en X22. ¿Cuál es el
código de montaje LEGv8 para la instrucción de asignación C por debajo? EJEMPLO

A [12] = h + A [8];

Aunque no existe una sola operación en el estado C, ahora dos de los operandos están en la memoria, por lo
que necesitamos, incluso instrucciones más LEGv8. Las dos primeras instrucciones son las mismas que en el RESPONDER
ejemplo anterior, excepto que esta vez usamos
72 Capítulo 2 Instrucciones: Lenguaje del ordenador

el correcto desplazamiento de direccionamiento de byte en la instrucción de registro de carga para seleccionar

A [8], y el AÑADIR la instrucción coloca la suma de X9:

X9 LDUR, [X22, # 64] // X9 reg temporal para crear una [8] ADD X9, X21, X9
// X9 reg Temporal consigue h + A [8]

La última instrucción almacena la suma en A [12], usando 96 (8 × 12) como el


desplazamiento y registro X22 como el registro base.

STUR X9, [X22, # 96] // tiendas H + A [8] de nuevo en A [12]

Cargar registro y la tienda de registro son las instrucciones que copian palabras dobles entre la memoria y se
registra en la arquitectura ARMv8. Algunas marcas de ordenadores utilizan otras instrucciones junto con la carga
y almacenamiento para transferir datos. Una arquitectura con esas alternativas es el Intel x86, que se describe en
la Sección 2.18.

Interfaz de Muchos programas tienen más variables que las computadoras tienen registros. En consecuencia, el compilador trata de

hardware / mantener las variables utilizadas con mayor frecuencia en los registros y coloca el resto en la memoria, utilizando cargas y
tiendas para mover las variables entre registros y memoria. El proceso de poner menos frecuentemente utilizado las variables
software (o las que se necesitan más adelante) en la memoria se llama derramando registros.

El principio de hardware relacionado tamaño y la velocidad sugiere que la memoria debe ser más lenta que los
registros, ya que hay menos registros. Esta sugerencia es el caso; accede a los datos son más rápidos si los datos
están en registros en lugar de la memoria.
Además, los datos son más útiles cuando en un registro. Una instrucción aritmética LEGv8 puede leer
dos registros, operar sobre ellos, y escribir el resultado. Una instrucción de transferencia de datos LEGv8
sólo lee o escribe un operando un operando, sin actuar sobre él.

Por lo tanto, los registros tienen menos tiempo para acceder y tienen un mayor rendimiento de la memoria, por lo que los

datos contenidos en los registros tanto considerablemente más rápidas para acceder y más fácil de usar. Acceso a los registros

también utiliza mucha menos energía que el acceso a la memoria. Para lograr el mayor rendimiento y ahorrar energía, una

arquitectura del conjunto de instrucciones debe tener suficientes registros, y los compiladores deben utilizar registros de manera

eficiente.

Elaboración: Vamos a poner la energía y el rendimiento de los registros de la memoria frente en perspectiva.
Suponiendo datos de 64 bits, los registros son aproximadamente 200 veces más rápido (0,25 vs. 50 nanosegundos) y son
10.000 veces más eficiente de la energía (0.1 vs. 1000 picoJoules) que la DRAM en 2015. Estas grandes diferencias
llevaron a cachés, que reducen el rendimiento y la penas de energía de ir a la memoria (ver Capítulo 5 ).
2.3 Operandos del Hardware 73

Operandos constante o inmediata


Muchas veces un programa utilizará una constante en un ejemplo de operación-para, incrementando un índice para
señalar a la siguiente elemento de una matriz. De hecho, más de la mitad de las instrucciones aritméticas LEGv8
tienen una constante como operando cuando se ejecutan los puntos de referencia SPEC CPU2006.

Usando sólo las instrucciones que hemos visto hasta ahora, tendríamos que cargar una constante de la memoria
a utilizar uno. (Las constantes se han colocado en la memoria cuando se ha cargado el programa.) Por ejemplo, para
añadir la constante de 4 a registrar X22, podríamos utilizar el código

LDUR X9, [X20, AddrConstant4] // X9 = constante 4


AÑADIR X22, X22, X9 // X22 = X22 + X9 (== X9 4)

asumiendo que X20 + AddrConstant4 es la dirección de memoria de la constante de 4.


Una alternativa que evita la instrucción de carga es ofrecer versiones de las instrucciones aritméticas en el que
un operando es una constante. Esta instrucción de adición rápida con un operando constante se llama añadir
inmediata o ADDI. Para añadir 4 para registrar X22,
acabamos de escribir

ADDI X22, X22, # 4 // X22 = X22 + 4

operandos constantes se producen con frecuencia, y la inclusión de las constantes dentro de las instrucciones
aritméticas, operaciones son mucho más rápidos y consumen menos energía que si se cargaron las constantes de la
memoria.
La constante cero tiene otra función, que es simplificar el conjunto de instrucciones, ofreciendo variaciones
útiles. Por ejemplo, la operación de movimiento es sólo una instrucción de suma donde un operando es cero. Por
lo tanto, LEGv8 dedica un registro XZR estar cableada al valor cero. (Se corresponde con el número de registro
31.) El uso de la frecuencia de justificar las inclusiones de las constantes es otro ejemplo de la gran idea de Capítulo
1 de hacer la caso común rápido.

Dada la importancia de los registros, lo que es la tasa de aumento en el número de registros en un chip con el
tiempo? Examínese
1. Muy rápido: aumentan tan rápido como La Ley de Moore, que predice la duplicación de la
número de transistores en un chip cada 18 meses.

2. Muy lenta: Dado que los programas se distribuyen normalmente en el idioma del equipo, no hay inercia en la
arquitectura del conjunto de instrucciones, por lo que el número de registros aumenta tan rápido como
nuevos juegos de instrucciones sean viables.

Elaboración: Aunque el LEGv8 registra en este libro son de 64 bits de ancho, el conjunto de instrucciones completo ARMv8
tiene dos estados de ejecución: AArch32, en la que los registros son de 32 bits de ancho (véase la Sección 2.19), y AArch64, que
tiene un amplio registro de 64 bits. El primero es compatible con los juegos de instrucciones A32 y T32 y el segundo apoya A64.
En este capítulo, se utiliza un subconjunto de A64 para LEGv8.
74 Capítulo 2 Instrucciones: Lenguaje del ordenador

Elaboración: Los LEGv8 compensados ​más registro de la base de direccionamiento es un excelente partido a las estructuras, así
como matrices, ya que el registro puede señalar el comienzo de la estructura y el desplazamiento puede seleccionar el elemento
deseado. Veremos un ejemplo de ello en la Sección 2.13.

Elaboración: El registro en las instrucciones de transferencia de datos se inventó originalmente para mantener un índice de una matriz
con el desplazamiento usado para la dirección de inicio de una matriz. Por lo tanto, el registro de base también se denomina registro de
índice. recuerdos de hoy en día son mucho más grandes, y el modelo de software de asignación de datos es más sofisticado, por lo que la
dirección base de la matriz normalmente se pasaron en un registro ya que no cabe en el desplazamiento, como veremos más adelante.

Elaboración: La migración de los ordenadores de direcciones de 32 bits para computadoras de direcciones de 64 bits a la izquierda
autores de compiladores una elección del tamaño de los tipos de datos en C. Claramente, los punteros debe ser de 64 bits, pero qué
pasa con los números enteros? Por otra parte, C tiene los tipos de datos int, long int, y int largo tiempo. Los problemas provienen de la
conversión de un tipo de datos a otro y que tiene un desbordamiento inesperado en código C que no es totalmente compatible con el
estándar, que por desgracia no es código raro. La siguiente tabla muestra las dos opciones más populares:

punteros del sistema operativo En t long int long int largo

Microsoft Windows 64 bits 32 bits 32 bits 64 bits


Linux, Unix más 64 bits 32 bits 64 bits 64 bits

Mientras que cada compilador podría tener diferentes opciones, en general, los compiladores asociados a cada sistema
operativo tomar la misma decisión. Para mantener los ejemplos simples, en este libro vamos a suponer punteros son los 64 bits
de todos los números enteros y declaramos como C long int largo para mantenerlos del mismo tamaño. También seguimos
estándar C99 y declaramos variables utilizadas como índices de matrices para ser size_t, lo que garantiza que son del tamaño
correcto, no importa cuán grande es la matriz. Por lo general los mismos que declararon long int.

Elaboración: En el conjunto completo de instrucciones ARMv8, regístrese 31 es XZR en la mayoría de las instrucciones, pero el punto
de pila ( SP) en otros. Creemos que es confuso, por lo registramos 31 es siempre
XZR en LEGv8 y SP Siempre es registrarse 28. Además de confundir al lector, sino que también complicaría camino de datos
de diseño en Capítulo 4 si el registro 31 significó 0 para algunas instrucciones y SP para otros.

Elaboración: El conjunto de instrucciones completo ARMv8 no utiliza la tecla de acceso ADDI cuando uno de los operandos es una
inmediata; sólo se utiliza AÑADIR, y permite que el ensamblador recoger el código de operación adecuada. Nos preocupa que podría ser
confuso para utilizar la misma tecla de acceso tanto para los códigos de operación, por lo que para fines de enseñanza LEGv8 distingue
los dos casos con diferentes mnemotécnicos.
2.4 Números y sin signo 75

2.4 Firmado y números sin signo

En primer lugar, vamos a revisar rápidamente cómo un ordenador representa los números. Los seres humanos se les enseña a

pensar en la base 10, pero los números pueden estar representados en cualquier base. Por ejemplo, 123 base 10 = 1.111.011

base 2.

Los números se mantienen en el hardware del ordenador como una serie de señales electrónicas de alta y baja, y por
lo que se consideran de base 2 números. (Al igual que la base 10 números se denominan decimal números, base 2 números
son llamados binario números.)
Un solo dígito de un número binario es así el “átomo” de la informática, ya que toda la información se compone
de dígitos binarios o Bits. Este bloque de construcción fundamental puede ser uno de dos valores, que pueden ser dígito binario También
considerados como varias alternativas: altas o bajas, o apagar, verdadera o falsa, o 1 o 0. llamado bit binario.
Uno de los dos números en
base 2, 0 o 1, que son los
Generalizando el punto, en cualquier base número, el valor de yo º dígitos re es
componentes de información.
yo
re Base

dónde yo comienza en 0 y aumenta de derecha a izquierda. Esta representación conduce a una manera obvia para
numerar los bits de la palabra doble: simplemente usar el poder de la base para que poco. Nos subíndice con
números decimales diez y números binarios con
dos. Por ejemplo,

1011 dos

representa

(1 × 2 3) + ( 0 × 2 2) + ( 1 × 2 1) + ( 1 × 2 0) diez
= (1 × 8) + (0 × 4) + (1 × 2) + (1 × 1) diez
= 8 +0 +2 + 1 diez
= 11 diez

Numeramos los bits 0, 1, 2, 3, ... desde De derecha a izquierda en una palabra doble. El dibujo de abajo muestra la
numeración de los bits dentro de una palabra doble LEGv8 y la colocación del número 1011 dos, ( que hay que
lamentablemente dividir por la mitad para ajustarse a la página del libro):

bit menos significativo El bit más a la


derecha en un LEGv8 doble palabra.

Desde palabras dobles se dibujan tanto vertical como horizontalmente, más a la izquierda y más a la derecha puede no parte más significante El bit más a la
estar claro. Por lo tanto, la frase bit menos significativo se utiliza para referirse al bit de más a la derecha (bit 0 arriba) y parte izquierda en una palabra doble LEGv8.
más significante el bit de la izquierda (bit 63).
76 Capítulo 2 Instrucciones: Lenguaje del ordenador

La palabra doble LEGv8 es de 64 bits de largo, por lo que puede representar 2 64 diferentes patrones de 64 bits. Es
natural para que estas combinaciones representan los números de 0 a 2 64

- 1 (18,446,774,073,709,551,615 diez):

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 dos = 0 diez

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 dos = 1 diez

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010 dos = 2 diez

. . . . . .

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111101 dos = 18.446.774.073.709.551.613 diez

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110 dos = 18.446.744.073.709.551.614 diez

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 dos = 18.446.744.073.709.551.615 diez

Es decir, los números binarios de 64 bits se pueden representar en términos de valor de las veces poco una potencia de 2

(aquí X yo significa el yo ésimo bit de X):

63 62 61 1 0
( X 63 2 )( X 62 2 )( X 61 2 ) ( X1 2 )( X0 2 )

Por razones que veremos en breve, estos números positivos se denominan números sin signo.

Interfaz de Base 2 no es natural para los seres humanos; tenemos 10 dedos y así encontramos la base 10 natural. ¿Por qué no
utilizan los ordenadores decimal? De hecho, el primer ordenador comercial
hardware / hizo ofrecer la aritmética decimal. El problema era que el equipo todavía se utiliza dentro y fuera de señales, por lo que un
software dígito decimal simplemente estaba representado por varios dígitos binarios. Decimal resultó tan ineficaz que los
ordenadores posteriores volvieron a todos binario, la conversión a la base 10 sólo para los eventos de entrada / salida
relativamente poco frecuentes.

Tenga en cuenta que los patrones de bits binarios anteriormente son simplemente representantes
de números. Números realmente tienen un número infinito de dígitos, con casi todos siendo 0 a excepción de unos
pocos de los dígitos de la derecha. Sólo que no suelen contar con 0s principales.

El hardware puede ser diseñado para sumar, restar, multiplicar y dividir estos patrones de bits binarios. Si el
número que es el resultado adecuado de este tipo de operaciones no puede ser representado por estos bits de
hardware más a la derecha, rebosar se dice que ha ocurrido. Es hasta el lenguaje de programación, el sistema
operativo y el programa para determinar qué hacer si se produce desbordamiento.
2.4 Números y sin signo 77

Los programas de ordenador calcular los números positivos y negativos, por lo que necesitan una
representación que distingue a lo positivo de lo negativo. La solución más obvia es añadir una señal separada,
que convenientemente se puede representar en un único bit; el nombre de esta representación es signo y
magnitud.
Por desgracia, el signo y magnitud representación tiene varios defectos. En primer lugar, no es obvio dónde poner el
bit de signo. ¿A la derecha? ¿A la izquierda? Las primeras computadoras trataron ambos. En segundo lugar, sumadores
de signo y magnitud pueden necesitar un paso adicional para ajustar la señal, porque no podemos saber de antemano
cuál será el signo apropiado. Por último, un bit de signo separada significa que signo y magnitud tiene tanto un positivo y
un negativo cero, lo que puede conducir a problemas de falta de atención para los programadores. Debido a estas
deficiencias, signo y magnitud representación pronto fue abandonado.

En la búsqueda de una alternativa más atractiva, se plantea la cuestión de cuál sería el resultado para
números sin signo, si tratamos de restar un número grande de uno pequeño. La respuesta es que se trataría de
pedir prestado a una serie de 0s principales, por lo que el resultado sería tener una cadena de 1s principales.

Dado que no había mejor alternativa obvia, la solución final fue a recoger la representación que hizo el
hardware simple: 0s principales significan positivo y negativo significan 1s principales. Esta convención
para representar números binarios con signo se llama complemento a dos representación:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 dos = 0 diez

00000000 00000000 00000000 00000000 00000000 00000000 00000001 dos = 1 diez

00000000 00000000 00000000 00000000 00000000 00000000 00000010 dos = 2 diez

. . . . . .

01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111101 dos = 9.223.372.036.854.775.805 diez

01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110 dos = 9.223.372.036.854.775.806 diez

01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 dos = 9.223.372.036.854.775.807 diez

10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 dos = - 9.223.372.036.854.775.808 diez

10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 dos = - 9.223.372.036.854.775.807 diez

10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010 dos = - 9.223.372.036.854.775.806 diez

... . . .

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111101 dos = - 3 diez

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110 dos = - 2 diez

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 dos = - 1 diez

El medio positivo de los números, de 0 a 9.223.372.036.854.775.807 diez ( 2 63 - 1),


utilizar la misma representación que antes. El siguiente patrón de bits (1000 ... 0000 dos)
representa el número más negativo - 9.223.372.036.854.775.808 diez ( - 2 63). Esta es seguida por un conjunto cada vez
menor de los números negativos: - 9.223.372.036.854.775.807 diez ( 1000
... 0001 dos) Abajo a - 1 diez ( 1111 ... 1111 dos).
78 Capítulo 2 Instrucciones: Lenguaje del ordenador

complemento a dos tiene un número negativo que no tiene número positivo correspondiente:
-9.223.372.036.854.775.808 diez. Este desequilibrio fue también una preocupación para el programador de falta
de atención, pero de signo y magnitud tenido problemas tanto para el programador y el diseñador de
hardware. En consecuencia, todos los ordenadores de hoy utiliza de dos representaciones binarias
complemento de números con signo.

representación de complemento a dos tiene la ventaja de que todos los números negativos tienen un 1 en el bit
más significativo. Por lo tanto, el hardware necesita probar sólo que esta poco para ver si un número es positivo o
negativo (con el número 0 se considera positivo). Este bit es a menudo llamado el bit de signo. Al reconocer el papel
del bit de signo, podemos representar números positivos y negativos de 64 bits en términos de valor de las veces
poco una potencia de 2:

63 62 61 1 0
( X 63 2 )( X 62 2 )( X 61 2 ) ( X1 2 )( X0 2 )

El bit de signo se multiplica por - 2 63, y el resto de los bits se multiplica entonces por versiones positivas de sus
respectivos valores de base.

Conversión de binario a decimal


EJEMPLO
¿Cuál es el valor decimal del número complementario de este 64 bits de dos?

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100 dos

Sustituyendo valores de bits del número en la fórmula anterior: (


RESPONDER
63 62 61 1 1 0
1 2 )( 12 )( 12 ) (1 2 )( 02 )( 02 )
63 62 661 2
2 2 2 2 00
9 ,223 372
, 036
, 854, 775 80
, , 8 diez 9 ,223 372
, 036
, 8 , 554, 775 804
, diez

4 diez

Veremos un acceso directo para simplificar la conversión de negativo a positivo pronto. Al igual que una operación en

números sin signo puede desbordar la capacidad del hardware para representar el resultado, por lo que puede una operación

en dos números de complemento. Desbordamiento se produce cuando el extremo izquierdo retenido bit del patrón de bit

binario no es el mismo que el número infinito de dígitos a la izquierda (el bit de signo es incorrecta): a 0 a la izquierda de la

configuración de bits cuando el número es negativo o un 1 cuando el número es positivo.


2.4 Números y sin signo 79

Firmado frente sin firmar se aplica a las cargas, así como a la aritmética. los función de una carga firmado es copiar el Interfaz de
signo varias veces para llenar el resto del registro de la llamada extensión de signo -pero es propósito es colocar una
hardware /
representación correcta del número dentro de ese registro. cargas sin firmar simplemente se llenan de 0s a la
izquierda de los datos, ya que el número representado por el patrón de bits no está firmado. software

Cuando la carga de una palabra doble de 64 bits en un registro de 64 bits, el punto es discutible; cargas con y sin
signo son idénticos. ARMv8 sí ofrece dos sabores de cargas de bytes: byte de carga ( LDURB) trata el byte como un
número sin signo y por lo tanto cero se extiende para llenar los bits más a la izquierda del registro, mientras bytes de
carga firmado ( LDURSB)
trabaja con enteros con signo. Dado que los programas en C casi siempre utilizan bytes para representar los caracteres en lugar
de bytes consideran como enteros muy corto firmados, LDURB se utiliza prácticamente en exclusiva para cargas de bytes.

A diferencia de los números con signo discutidos anteriormente, las direcciones de memoria de forma natural comienzan Interfaz de
en 0 y siguen la dirección más grande. Dicho de otra manera, las direcciones negativas no tienen sentido. Así, los hardware /
programas quieren tratar a veces con los números que pueden ser positivas o negativas y algunas veces con los números
software
que pueden ser único positivo. Algunos lenguajes de programación refleja esta distinción. C, por ejemplo, los nombres de
los antiguos
(números enteros declarado long int largo en el programa) y el segundo enteros sin signo
( unsigned long long int). Algunas guías de estilo C incluso recomiendan declarar a los primeros como firmado int
largo, largo para mantener la distinción clara.

Vamos a examinar dos accesos directos útiles cuando se trabaja con números en complemento de dos. El
primer acceso directo es una forma rápida para negar número binario de complemento a dos. Simplemente invertir
todos los 0 a 1 y cada 1 a 0, a continuación, añadir uno al resultado. Este acceso directo se basa en la observación
de que la suma de un número y su representación invertida debe ser 111 ... 111 dos, lo que representa - 1. Desde xx
1,
por lo tanto xx 1 0 o X 1 X . (Utilizamos la notación X en el sentido invertido
cada bit en X de 0 a 1 y viceversa.)

EJEMPLO
La negación de acceso directo

negar 2 diez, y luego comprobar el resultado mediante la negación - 2 diez.

RESPONDER
2 diez = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010 dos
80 Capítulo 2 Instrucciones: Lenguaje del ordenador

La negación de este número mediante la inversión de los bits y la adición de uno,

En la otra dirección,

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110 dos

es primero invertida y luego incrementado:

Nuestra siguiente atajo nos dice cómo convertir un número binario representado en norte bits a un número
representado con más de norte Bits. El acceso directo es tomar el bit más significativo de la cantidad más pequeña,
el bit de signo y replicarlo para llenar los nuevos bits de la cantidad más grande. Los viejos trozos nonsign
simplemente se copian en la parte derecha de la nueva palabra doble. Este acceso directo se llama comúnmente firmar
extensión.

Firmar la extensión de acceso directo


EJEMPLO
Convertir de 16 bits versiones binarias de 2 diez y - 2 diez a números binarios de 64 bits.

La versión binaria de 16 bits del número 2 es


RESPONDER
00000000 00000010 dos = 2 diez

Se convierte en un número de 64 bits, haciendo 48 copias del valor en el bit más significativo (0) y la
colocación de que en la izquierda de la palabra doble. La parte derecha obtiene el valor de edad:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000010 dos = 2 diez
2.4 Números y sin signo 81

Vamos niega la versión de 16 bits de 2 usando el atajo anterior. Así,

0000 0000 0000 0010 dos

se convierte

1111 1111 1111 1101 dos


+ 1 dos

= 1111 1111 1111 1110 dos

La creación de una versión de 64 bits del número negativo significa copiar el bit de signo 48 veces y
colocarla a la izquierda:

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110 dos = - 2 diez

Este truco funciona porque de dos números en complemento positivo realmente tiene un número infinito de 0s a la
izquierda y de dos números en complemento negativos tienen un número infinito de 1s. El patrón de bits binario que
representa un número esconde bits iniciales para adaptarse a la anchura de la hardware; extensión de signo simplemente
restaura algunos de ellos.

Resumen
El punto principal de esta sección es que necesitamos para representar números enteros positivos y
negativos dentro de un ordenador, y aunque hay pros y contras a cualquier opción, la elección unánime
desde 1965 ha sido de complemento a dos.

Elaboración: Para los números decimales con signo, se utilizó “ - ”Para representar negativo porque no hay límites
para el tamaño de un número decimal. Dado un tamaño de datos fija, binario y hexadecimal (ver Figura 2.4 ) Cadenas
de bits pueden codificar la señal; por lo tanto, no utilizamos normalmente “+” o “ - ”Con la notación binaria o
hexadecimal.

¿Cuál es el valor decimal del número complementario de este 64 bits de dos? Examínese

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111000 dos

1) - 4 diez

2) - 8 diez

3) - dieciséis diez

4) 18.446.744.073.709.551.609 diez

Elaboración: complemento a dos debe su nombre a la regla de que la suma sin signo de una norte- número de bit y su
norte- bit negativo es 2 norte; Por lo tanto, la negación o complemento de una serie X es 2 norte - X, o su “complemento a dos.”
82 Capítulo 2 Instrucciones: Lenguaje del ordenador

complemento a uno Una Una tercera representación alternativa de complemento y signo y la magnitud de dos se llama complemento
notación que representa el valor
a uno . El negativo de complemento a uno se encuentra invirtiendo cada bit, de 0 a 1 y de 1 a 0, o X. Esta relación
más negativo por 10 ... 000 dos y el
ayuda a explicar su nombre desde el complemento de X es 2 norte - X - 1. También fue un intento de ser una solución
valor más positivo por 01 ... 11 dos, dejando
mejor que signo y magnitud, y varios equipos científicos tempranos hizo uso de la notación. Esta representación
un número igual de negativos y
positivos, pero terminando con es similar a la de complemento de dos excepto que también tiene dos 0s: 00 ... 00 dos
dos ceros, uno positivo (00 ... 00 dos)
es positivo 0 y 11 ... 11 dos es negativo 0. El número más negativo, 10 ... 000 dos,
y uno negativo (11 ... 11 dos).
representa - 2147483647 diez, y así los positivos y negativos están equilibrados. Uno de sumadores del complemento era
necesario un paso adicional para restar un número, y por lo tanto de complemento de dos domina hoy en día.

El término también se utiliza para Una última anotación, lo que vamos a ver cuando hablamos de punto flotante en Capítulo 3 ,
significar la inversión de cada bit en es representar el valor más negativo por 00 ... 000 dos y el valor más positivo en un 11 ... 11 dos, con 0 típicamente
un patrón: 0 a 1 y 1 a 0. tiene el valor 10 ... 00 dos. Esta representación se denomina
notación sesgada , ya que polariza el número tal que el número más el sesgo tiene una representación no

notación sesgada Una notación


negativo.
que representa el valor más
negativo por 00 ... 000 dos y el valor
más positivo en un 11 ... 11 dos, con
0 típicamente tiene el valor 10 ... 00 2.5 En representación de Instrucciones en el
dos, cargando de ese modo el
número de tal manera que el Computadora
número más el sesgo tiene una
representación no negativo.
Ahora estamos listos para explicar la diferencia entre la forma en que los seres humanos instruyen a las computadoras y la forma

en que los ordenadores ver instrucciones.

Las instrucciones se mantienen en el ordenador como una serie de señales electrónicas de alta y baja y pueden
ser representados como números. De hecho, cada pieza de una instrucción puede ser considerado como un
número individual, y la colocación de estos lado de los números a lado forma la instrucción. Los 32 registros de
LEGv8 sólo están contemplados por su número, de 0 a 31.

Traducción de una Instrucción Asamblea LEGv8 en una instrucción de máquina

EJEMPLO
Vamos a hacer el siguiente paso en el perfeccionamiento de la lengua LEGv8 como un ejemplo. Vamos a mostrar la
verdadera versión de idioma LEGv8 de la instrucción representado simbólicamente como

AÑADIR X9, X20, X21

primero como una combinación de números decimales y después de números binarios. La

representación decimal es

RESPONDER 1112 21 0 20 9
2.5 Representación de instrucciones en el ordenador 83

Cada uno de estos segmentos de una instrucción se llama campo. El primer campo (que contiene
1112 en este caso) le dice al ordenador LEGv8 que esta instrucción realiza una suma. El segundo campo
indica el número del registro que es el segundo operando de origen de la operación de suma (21 para X21),
y el cuarto campo da el otro operando fuente para la adición (20 para X20). El quinto campo contiene el
número del registro que va a recibir la suma (9 para X9). ( El tercer campo no se utiliza en esta
instrucción, por lo que se establece en 0.) Por lo tanto, esta instrucción suma registro X20 para registrarse
X21 y coloca la suma en el registro X9.

Esta instrucción también se puede representar como campos de números binarios en lugar de decimales:

10001011000 10101 000000 10100 01001


11 bits 5 bits 6 bits 5 bits 5 bits

Este diseño de la instrucción se denomina formato de instrucción . Como se puede ver en contar el número de formato de instrucción Una forma

bits, esta instrucción LEGv8 tarda exactamente 32 bits de una palabra-o la mitad de una palabra doble. De acuerdo de representación de una instrucción
compuesta de campos de números
con nuestro principio de diseño que favorece la regularidad simplicidad, todas las instrucciones LEGv8 son 32 bits de
binarios.
longitud.
Para distinguirlo de lenguaje ensamblador, llamamos a la versión numérica de las instrucciones Lenguaje de
máquina y una secuencia de tales instrucciones codigo de maquina. Lenguaje de máquina representación

Parecería que ahora estaría leyendo y escribiendo cadenas largas, tediosas de números binarios. Evitamos que binaria utilizada para la comunicación

el tedio mediante el uso de una base superior a binario que se convierte fácilmente en binario. Puesto que casi todos dentro de un sistema informático.

los tamaños de datos informáticos son múltiplos de 4, hexadecimal ( de base 16) números son muy populares. Como
base 16 es una potencia de 2, que trivialmente puede convertir mediante la sustitución de cada grupo de cuatro
dígitos binarios por un solo dígito hexadecimal, y viceversa. Figura 2.4 convierte entre hexadecimal y binario. hexadecimal Los números en base
16.

hexadecimal Binario hexadecimal Binario hexadecimal Binario hexadecimal Binario

0hex 0000two 4hex 0100two 8HEx 1000two Chex 1100two

1hex 0001two 5hex 0101two 9hex 1001two DHex 1101two

2hex 0010two 6HEX 0110two Ahex 1010two Ehex 1110two

3hex 0011two 7hex 0111two bhex 1011two fhex 1111two

FIGURA 2.4 La tabla de conversión hexadecimal-binario. Basta con sustituir un dígito hexadecimal por los correspondientes cuatro dígitos binarios, y viceversa. Si la longitud del
número binario no es un múltiplo de 4, ir de derecha a izquierda.

Debido a que con frecuencia tratamos con diferentes bases numéricas, para evitar confusiones, vamos a subíndice
con números decimales diez, con números binarios dos, y los números hexadecimales con maleficio. ( Si no hay un
subíndice, el valor predeterminado es de base 10.) Por cierto, C y Java utilizan los 0x notación nnnn para los números
hexadecimales.
84 Capítulo 2 Instrucciones: Lenguaje del ordenador

Binario a hexadecimal y Back


EJEMPLO
Convertir números binarios la siguiente hexadecimales de 8 dígitos y 32 bits en la otra base:

eca8 6420 maleficio


0001 0011 0101 0111 1001 1011 1101 1111 dos

Utilizando Figura 2.4 , La respuesta es simplemente una tabla de búsqueda de una manera:
RESPONDER
eca8 6420 maleficio

1110 1100 1010 1000 0110 0100 0010 0000 dos

Y entonces la otra dirección:

0001 0011 0101 0111 1001 1011 1101 1111 dos

1357 9bdf maleficio

Los campos LEGv8

LEGv8 campos se dan nombres para hacerlos más fáciles para discutir:

código de operación rm shamt rn rd


11 bits 5 bits 6 bits 5 bits 5 bits

Aquí está el significado de cada nombre de los campos en las instrucciones LEGv8:

código de operación El campo que norte código de operación : Funcionamiento básico de la instrucción, y esto es su abreviatura
indica la operación y el formato de una nombre tradicional.
instrucción.
norte rm: El segundo operando fuente de registro.

norte shamt: Cantidad de cambio. (Sección 2.6 explica las instrucciones y cambiar este término, sino que
no será utilizado hasta entonces, y por lo tanto el campo contiene cero en esta sección).

norte RN: El primer operando fuente de registro.

norte rd: El operando destino de registro. Se obtiene el resultado de la operación.


2.5 Representación de instrucciones en el ordenador 85

Un problema se produce cuando una instrucción necesita más campos que los mostrados anteriormente. Por ejemplo,
la instrucción registro de carga debe especificar dos registros y una constante. Si la dirección fuera a utilizar uno de los
campos de 5 bits en el formato anterior, la constante más grande dentro de la instrucción de registro de carga se limita a
sólo el 2 5 - 1 o 31. Esta constante se utiliza para seleccionar los elementos de las matrices o estructuras de datos, y que a
menudo tiene que ser mucho mayor que 31. Este campo de 5 bits es demasiado pequeño para ser útil.

Por lo tanto, tenemos un conflicto entre el deseo de mantener todas las instrucciones de la misma longitud y el
deseo de tener un formato de instrucción individual. Este conflicto nos lleva al último principio de diseño de hardware:

Diseño Principio 3: Un buen diseño exige buenos compromisos. El compromiso elegido por los diseñadores
LEGv8 es mantener todas las instrucciones de la misma longitud, lo que requiere formatos de instrucciones
distintas para distintos tipos de instrucciones. Por ejemplo, el formato anterior se llama R-tipo ( para el registro)
o
R-formato. Un segundo tipo de formato de instrucción es D-Tipo o D-formato y es utilizado por las instrucciones de
transferencia de datos (cargas y tiendas). Los campos de D-formato son

código de operación dirección op2 rn rt


11 bits 9 bits 2 bits 5 bits 5 bits

La dirección de 9 bits significa una instrucción de registro de carga se puede cargar cualquier palabra doble dentro
de una región de ± 2 8 o 256 bytes ( ± 2 5 o 32 palabras dobles) de la dirección en la base de registro de Rn. Vemos que más
de 32 registros serían difíciles en este formato, ya que los campos Rn y RT tendrían cada uno necesita un bit adicional,
haciendo más difícil de encajar todo en una sola palabra. (El último campo de tipo D se llama Rt en lugar de Rd porque
para almacenar instrucciones, el campo indica una fuente de datos y no un destino de datos.)

Veamos la instrucción registro de carga de la página 72:

X9 LDUR, [X22, # 64] // X9 reg temporal para crear una [8]

Aquí, 22 (por X22) se coloca en el campo Rn, 64 se coloca en el campo de dirección, y 9 (para X9) se coloca en el
campo Rt. Tenga en cuenta que en una instrucción de registro de carga, el campo especifica el Rt destino registrar,
que recibe el resultado de la carga.
También necesitamos un formato para las instrucciones inmediatas ADDI, SUBI, e instrucciones inmediatas que daremos
a conocer más adelante. Mientras que podríamos haber utilizado la instrucción D-formato, ya que tiene un campo de 9 bits
que sostiene una constante, los arquitectos ARMv8 decidieron que sería útil disponer de un campo inmediato más grande
para estas instrucciones, incluso afeitarse un poco del campo de código de operación para hacer una de 12 bits inmediata.
Los campos de inmediato o Yo tecleo formato son

código de operación inmediato rn rd


10 bits 12 bits 5 bits 5 bits

A pesar de múltiples formatos complican el hardware, podemos reducir la complejidad, manteniendo los formatos
similares. Por ejemplo, los dos últimos campos de los tres formatos son el tamaño idéntico y casi los mismos nombres,
y el campo de código de operación es del mismo tamaño en dos de los tres formatos.
86 Capítulo 2 Instrucciones: Lenguaje del ordenador

En caso de que se preguntan, los formatos se distinguen por los valores en el primer campo: cada formato se
le asigna un conjunto distinto de valores en el primer campo (código de operación) para que el hardware sabe
cómo tratar el resto de la instrucción. Figura 2.5
muestra los números utilizados en cada campo de las instrucciones LEGv8 cubiertas hasta ahora.

Instrucción Formato de código de operación dirección shamt Rm op2 Rn rd

ADD ( añadir) RR 1112 diez reg 0 n/A n/A reg reg

SUB ( sustraer) 1624 diez reg 0 n/A n/A reg reg

ADDI ( añadir inmediata) yo 580 diez reg n/A constante n/A reg n/A

SUBI ( sub inmediata) yo 836 diez reg n/A dirección na 0 reg n/A

LDUR ( palabra de carga) re 1986 diez reg n/A de 0 reg n/A

STUR ( tienda de palabra) re 1984 diez reg n/A constante reg n/A

Figura 2.5 LEGv8 codificación de instrucciones. En la tabla anterior, “reg” significa un número entre 0 y registro
31, “dirección” significa una dirección de 9 bits o 12 bits constante, y “na” (no aplicable) significa este campo no aparece en este formato. El campo op2 expande el
campo de código de operación.

Traduciendo LEGv8 lenguaje ensamblador en lenguaje de máquina


EJEMPLO
Ahora podemos tomar un ejemplo de todo el camino de lo que el programador escribe a lo que
ejecuta el ordenador. Si X10 tiene la base de la matriz UNA y X21
corresponde a h, la instrucción de asignación

A [30] = h + A [30] + 1;

se compila en

X9 LDUR, [X10, # 240] // X9 reg temporal para crear una [30] AÑADIR X9, X21, X9
// X9 reg Temporal consigue h + A [30]
X9 ADDI, X9, # 1 // X9 reg Temporal consigue h + A [30] 1
STUR X9, [X10, # 240] // tiendas H + A [30] 1 de nuevo en A [30]

¿Cuál es el código de lenguaje de máquina LEGv8 para estas tres instrucciones? Para mayor comodidad, vamos a

primeras representan las instrucciones en lenguaje máquina utilizando números decimales. Desde Figura 2.5 ,
RESPONDER
Podemos determinar las instrucciones en lenguaje máquina de tres:

código de operación Rm / dirección shamt / op2 rn Rd / Rt

1986 240 0 10 9

1112 9 0 21 9

580 1 9 9

1984 240 0 10 9
2.5 Representación de instrucciones en el ordenador 87

los LDUR instrucción se identifica por 1986 (ver Figura 2.5 ) En el primer campo
(Código de operación). El registro de base 10 se especifica en el cuarto campo (Rn), y el registro de destino 9 se
especifica en el último campo (Rt). El desplazamiento para seleccionar A [30]
(240 = 30 × 8) se encuentra en el segundo campo (dirección). los AÑADIR instrucción que sigue se especifica
con 1,112 en el primer campo (código de operación). Los tres operandos registro (9, 21, y 9) se encuentran
en el segundo campos, cuarto, y quinto, con 0 en el tercer campo (shamt).

El seguimiento ADDI la instrucción se especifica con 580 en el primer campo (código de operación), el valor
inmediato 1 en el segundo, y los operandos de registro (9 en ambos casos) en los dos últimos campos.

los STUR instrucción se identifica con 1,984 en el primer campo. El resto de esta instrucción final
es idéntica a la LDUR instrucción.
Desde 240 diez = 0 1111 0000 dos, el binario equivalente a la forma decimal es:

111110000 1 0 011110000 00 01010 01001

10001011000 01001 000000 10101 01001

1001000100 000000000001 01001 01001

111110000 0 0 011110000 00 01010 01001

Tenga en cuenta la similitud de las representaciones binarias de las primeras y últimas


instrucciones. La única diferencia está en el décimo bit de la izquierda, que se destaca aquí.

Elaboración: programadores de lenguaje ensamblador ARMv8 no están obligados a utilizar ADDI


cuando se trabaja con constantes. El programador escribe simplemente AÑADIR, y el ensamblador genera el código de operación
adecuada y el formato de la instrucción apropiada en función de si los operandos son todos los registros (R-formato) o si se trata
de una constante (formato I). Usamos los nombres explícitos en LEGv8 para los diferentes códigos de operación y formatos
como creemos que es menos confuso cuando se introduce el lenguaje ensamblador frente a lenguaje de máquina.

Elaboración: Tenga en cuenta que a diferencia de MIPS, el campo inmediato LEGv8 en formato I se zeroextended. Por lo tanto,
LEGv8 incluye tanto ADDI y SUBI instrucciones, mientras que acaba de MIPS

ADDI y ambos immediates positivos y negativos.

El deseo de mantener todas las instrucciones de los mismos conflictos de tamaño con el deseo de tener tantos registros como Interfaz de
sea posible. Cualquier aumento en el número de registros utiliza por lo menos un poco más en todos los campos del registro
hardware /
del formato de instrucción. Teniendo en cuenta estas limitaciones y el principio de diseño que más pequeño es más rápido,
más instrucción establece hoy en día tienen 16 o 32 registros de propósito general. software
88 Capítulo 2 Instrucciones: Lenguaje del ordenador

Figura 2.6 resume las porciones de lenguaje de máquina LEGv8 se describe en esta sección. Como
veremos en el Capítulo 4 , La similitud de las representaciones binarias de instrucciones relacionadas simplifica
el diseño de hardware. Estas similitudes son otro ejemplo de la regularidad en la arquitectura LEGv8.

LEGv8

nombre de formato Ejemplo comentarios

AÑADIR R 1112 3 0 2 1 ADD X1, X2, X3

SUB R 1624 3 0 2 1 X1 SUB, X2, X3

ADDI yo 580 100 2 1 X1 ADDI, X2, # 100

SUBI yo 836 100 2 1 SUBI X1, X2, # 100

LDUR re 1986 0 2 1 LDUR X1, [X2, # 100]

STUR re 1984 0 2 1 STUR X1, [X2, # 100]


Tamaño del campo 11 o 10 bits 5 bits 5 o100
100 4 bits 2 bits 5 bits 5 bits Todas las instrucciones ARM son de 32 bits de largo

R-formato R código de operación rm shamt rn rd formato de instrucción aritmética

I-formato yo código de operación dirección rn rd formato inmediata

D-formato re código de operación inmediata op2 rn rt Formato de transferencia de datos

FIGURA arquitectura 2,6 LEGv8 revela a través de la Sección 2,5. Los tres formatos de instrucciones LEGv8 hasta ahora son R, I y D. Los últimos 10 bits contienen una rn terreno, dando una de las
fuentes; y el rd o rt campo, que especifica el registro de destino, a excepción de tienda de registro, donde se especifica el valor que se almacena. R-formato divide el resto en un código de operación de 11 bits;
un 5 bits rm campo, especificando el otro operando fuente; y un 6 bits shamt campo, lo que explica la Sección 2.6. I-formato combina 12 bits en un único inmediato campo, lo que requiere la reducción del campo
de código de operación de 10 bits. El D-formato utiliza un código de operación de 11 bits completo como el R-formato, además de un 9 bits dirección campo, y un 2 bits op2 campo. El campo op2 es
lógicamente una extensión del campo de código de operación.

GRANDE
Los ordenadores actuales se basan en dos principios fundamentales:
los
1. Las instrucciones se representan como números.
Imagen
2. Los programas se almacenan en la memoria para ser leída o escrita, al igual que datos. Estos
principios conducen a la -Programa almacenado concepto; su invención dejó el genio de computación
fuera de su botella. Figura 2.7 muestra el poder del concepto; específicamente, la memoria puede
contener el código fuente de un programa editor, el código máquina compilado correspondiente, el
texto que el programa compilado está utilizando, e incluso el compilador que generó el código
máquina.

Una consecuencia de instrucciones de como números es que los programas a menudo se envían como
archivos de números binarios. La implicación comercial es que los ordenadores pueden heredar el software ya
hecho siempre que sean compatibles con un conjunto de instrucciones existente. Tal “compatibilidad binaria” a
menudo conduce industria para alinear en torno a un pequeño número de arquitecturas de conjuntos de
instrucciones.
2.5 Representación de instrucciones en el ordenador 89

Memoria

programa de contabilidad
(codigo de maquina)

programa de edición
(código máquina)

C compilador

Procesador (código máquina)

datos de nómina

libro de texto

El código fuente en C para el


programa editor

FIGURA 2.7 El concepto de programa almacenado. programas almacenados permiten que un ordenador que realiza la contabilidad hasta convertirse, en un
abrir y cerrar de ojos, un equipo que ayuda a un autor escribir un libro. El cambio sucede simplemente por la carga de la memoria con los programas y los datos y
luego decirle a la computadora para comenzar a ejecutar en un lugar determinado en la memoria. El tratamiento de las instrucciones de la misma manera que los
datos simplifica en gran medida tanto el hardware y el software de memoria de los sistemas informáticos. En concreto, la tecnología de memoria necesaria para
los datos también se puede utilizar para los programas, y los programas como compiladores, por ejemplo, puede traducir el código escrito en una notación mucho
más conveniente para los seres humanos en un código que el ordenador puede entender.

Lo LEGv8 instrucción representa esto? Elegir una de las cuatro opciones siguientes. Examínese

código de operación rm shamt rn rd


1624 9 0 10 11

1. SUB X9, X10, X11

2. AÑADIR X11, X9, X10

3. SUB X11, X10, X9

4. SUB X11, X9, X10

Elaboración: Es posible que se esté preguntando por qué el campo de código de operación LEGv8 es tan grande dado el modesto
número de instrucciones en Figura 2.1 ? La razón principal es que el conjunto completo de instrucciones ARMv8 es muy grande;
dependiendo de cómo se cuente, es del orden de 1000 instrucciones. Vamos a examinamos la instrucción ARMv8 completo ubicado
en una de las últimas secciones de este capítulo y en los capítulos 3 y 5.
90 Capítulo 2 Instrucciones: Lenguaje del ordenador

2.6 Operaciones lógicas

“Por el contrario,” A pesar de que los primeros ordenadores operados en palabras llenas, pronto se hizo evidente que era útil para operar en
continuó Tweedledee, “si campos de bits dentro de una palabra o incluso en bits individuales. Examen de caracteres dentro de una palabra, cada uno
fuera así, podría ser; y si de los cuales se almacenan como 8 bits, es un ejemplo de tal operación (véase la Sección 2.9). De ello se desprende que
fuera así, las operaciones se han añadido a los lenguajes de programación y arquitecturas del conjunto de instrucciones para
sería; pero como no es simplificar, entre otras cosas, el embalaje y desembalaje de bits en palabras. Estas instrucciones se denominan
así, no lo es. Esa es
la lógica “. operaciones lógicas. Figura 2.8 muestra operaciones lógicas en C, Java, y LEGv8.
Lewis Carroll,
Las aventuras de Alicia en el
Las operaciones lógicas operadores C operadores de Java instrucciones LEGv8
País de las Maravillas, 1865
Desviación a la << << LSL
izquierda de bits de >> >>> LSR
desplazamiento por bit a la derecha y y y Y, ANDI
Bit por bit OR | | OR, ORI
Bit por bit NO ~ ~ EOR, EORI

Figura 2.8 C y Java operadores lógicos y sus instrucciones LEGv8 correspondientes. Una forma de implementar NO es utilizar
EOR con un operando siendo todos unos (FFFF FFFF FFFF FFFF maleficio).

La primera clase de este tipo de operaciones se llama turnos. Se mueven todos los bits en una palabra doble a la
izquierda oa la derecha, llenando los bits vacíos con 0s. Por ejemplo, si el registro X19 contenida

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001001 dos = 9 diez

y la instrucción a desplazan a izquierda por 4 fue ejecutado, el nuevo valor sería:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 10010000 dos = 144 diez

El dual de un desplazamiento a la izquierda es un desplazamiento a la derecha. Los nombres reales de las dos instrucciones de

desplazamiento son LEGv8 desplazamiento lógico a la izquierda ( LSL) y derecho desplazamiento lógico ( LSR). La siguiente

instrucción realiza la operación anterior, si el valor original en el registro X19

y el resultado debe ir en el registro X11:

LSL X11, X19, # 4 // reg X11 = reg X19 << 4 bits

Nos retrasamos explicar la shamt campo en el R-formato. Se utiliza en operaciones de desplazamiento, lo que representa Cantidad

de cambio. Por lo tanto, la versión de lenguaje de máquina de la instrucción anterior es:

código de operación rm shamt rn rd


1691 0 4 19 11
2.6 Operaciones lógicas 91

La codificación de LSL es 1691 en el campo de código de operación, Rd contiene 11, Rn contiene 19, y shamt contiene 4. El
campo Rm no se utiliza y por lo tanto se establece en 0.
Desplazamiento a la izquierda lógico proporciona un beneficio adicional. Cambiantes dada por yo los bits da el resultado
idéntico que multiplicar por 2 yo, tal como cambiando un número decimal por yo dígitos es equivalente a multiplicar por 10 yo. Por
ejemplo, el anteriormente LSL turnos por 4, lo que da el mismo resultado que multiplicar por 2 4 o 16. El primer patrón de bits
anterior representa 9, y 9 × dieciséis
= 144, el valor de la segunda patrón de bits. Otra operación útil que aísla campos es Y . ( Capitalizamos
la palabra para evitar la confusión entre la operación y la conjunción Inglés.) Y es una operación de Y Una operación de bit bit por
bit por bit que deja un 1 en el resultado sólo si los dos bits de los operandos son caso lógico con dos operandos
que calcula un 1 sólo si hay un
1 en
1. Por ejemplo, si el registro X11 contiene
ambos operandos.

00000000 00000000 00000000 00000000 00000000 00000000 00001101 11000000 dos

y registrar X10 contiene

00000000 00000000 00000000 00000000 00000000 00000000 00111100 00000000 dos

entonces, después de ejecutar la instrucción LEGv8

Y X9, X10, X11 // reg X9 = reg X10 X11 & registro

el valor del registro X9 sería

00000000 00000000 00000000 00000000 00000000 00000000 00001100 00000000 dos

Como se puede ver, y puede aplicar un patrón de bits a un conjunto de bits de forzar 0s donde hay un 0 en el patrón
de bits. Tal patrón de bits en conjunción con y se llama tradicionalmente una máscara, ya que la máscara “oculta”
algunos bits.
Para poner un valor en uno de estos mares de 0s, existe el doble de Y, llamado O . O Una operación de bit bit por
Se trata de una operación de bit por bit que coloca un 1 en el resultado si ya sea bit operando es un 1. Elaborar, caso lógico con dos operandos

si los registros X10 y X11 son sin cambios desde el ejemplo anterior, el resultado de la instrucción LEGv8 que calcula un 1 si hay un 1 en ya
sea
operando.

La ORR X9, X10, X11 // reg X9 = reg X10 | reg X11

Es este valor en el registro X9:

00000000 00000000 00000000 00000000 00000000 00000000 00111101 11000000 dos

La operación lógica final es una contraria. NO toma un operando y coloca un 1 en el resultado si un bit NO Una operación de bit bit por
operando es 0, y viceversa. Utilizando la notación anterior, se calcula X. caso lógico con un operando que
invierte los bits; es decir, se
reemplaza cada 1 con un 0, y
cada 0 con un 1.
92 Capítulo 2 Instrucciones: Lenguaje del ordenador

EOR Una operación de bit bit por De acuerdo con el formato de tres operandos, los diseñadores de ARMv8 decidieron incluir la
caso lógico con dos operandos que instrucción EOR ( O exclusiva) en lugar de NO. Desde crea exclusiva o un 0 cuando los bits son
calcula el OR exclusivo de los dos
los mismos y un 1 si son diferentes, el equivalente a no es un EOR 111 ... 111. Si el registro X10 es
operandos. Es decir, se calcula un
igual a la del ejemplo anterior y registro X12
1 sólo si los valores son diferentes
en los dos operandos.
tiene el valor 0, el resultado de la instrucción LEGv8

EOR X9, X10, X12 // reg X9 = reg X10 | reg X12

Es este valor en el registro X9:

00000000 00000000 00000000 00000000 00000000 00000000 00110001 11000000 dos

Figura 2.8 anterior muestra la relación entre los operadores C y Java y las instrucciones LEGv8. Las
constantes son útiles en operaciones lógicas, así como en operaciones aritméticas, por lo LEGv8
también proporciona las instrucciones e inmediata
( Y YO), o inmediata ( ORRI), y exclusiva o inmediata ( EORI).

Elaboración: C permite campos de bits o campos para ser definida dentro de palabras dobles, ambos objetos que permiten ser
empacados dentro de una palabra doble y para que coincida con una interfaz forzada externamente tal como un dispositivo de I / O. Todos

los campos deben caber dentro de una única palabra doble. Los campos son enteros sin signo que puede ser tan corto como de 1 bit.

Compiladores de C insertar y campos de extracto utilizando instrucciones lógicas en LEGv8: Y, la ORR, LSL, y LSR.

Elaboración: Los campos inmediatos para ANDI, ORRI, y EORI del conjunto completo de instrucciones ARMv8 no son simples
immediates de 12 bits. Una vez más, como ARMv7, tiene la característica inusual de la utilización de un algoritmo complejo para
la codificación de valores inmediatos; ARMv8 lo hace con la repetición de patrones. Esto significa que algunas constantes
pequeños (por ejemplo, 1, 2, 3,
4, y 6) son válidos, mientras que otros (por ejemplo, - 1, 0, 5) no lo son. LEGv8 simplemente utiliza immediates 12 bits
normales que se encuentran en ADDI. Esta diferencia significa X1 EORI, X1, # 5 es legal para LEGv8 pero no ARMv8. Una vez
más, además de su rareza entre otros conjuntos de instrucciones, se omite la codificación inmediata, ya que complicaría los
caminos de datos en Capítulo 4
significativamente.

ExamíneseLas operaciones que se pueden aislar a un campo de una doble palabra?

1. Y

2. Un desplazamiento a la izquierda seguido de un desplazamiento a la derecha


2.7 Instrucciones para tomar decisiones 93

Elaboración: A diferencia de casi todas las otras arquitecturas de computadora, ARMv8 (y ARMv7) permite un registro para ser
desplazado como parte de una operación aritmética o lógica de instrucciones: añadir una opcionalmente cambió registrarse, restar un
opcionalmente cambió registrar y opcionalmente un registro cambió, y así sucesivamente. Dado que esta combinación es inusual en
arquitecturas de computadora y no generan con frecuencia por los compiladores - y puesto que el apoyo sería hacer la ruta de datos
en Capítulo 4 mucho más complicado ya diferencia de otros caminos de datos de la computadora - decidimos tratar turnos como
instrucciones por separado, ya que se encuentra en prácticamente todos los demás la arquitectura de computadores. Si bien se puede
sintetizar un cambio utilizando AÑADIR con XZR o O con XZR,

sería confuso para utilizar el mismo código de operación para los turnos como AÑADIR o O. Por lo tanto, seguimos la
recomendación de utilizar un ARMv8 UBFM ( sin signo de movimiento de campo de bits) de instrucciones y su código de
operación. Simplificamos los valores puestos en los campos shamt Rm y que es 0 y la cantidad de desplazamiento inmediata
real, que es lo que parece en lenguaje ensamblador ARMv8. Los valores reales en el Rm y campos de shamt UBFM debe ser
(cantidad -shift MOD
64) y (63 - cantidad de desplazamiento) para LSL y cambiar la cantidad y 63 para LSR. El campo de código de operación incluye parte del
campo inmediato en ARMv8, por lo que hacen los dos códigos de operación 1691 y
1690, respectivamente, para distinguirlos.

2.7 Las instrucciones para la Toma de Decisiones

Lo que distingue a un ordenador desde una simple calculadora es su capacidad para tomar decisiones. Sobre la La utilidad de un equipo
base de los datos de entrada y los valores creados durante el cálculo, las instrucciones se ejecutan diferentes. La automático radica en la posibilidad
toma de decisiones está representado comúnmente en los lenguajes de programación utilizando el Si declaración, a de utilizar una secuencia dada de
veces combinado con ir instrucciones repetidas ocasiones,
declaraciones y etiquetas. LEGv8 lenguaje ensamblador incluye dos instrucciones de toma de decisiones, de forma el número de veces que se repite
similar a una Si comunicado con una ir. La primera instrucción es si depende de los resultados de la
computación. ... Esta elección
registro CBZ, L1 puede hacerse depender de la
señal de un número (cero siendo
Este medio de instrucción de ir a la instrucción con etiqueta L1 si el valor de registro
estimado como más para los
es igual a cero. el nemotécnico CBZ representa comparar y rama si es cero. La segunda instrucción es
propósitos de la máquina). En
consecuencia, se introduce un
CBNZ registro, L1 [instrucción] (la transferencia
condicional [instrucción]), que,
Significa ir a la instrucción con etiqueta L1 si el valor de registro hace no igual a cero. el nemotécnico CBNZ representa
dependiendo de la señal de un
comparar y rama si no es cero. Estas dos instrucciones se llaman tradicionalmente ramas
número dado, causar la adecuada
condicionales .
una de las dos rutinas para ser
ejecutados.

Burks, Goldstine, y von


Neumann, 1947
94 Capítulo 2 Instrucciones: Lenguaje del ordenador

compilar if-then-else en ramas condicionales


RESPUESTA
En el siguiente segmento de código, F, sol, h, yo, y j son variables. Si las cinco variables
F mediante j corresponden a los cinco registros X19 mediante X23, lo que es el código compilado para este
LEGv8 C Si ¿declaración?

si (i == j) f = g + h; otro f = g - h;

Figura 2.9 muestra un diagrama de flujo de lo que el código LEGv8 debe hacer. La primera expresión
Ejemplo compara la igualdad entre dos variables en los registros. Teniendo en cuenta que las instrucciones
anteriores sólo pueden probar para ver si un registro es cero, el primer paso es restar j desde yo para
probar si la diferencia es cero. Parecería que nos próxima querer expandirse si la diferencia es cero ( CBZ).
En general, el código será más eficiente si se prueba para la condición opuesta a la rama sobre el código
que se ramifica si la diferencia es no igual a cero ( CBNZ). Aquí están las dos instrucciones, con registro X9 para
mantener el resultado de restar j desde yo:
bifurcación condicional Una
instrucción que pone a prueba un
valor y que permite una posterior
X9 SUB, X22, X23 // X9 = i - j
transferencia del control a una nueva
CBNZ X9, Else // ir a Else si i ≠ j (X9 ≠ 0)
dirección en el programa basado en
el resultado de la prueba.
La siguiente instrucción de asignación realiza una sola operación, y si todos los operandos son
asignados a los registros, es una sola instrucción:

AÑADIR X19, X20, X21 // f = g + h (omitidos si i ≠ j)

Ahora tenemos que ir hasta el final de la Si declaración. En este ejemplo se introduce otro tipo de
rama, a menudo llamada salto incondicional. Esta instrucción dice que el procesador siempre sigue
la rama. Para distinguir entre las ramas condicionales e incondicionales, el nombre LEGv8 para
este tipo de instrucción es rama, abreviado como B ( la etiqueta Salida se define a continuación).

B Salir // ir hasta la salida

La instrucción de asignación en el más porción de la Si declaración de nuevo se puede compilar en una sola
instrucción. Sólo tenemos que añadir la etiqueta Más a esta instrucción. También se muestra la etiqueta Salida es
decir después de esta instrucción, que muestra el extremo de la if-then-else código compilado:

Otra cosa: SUB X19, X20, X21 // f = g - h (omite si i = j)

Salida:

Observe que el ensamblador alivia el compilador y el programador de lenguaje ensamblador del tedio de
cálculo de direcciones para las ramas, igual que lo hace para el cálculo de direcciones de datos para cargas y
tiendas (véase la Sección 2.12).
2.7 Instrucciones para tomar decisiones 95

i=j yo ≠ j
i = = j?

Más:

f=g+h f = g-h

Salida:

Figura 2.9 Ilustración de las opciones en el Si declaración anterior. El cuadro de la izquierda corresponde a la entonces parte de Si declaración,
y el cuadro de la derecha corresponde a la más parte.

Los compiladores crean con frecuencia ramas y etiquetas en las que no aparecen en el lenguaje de programación. Interfaz de
Evitar la carga de escribir las etiquetas y ramas explícitas es uno de los beneficios de la escritura en los lenguajes
hardware /
de programación de alto nivel y es una razón de codificación es más rápido en ese nivel.
software

bucles
Las decisiones son importantes tanto para elegir entre dos alternativas encontraron en Si
declaraciones y para la iteración de un cálculo, que se encuentra en bucles. Las mismas instrucciones de montaje son los
bloques de construcción para ambos casos.

la compilación de una mientras Loop en C


EJEMPLO
Aquí es un bucle tradicional en C:

while (guardar [i] == k)


i + = 1;

Asumir que yo y k corresponden a los registros X22 y X24 y la base de la matriz salvar es en X25. ¿Cuál
es el código de montaje LEGv8 correspondiente a este código C?

El primer paso es cargar guardar [i] en un registro temporal. Antes de que podamos cargar
guardar [i] en un registro temporal, necesitamos tener su dirección. Antes de poder añadir yo a la base de la matriz salvar para RESPONDER
formar la dirección, debemos multiplicar el índice yo un 8 debido a la cuestión direccionamiento de byte.
Afortunadamente, podemos usar el desplazamiento de
96 Capítulo 2 Instrucciones: Lenguaje del ordenador

izquierdo, desde cambiantes dada por 3 bits se multiplica por 2 3 o 8 (en la página 91 en la sección anterior). Tenemos
que añadir la etiqueta Lazo a ella de manera que podamos ramificarse de nuevo a esa instrucción al final del bucle:

Loop: LSL X10, X22, # 3 // Temp de reg X10 = i * 8

Para obtener la dirección de guardar [i], tenemos que añadir X10 y la base de ahorrar en
X25:

AÑADIR X10, X10, X25 // X10 = Dirección de parada [i]

Ahora podemos usar esa dirección para cargar guardar [i] en un registro temporal:

LDUR X9, [X10, # 0] // Temp de reg X9 = guardar [i]

La siguiente instrucción resta k desde guardar [i] y pone la diferencia en X11


para establecer la prueba de bucle. Si X11 no es 0, entonces ellos son desiguales ( guardar [i] ≠ k):

SUB X11, X9, X24 // X11 = guardar [i] - k

La siguiente instrucción realiza la prueba de bucle, que sale si guardar [i] ≠ k:

CBNZ X11, Salir // ir hasta la salida si guardar [i] ≠ k (X11 ≠ 0)

La siguiente instrucción suma 1 a yo:

ADDI X22, X22, # 1 // i = i + 1

El extremo de las ramas de bucle de vuelta a la mientras prueba en la parte superior del bucle. Simplemente añadimos el Salida

etiqueta después de ella, y hemos terminado:

segundo Lazo // ir a Loop

Salida:

(Ver los ejercicios para una optimización de esta secuencia.)

Interfaz de Tales secuencias de instrucciones que terminan en una rama son tan fundamentales para la compilación que se les da su

hardware / propia palabra de moda: una bloque básico es una secuencia de instrucciones sin ramas, excepto, posiblemente, en el
extremo, y sin sucursal objetivos o etiquetas de rama, excepto posiblemente por el principio. Una de las primeras fases
software
tempranas de la compilación está rompiendo el programa en bloques básicos.

bloque básico Una secuencia de


instrucciones sin ramas (excepto,
posiblemente, al final) y sin objetivos
de las ramificaciones o etiquetas de
ramificación (excepto, posiblemente,
al principio).
2.7 Instrucciones para tomar decisiones 97

La prueba para la igualdad o desigualdad es probablemente la prueba más popular, pero hay muchas otras
relaciones entre dos números. Por ejemplo, una para bucle puede querer poner a prueba para ver si la variable de
índice es menor que 0. El conjunto completo de comparaciones es menor que (<), menos de o igual ( ≤), mayor que
(>), mayor que o igual ( ≥), igual (=), y no igual ( ≠).

La comparación de patrones de bits también debe hacer frente a la dicotomía entre los números con y sin
signo. A veces, un patrón de bits con un 1 en el bit más significativo representa un número negativo y, por
supuesto, es menor que cualquier número positivo, que debe tener un 0 en el bit más significativo. Con enteros
sin signo, por el contrario, un 1 en el bit más significativo representa un número que es mayor que cualquiera
que comienza con un 0. (pronto Tomaremos ventaja de este doble significado del bit más significativo para
reducir el costo de la comprobación de los límites de la matriz.)

Arquitectos hace mucho descubierto la manera de manejar todos estos casos, manteniendo sólo cuatro bits adicionales que

registran lo que ocurrió durante una instrucción. Estos cuatro bits añadidos, llamados códigos de condición o banderas, son

llamados:

norte negativo (N) - el resultado de que establece el código de condición tenía un 1 en el bit más significativo;

norte cero (Z) - el resultado de que establece el código de condición era 0;

norte desbordamiento (V) - el resultado de que establece el código de condición se desbordó; y

norte llevar a (C) - el resultado de que establece el código de condición tuvo un acarreo fuera del bit más significativo
o un acarreo en el bit más significativo.

ramas condicionales a continuación, utilizar combinaciones de estos códigos de condición para llevar a cabo los
conjuntos deseados. En LEGv8, esta instrucción de salto condicional es B.cond. cond
puede ser utilizado por cualquiera de las instrucciones de comparación firmados: EQ (= o igual), Nebraska

( ≠ o no igual), LT (< o menor que), LE (≤ o menor que o igual), GT (> o mayor que), o GE (≥ o mayor o
igual). También puede ser utilizado para la instrucción de comparación sin signo: LO (< o bajo), LS
(≤ o inferior o igual), HOLA
(> O superior), o SA (≥ o superior o igual). Si la instrucción que establece los códigos de condición fue una de
resta (AB), Figura 2.10 muestra las instrucciones LEGv8 y los valores de los códigos de condición que realizan el
conjunto completo de comparaciones de números con signo y sin signo.

Además de las 10 instrucciones de ramificación condicional en Figura 2.10 , LEGv8 incluye


estas cuatro ramas para completar la prueba de los bits de código de condición individuales:

norte Rama de menos ( B.MI): N = 1;

norte Rama de más ( B.PL): N = 0;

norte Poder en el set de rebose ( B.VS): V = 1;

norte Rama de desbordamiento clara ( B.VC): V = 0.

Una alternativa a los códigos de condición es tener instrucciones que comparan dos registros y luego se
ramifican en función del resultado. Una segunda opción es comparar dos registros y establecer un tercer registro a
un resultado que indica el éxito de la comparación,
98 Capítulo 2 Instrucciones: Lenguaje del ordenador

números con signo números sin signo

Comparación Instrucción Prueba de CC Instrucción Prueba de CC

= B.EQ Z=1 B.EQ Z=1

≠ B.NE Z=0 B.NE Z=0

< B.LT N! = V B.LO C=0

≤ B.LE ~ De (Z = 0 y N = V) B.LS ~ (Z = 0 y C = 1)

> B.GT (Z = 0 y N = V) B.HI (Z = 0 y C = 1)

≥ B.GE N=V B.HS C=1

FIGURA 2.10 Cómo hacer todas las comparaciones si la instrucción que establece los códigos de condición fue una de resta. Si se trataba de
una AÑADIR o Y, la prueba es simplemente en el resultado de la operación en comparación con cero. por Y, C y V siempre se establecen en 0.

que una instrucción de bifurcación condicional posterior a continuación, pone a prueba para ver si el registro no es cero
(condición es verdadera) o cero (condición es falsa). ramas condicionales en MIPS siguen el último enfoque (véase la
Sección 2.16).
Una desventaja de los códigos de condición es que si muchas instrucciones siempre se los puso, se creará
dependencias que harán más difícil para la ejecución segmentada (véase Capítulo 4 ). Por lo tanto, limita LEGv8
código de condición (bandera) establecer a unos pocos instrucciones- ADD, ADDI, Y, ANDI, SUB, y SUBI -e incluso
entonces ajuste del código de condición es opcional. En lenguaje ensamblador LEGv8, sólo tiene que anexar una S al
final de una de estas instrucciones si desea establecer códigos de condición: Agrega, ADIS, ANDS, ANDIS, submarinos, y Subis.
El nombre de la instrucción realmente utiliza la bandera plazo, por lo que el nombre propio de ADDS es “agregar y
configurar las banderas”.

Comprobación de límites de acceso directo

El tratamiento de números con signo como si estuvieran sin signo nos da una manera de bajo costo de verificar si es 0 ≤ x
< Y, que coincide con el índice de la salida de la cancha para las matrices. La clave es que los enteros negativos en
notación de complemento a dos se ven como grandes números en notación sin firmar; es decir, el bit más significativo es
un bit de signo en la antigua notación pero una gran parte del número en el segundo. Por lo tanto, una comparación sin
signo de x <y comprueba si X es negativo, así como si X es menos que y.

Utilice este método abreviado para reducir un índice de salida de los límites de control: la rama de
EJEMPLO Índice fuera de los límites Si X20 X11 ≥ o si X20 es negativo.

El código de verificación sólo utiliza sin signo mayor que o igual a hacer las dos verificaciones:
RESPONDER
SUBS XZR, X20, X11 // prueba si X20> = longitud o X20 <0
B.HS IndexOutOfBounds // si el mal, Error Goto
2.7 Instrucciones para tomar decisiones 99

Caso / sentencia switch


La mayoría de los lenguajes de programación tienen una caso o cambiar declaración que permite al programador seleccionar una
de las muchas alternativas en función de un solo valor. La forma más sencilla de implementar cambiar es a través de una
secuencia de pruebas condicionales, convirtiendo el
cambiar declaración en una cadena de if-then-else declaraciones.
A veces las alternativas pueden codificarse de manera más eficiente como una tabla de direcciones de
secuencias de instrucciones alternativa, llamada tabla de direcciones rama o tabla de direcciones rama También

tabla de rama , y el programa sólo necesita para indexar en la tabla y, a continuación rama en la secuencia apropiada. llamado tabla de rama . Una tabla de
direcciones de secuencias de
Por consiguiente, la tabla de rama es sólo un conjunto de de doble palabras que contienen direcciones que
instrucciones alternativas.
corresponden a las etiquetas en el código. El programa carga la entrada correspondiente de la tabla de rama en un
registro. A continuación, tiene que diversificarse mediante la dirección en el registro. Para apoyar este tipo de
situaciones, como las computadoras incluyen un LEGv8 registro de la sucursal instrucción ( BR), lo que supone un salto
incondicional a la dirección especificada en un registro. Luego se ramifica a la dirección correcta utilizando esta
instrucción. Veremos un uso aún más popular de BR en la siguiente sección.

Aunque hay muchas declaraciones de decisiones y bucles en lenguajes de programación como C y Java, Interfaz de
la declaración lecho de roca que las implementa a nivel de conjunto de instrucciones es la rama hardware /
condicional.
software

I. C tiene muchas declaraciones de decisiones y bucles, mientras LEGv8 tiene pocos. Cuál de los siguientes Examínese
tiene o no explicar este desequilibrio? ¿Por qué?

1. Más declaraciones de toma hacen código más fácil de leer y entender.

2. Los estados de toma Menos simplifican la tarea de la capa subyacente que es responsable de la
ejecución.

3. Más de toma declaraciones significan un menor número de líneas de código, que por lo general reduce el tiempo de

codificación.

4. Más declaraciones de toma significan menos líneas de código, que generalmente resulta en la ejecución de un
menor número de operaciones.

II. ¿Por qué C proporciona dos conjuntos de operadores de Y (Y y &&) y dos conjuntos de operadores de O (| e
||), mientras que LEGv8 no lo hace?

1. Las operaciones lógicas AND y la ORR y poner en práctica y |, mientras que las ramas condicionales
implementan && y ||.

2. La declaración anterior tiene al revés: && y || corresponden a operaciones lógicas, mientras que
& y | mapa de saltos condicionales.

3. Ellos son redundantes y significan lo mismo: && y || son simplemente heredada del
lenguaje de programación B, el predecesor de C.
100 Capítulo 2 Instrucciones: Lenguaje del ordenador

2.8 Procedimientos de apoyo en el ordenador


Hardware

procedimiento Una subrutina UNA procedimiento o la función es una herramienta programadores utilizan para programas de estructuras, tanto
almacenado que realiza una tarea para hacer más fáciles de entender y para permitir que el código sea reutilizado. Procedimientos permiten al
específica en base a los parámetros
programador concentrarse en sólo una parte de la tarea a la vez; parámetros actúan como una interfaz entre el
con los que se proporciona.
procedimiento y el resto del programa y de datos, ya que pueden pasar valores y los resultados volver. Describimos el
equivalente a los procedimientos en Java en sección 2.15 , pero Java necesita de todo, desde un equipo que necesita
C. Los procedimientos son una forma de implementar abstracción en el software.

Se puede pensar en un procedimiento como un espía que se va con un plan secreto, adquiere recursos, realiza
la tarea, cubre sus pistas y, a continuación, vuelve al punto de origen con el resultado deseado. Ninguna otra cosa
debe ser perturbado una vez que la misión se ha completado. Por otra parte, un espía opera sólo en una “necesidad
de saber”, por lo que el espía no puede hacer suposiciones sobre el espía.

Del mismo modo, en la ejecución de un procedimiento, el programa debe seguir estos seis pasos:

1. Parámetros de poner en un lugar en el que el procedimiento se puede acceder a ellos.

2. Control de Transferencia con el procedimiento.

3. Adquirir los recursos de almacenamiento necesarios para el procedimiento.

4. Llevar a cabo la tarea deseada.

5. Poner el valor del resultado en un lugar donde el programa de llamada puede acceder a él.

de control 6. Volver al punto de origen, ya que un procedimiento puede ser llamado desde varios puntos en un
programa.

Como se mencionó anteriormente, los registros son el lugar más rápido para mantener los datos en un ordenador, por lo que

queremos utilizarlos tanto como sea posible. LEGv8 software sigue la siguiente convención para el procedimiento de llamar a la

hora de asignar sus 32 registros:

norte X0-X7: ocho registros de parámetros en el que el paso de parámetros o de retorno


valores.

norte LR (X30): un registro de dirección de retorno para regresar al punto de origen. Además de la asignación de
instrucción de
salto-y-link Un estos registros, LEGv8 lenguaje ensamblador incluye una instrucción sólo para los procedimientos: se ramifica en
la instrucción que se ramifica a una una dirección y al mismo tiempo guarda la dirección de la siguiente instrucción en el registro LR (X30). los rama-y-enlace
dirección y
de la instrucción ( LICENCIADO EN DERECHO) se anota
ahorra al mismo tiempo la
dirección de la siguiente
instrucción en un registro ( LR o X30
en LEGv8). BL ProcedureAddress
2,8 de procedimientos de apoyo Hardware 101

los enlazar parte del nombre significa que se forma una dirección o enlace que apunta al sitio de llamadas para
permitir que el procedimiento para volver a la dirección correcta. Este “enlace”, almacenado en el registro LR ( registro 30),
que se llama el dirección del remitente . Se necesita la dirección de retorno debido a que el mismo procedimiento se dirección del remitente Un enlace al

podría llamar de varias partes del programa. sitio llamado que permite un
procedimiento para volver a la dirección
correcta; en LEGv8 se almacena en el
Para apoyar el retorno de un procedimiento, como las computadoras utilizan el LEGv8 registro de la sucursal instrucción ( BR),
registro LR (X30).
introducido anteriormente para ayudar con las declaraciones de casos, lo que supone un salto incondicional a la dirección
especificada en un registro:
llamador El programa que instiga un

BR LR procedimiento y proporciona los


valores de los parámetros necesarios.
Las ramas de instrucción registro de la sucursal a la dirección almacenada en el registro LR -
que es justo lo que queremos. Por lo tanto, el programa de llamada, o llamador , pone los valores de parámetros en X0-X7
destinatario de la llamada Un
y usos BL X en rama con el procedimiento X ( a veces llamado el
procedimiento que ejecuta una serie de
destinatario de la llamada ). El destinatario de la llamada a continuación, realiza los cálculos, coloca los resultados en los mismos
instrucciones almacenadas en base a
registros de parámetros, y devuelve el control a la persona que llama usando BR LR.
parámetros proporcionados por la
Implícita en la idea de programa almacenado es la necesidad de tener un registro para mantener la dirección de la persona que llama y luego devuelve el
instrucción actual que está siendo ejecutado. Por razones históricas, este registro es casi siempre la llama contador de control a la persona que llama.

programa , abreviado ordenador personal en la arquitectura LEGv8, aunque un nombre más sensato habría sido instrucción
contador de programa (PC) El
de registro de direcciones. los licenciado en Derecho la instrucción realmente ahorra PC + 4 en el registro LR vincular a la
registro que contiene la dirección
dirección de byte de la siguiente instrucción para configurar el regreso procedimiento.
de la instrucción en el programa
que está siendo ejecutado.

El uso de más registros


apilar Una estructura de datos para
Supongamos que un compilador necesita varios registros para un procedimiento que los ocho registros de argumento.
derramar registros organizados
Puesto que debemos cubrir nuestras pistas después de nuestra misión se ha completado, los registros requeridos por la como una cola de primero en salir
persona que llama se deben restaurar a los valores que figuran antes de el procedimiento se invoca. Esta situación es un último en ejercicio.

ejemplo en el que tenemos que derramar registros de memoria, como se menciona en el Interfaz de hardware / software en
puntero de pila Un valor que indica la
la página 72.
dirección más recientemente asignado
en una pila que muestra dónde
La estructura de datos ideal para los registros de derrame es una apilar -a último en entrar, primero en salir registros deben ser derramados o

cola. Una pila necesita un puntero a la dirección más recientemente asignado en la pila para mostrar donde el siguiente donde los valores de registro antiguos
se pueden encontrar. En LEGv8, es
procedimiento debe colocar los registros que se derramaron o donde se encontraron valores de los registros antiguos. los puntero
registro SP.
de pila ( SP), que es sólo uno de los 32 registros, se ajusta mediante una doble palabra para cada registro que se guarda o se
restaura. Las pilas son tan populares que tienen sus propias palabras de moda para la transferencia de datos hacia y desde
la pila: la colocación de datos en la pila que se llama una empujar , y la eliminación de los datos de la pila se denomina popular
. empujar Añadir elemento a la pila.

Por los precedentes históricos, las pilas “crecer” de direcciones superiores a las direcciones más bajas. Este
popular Retire el elemento de la
convenio significa que usted empuja los valores en la pila restando del puntero de pila. Añadiendo al puntero de pila
pila.
se reduce la pila, apareciendo por lo tanto los valores de la pila.
102 Capítulo 2 Instrucciones: Lenguaje del ordenador

Elaboración: Como se mencionó anteriormente, en el conjunto de instrucciones completo ARMv8, el puntero de pila se dobla
en el registro 31. En algunas instrucciones - transferencias de datos y immediates aritméticas, que no indican banderas cuando
es el registro de destino o en el primer registro fuente - registro 31 indica SP pero en el resto, como instrucciones de registro de la
aritmética o en las instrucciones de ajuste de la bandera, que indica la registro cero ( XZR). Teniendo en cuenta que este truco
sólo ahorra un registro, que complicaría el camino de datos en Capítulo 4 , Y es un poco confuso, LEGv8 simplemente asume SP
es uno de los otros 31 registros de propósito general; usamos X28 para SP.

Compilación de un procedimiento C que no llama a otro procedimiento


EJEMPLO
Vamos a convertir el ejemplo en la página 66 de la sección 2.2 en un procedimiento C:

largo long int leaf_example (long long int g, largo long int h, tiempo largo int i, largo long int j) {

largo long int f;

f = (g + h) - ( i + j); f retorno; }

¿Cuál es el código de montaje LEGv8 compilado? Las variables de los parámetros sol, h, yo, y j corresponden a los

RESPONDER registros de argumento


X0, X1, X2, y X3, y F corresponde a X19. El programa compilado comienza con la etiqueta del
procedimiento:

leaf_example:

El siguiente paso consiste en guardar los registros utilizados por el procedimiento. La instrucción de asignación C en
el cuerpo del procedimiento es idéntico al ejemplo de la página 68, que utiliza dos registros temporales ( X9 y X10). Por
lo tanto, tenemos que salvar tres registros:
X19, X9, y X10. Nosotros “empujar” los viejos valores en la pila mediante la creación de espacio para tres
palabras dobles (24 bytes) en la pila y luego almacenarlos:

SUBI SP, SP, # 24 // ajuste la chimenea para hacer espacio para 3 artículos
STUR X10, [SP, # 16] // Guardar registro X10 para el uso a continuación
STUR X9, [SP, # 8] // Guardar registro X9 para el uso a continuación
STUR X19, [SP, # 0] // Guardar registro X19 para el uso a continuación

Figura 2.11 muestra la pila antes, durante y después de la llamada a procedimiento.


2,8 de procedimientos de apoyo Hardware 103

Los siguientes tres estados corresponden al cuerpo del procedimiento, que sigue el ejemplo de
la página 68:

ADD X9, X0, X1 // registrar X9 contiene g + h ADD X10, X2, X3 // registrar X10 contiene i + j SUB X19,
X9, X10 // f = X9 - X10, que es (g + h) - (i + j)

Para devolver el valor de F, copiamos en un registro de parámetros:

ADD X0, X19, XZR // devuelve f (X0 = X19 + 0)

Antes de regresar, restauramos los tres viejos valores de los registros que salvamos, “saltando” a
partir de la pila:

LDUR X19, [SP, # 0] // restaurar registrarse X19 para la persona que llama X9 LDUR, [SP, # 8]
// restaurar X9 registro para la persona que llama
LDUR X10, [SP, # 16] // restaurar registro de llamadas X10 para ADDI SP, SP, # 24
// ajustar pila eliminar 3 artículos

El procedimiento termina con un registro de sucursal utilizando la dirección del remitente:

BR LR // rama de nuevo a la rutina de llamada

En el ejemplo anterior, se utilizaron registros temporales y asumió sus viejos valores deben ser
salvados y restaurados. Para evitar guardar y restaurar un registro cuyo valor no se usa nunca, lo que
podría suceder con un registro temporal, el software separa LEGv8 19 de los registros en dos grupos:

norte X9-X17: registros temporales que son no conservado por el destinatario de la llamada (llamada

procedimiento) en una llamada a procedimiento

norte X19-X28: registros guardados que deben ser preservados en una llamada de procedimiento (si se usa,

el destinatario de la llamada guarda y restaura)

alta dirección

SP SP

Contenido del registro X10

contenido del contenido del

SP registro de registro X9 X19

bajo la dirección
(una) (segundo) (do)

FIGURA 2.11 Los valores del puntero de pila y la pila (a) antes, (b) durante y (c) después de la llamada de procedimiento. El
puntero de pila siempre apunta a la “cima” de la pila, o la última palabra doble en la pantalla en este dibujo.
104 Capítulo 2 Instrucciones: Lenguaje del ordenador

Este simple convención reduce derramamiento registro. En el ejemplo anterior, ya que la persona que llama no espera que
los registros X9 y X10 ser preservado a través de una llamada de procedimiento, podemos dejar a dos tiendas y dos cargas a
partir del código. Todavía hay que guardar y restaurar
X19, ya que el destinatario de la llamada debe asumir que la persona que llama necesita su valor.

Procedimientos anidados

Procedimientos que no requieren otros se llaman hoja procedimientos. La vida sería simple si todos los procedimientos fueron los

procedimientos de la hoja, pero no lo son. Al igual que un espía podría emplear otros espías como parte de una misión, que a su

vez podría utilizar incluso más espías, también lo hacen los procedimientos invocan otros procedimientos. Por otra parte, los

procedimientos recursivos incluso invocan “clones” de sí mismos. Del mismo modo que tenemos que tener cuidado al usar

registros en los procedimientos, se debe prestar atención al invocar procedimientos no hoja.

Por ejemplo, supongamos que el programa principal llama al procedimiento A con un argumento de 3, colocando el valor 3 en

el registro X0 y a continuación, utilizando BL A. A continuación, supongamos que el procedimiento A llama al procedimiento B a

través BL B con un argumento de 7, también colocado en

X0. Dado que A no ha terminado su tarea, sin embargo, hay un conflicto por el uso de registro X0.

Del mismo modo, existe un conflicto por la dirección de retorno en el registro LR, ya que ahora tiene la dirección de retorno para B.

A menos que tomemos medidas para prevenir el problema, este conflicto va a eliminar la capacidad de un procedimiento para

volver a su llamador.

Una solución es empujar todos los demás registros que debe ser preservado en la pila, tal como lo hicimos con los
registros guardados. El llamador inserta ningún registros de argumento ( X0-X7) o registros temporales ( X9-X17) que son
necesarios después de la llamada. El destinatario de la llamada empuja el registro de direcciones de retorno LR y cualquier
registros guardados ( X19-X25) utilizado por el destinatario de la llamada. El puntero de pila SP se ajusta para tener en cuenta
el número de registros colocados en la pila. Tras el regreso, los registros se restauran desde la memoria, y el puntero de
pila se reajusta.

Compilación de un procedimiento recursivo C, Mostrando Nested Procedimiento Linking


EJEMPLO

Vamos a abordar un procedimiento recursivo que calcula factorial:

largo hecho de long int (long long int n) {

si (n <1) de retorno (1);


retorno más (n * hecho (n - 1));
}

¿Cuál es el código de montaje LEGv8?


2,8 de procedimientos de apoyo Hardware 105

La variable de parámetro norte corresponde al registro de argumentos X0. El programa compilado se


inicia con la etiqueta del procedimiento y luego guarda dos registros en la pila, la dirección de RESPONDER
retorno y X0:

hecho:
SUBI SP, SP, # 16 // ajustar pila por 2 artículos STUR LR, [SP, # 8] // guardar la
dirección de retorno X0 STUR, [SP, # 0] // guardar el argumento n

La primera vez hecho se llama, STUR ahorra una dirección en el programa que llama
hecho. Las siguientes dos instrucciones de la prueba si norte es menor que 1, va a L1 Si

n ≥ 1.

subis ZXR, X0, # 1 // test para n <1


B.GE L1 // si n> = 1, vaya a L1

Si norte es menor que 1, hecho devuelve 1, poniendo 1 en un registro de valor: se añade 1 a 0 y lugares que en suma X1.
A continuación, aparece los dos valores guardados de la pila y las ramas a la dirección del remitente:

ADDI X1, XZR, # 1 // devolver 1 de ADDI


SP, SP, # 16 // pop 2 artículos de pila BR
LR // devuelve a la persona que llama

Antes de hacer estallar dos elementos de la pila, podríamos tener cargada X0 y LR. Ya que
X0 y LR no cambian cuando norte es inferior a 1, nos saltamos esas instrucciones.
Si norte no es menor que 1, el argumento norte se decrementa y luego hecho se llama de nuevo
con el valor reducido:

L1: SUBI X0, X0, # 1 n> = 1 //: argumento se pone (n - 1) hecho de BL


// llamar hecho con (n - 1)

La siguiente instrucción es donde hecho devoluciones. Ahora la vieja dirección de retorno y el argumento
ancianos, recuperan, junto con el puntero de pila:

LDUR X0, [SP, # 0] // devuelve desde BL: restaurar argumento n


LDUR LR, [SP, # 8] // restaurar la dirección de retorno
ADDI SP, SP, # 16 // ajustar puntero de pila para hacer estallar 2 artículos

A continuación, el registro de valor X1 obtiene el producto de la vieja discusión X0 y el valor actual del registro de
valor. Se parte de una instrucción de multiplicación está disponible, a pesar de que no está cubierto hasta Capítulo
3:

MUL X1, X0, X1 // devuelve n * hecho (n - 1)

Finalmente, hecho ramas de nuevo a la dirección del remitente:

BR LR // devuelve a la persona que llama


106 Capítulo 2 Instrucciones: Lenguaje del ordenador

Interfaz de variable de CA es generalmente un lugar en el almacenamiento, y su interpretación depende tanto de su tipo y Clase de

almacenamiento. tipos de ejemplo incluyen los números enteros y caracteres (véase la Sección
hardware /
2.9). C tiene dos clases de almacenamiento: automático y estático. Las variables automáticas son locales a un procedimiento y se
software descartan cuando el procedimiento sale. Existen variables estáticas a través de las salidas y entradas a los procedimientos. las
variables de C declarados fuera de todos los procedimientos se consideran estática, como lo son las variables declaradas
utilizando la palabra clave estático. El resto son automáticos. Para simplificar el acceso a los datos estáticos, algunos compiladores
LEGv8 reservan un registro, denominado puntero mundial , o GP. Por ejemplo X27 podría ser reservado para GP.
puntero mundial El registro que está
reservado para que apunte a la zona
estática.

Figura 2.12 resume lo que se conserva a través de una llamada de procedimiento. Tenga en cuenta que varios
esquemas de preservar la pila, lo que garantiza que la persona que llama obtener los mismos datos de nuevo en una carga
de la pila, ya que se almacena en la pila. La pila encima SP
se conserva simplemente asegurándose de que el destinatario de la llamada no escribe encima SP; SP está a su vez
preservado por el destinatario de la llamada añadiendo exactamente la misma cantidad que se resta de ella; y los demás
registros se conservan los tiene guardados en la pila (si se utilizan) y restaurarlos a partir de ahí.

Preservado no conservado

registros guardados: X19-X27 registros temporales: X9-X15

Apilar registro de puntero: X28 (SP) registros argumento / Resultados: X0-X7

Marco registro de puntero: X29 (FP)

Vínculo de registro (dirección de retorno): X30 (LR)

Apilar encima del puntero de pila Apilar debajo del puntero de pila

FIGURA 2.12 Lo que es y lo que no se conserva a través de una llamada de procedimiento. Si el software se basa en el registro de puntero global, se
discute en las siguientes subsecciones, sino que también se conserva.

marco de procedimiento También Asignación de espacio para nuevos datos en la pila


llamado registro de activación .
La complejidad final es que la pila se utiliza también para almacenar variables que son locales en el procedimiento, pero no
El segmento de la pila que contiene
registros guardados de un encajan en los registros, tales como matrices o estructuras locales. El segmento de la pila que contiene registros y
procedimiento y variables locales. guardados variables locales de un procedimiento se llama una marco de procedimiento o registro de activación . Figura
2.13 muestra el estado de la pila antes, durante y después de la llamada a procedimiento.

puntero de marco Un valor que indica Algunos compiladores utilizan un ARMv8 puntero de marco ( FP) para apuntar a la primera palabra doble del marco
la ubicación de los registros de un procedimiento. Un puntero de pila podría cambiar durante el procedimiento, por lo que las referencias a una
guardados y variables locales para un
variable local en la memoria podría tener diferentes compensaciones dependiendo de dónde se encuentren en el
procedimiento dado.
procedimiento, por lo que el procedimiento más difícil de entender. Como alternativa, el puntero de marco ofrece un
registro base estable dentro de un procedimiento para la memoria referencias locales. Tenga en cuenta que un registro
de activación aparece en la pila si se utiliza o no un puntero de marco explícito. Hemos estado evitando el uso de FP evitando
los cambios en SP dentro de un procedimiento: en nuestros ejemplos, la pila se ajusta sólo en la entrada y salida del
procedimiento.
2,8 de procedimientos de apoyo Hardware 107

alta dirección

FP FP

SP SP
FP
registros de argumento
guardados (si los hay)

dirección de retorno Guardado

Guardado guarda
registros (si los hay)

arrays y estructuras (si


las hay) locales
SP

bajo la dirección

(una) (segundo) (do)

FIGURA 2.13 Ilustración de la asignación de pila (a) antes, (b) durante y (c) después de la llamada de procedimiento. El puntero de marco ( FP o X29) apunta
a la primera palabra doble de la trama, a menudo un registro de argumentos salvado, y el puntero de pila ( SP) apunta a la parte superior de la pila. La pila se
ajusta para dar cabida a todos los registros guardados y las variables locales residentes en memoria. Desde el puntero de pila puede cambiar durante la
ejecución del programa, es más fácil para los programadores para hacer referencia a las variables a través del puntero de marco estable, aunque podría
hacerse simplemente con el puntero de pila y un poco de aritmética de direcciones. Si no hay variables locales en la pila dentro de un procedimiento, el
compilador ahorrar tiempo no establecer y restablecer el puntero de marco. Cuando se utiliza un puntero de marco, se inicializa utilizando la dirección de SP en
una llamada, y SP se restaura utilizando FP. Esta información también se encuentra en la columna 4 de la tarjeta de datos LEGv8 de referencia en la parte
delantera de este libro.

Asignación de espacio para nuevos datos en el montón

Además de las variables automáticas que son locales a los procedimientos, los programadores de C necesitan espacio en la

memoria para las variables estáticas y para estructuras de datos dinámicos. Figura 2.14
muestra la convención LEGv8 para la asignación de memoria cuando se ejecuta el sistema operativo Linux. La pila se
inicia en el extremo superior del espacio de direcciones de usuario (ver
Capítulo 5 ) Y crece hacia abajo. La primera parte del extremo inferior de la memoria se reserva, seguido por la casa del
código de máquina LEGv8, llamado tradicionalmente segmento de texto . Por encima del código es el segmento de datos segmento de texto El segmento de un

estática, que es el lugar para las constantes y otras variables estáticas. Aunque arrays tienden a ser una longitud fija y por lo fichero objeto UNIX que contiene el
tanto son una buena coincidencia con el segmento de datos estática, estructuras de datos como listas enlazadas tienden a código de lenguaje de máquina para las
rutinas en el archivo de origen.
crecer y encoger durante su vida. El segmento para tales estructuras de datos se denomina tradicionalmente el montón, y se
coloca al lado de la memoria. Tenga en cuenta que esta asignación permite que la pila y montón crezcan hacia la otra,
permitiendo de ese modo el uso eficiente de la memoria como los dos segmentos aumentan y disminuyen.

C asigna y libera espacio en el montón con funciones explícitas. malloc ()


asigna espacio en el montón y devuelve un puntero a la misma, y gratis() libera espacio en el montón al que apunta el
puntero. Los programas en C controlan la asignación de memoria, que es la fuente de muchos errores comunes y difíciles.
El olvidarse de espacio libre conduce a una “pérdida de memoria”, que en última instancia utiliza tanta memoria que el
sistema operativo puede bloquearse. Liberar espacio demasiado pronto conduce a “colgando punteros”, que pueden causar
a los punteros apuntan a cosas que el programa nunca tuvo la intención. Java utiliza la asignación automática de la
memoria y recolección de basura sólo para evitar este tipo de errores.
108 Capítulo 2 Instrucciones: Lenguaje del ordenador

SP 0000 007F ffff FFFC maleficio


Apilar

Los datos dinámicos

Los datos estáticos

0000 0000 1000 0000 maleficio


Texto

PC 0000 0000 0040 0000 maleficio


Reservado
0

FIGURA 2.14 La asignación de memoria LEGv8 para programas y datos. Estas direcciones son más que una convención de software, y no forma parte de
la arquitectura LEGv8. El espacio de direcciones de usuario se establece en 2 39 del potencial de 2 64 espacio total de direcciones dado una arquitectura de 64 bits
(ver Capítulo 5 ). El puntero de pila se inicializa 0000 007F ffff FFFC maleficio y crece hacia abajo, hacia el segmento de datos. En el otro extremo, el código del
programa ( “texto”) comienza a las 0000 0000 0040 0000 maleficio. Los datos estáticos se inicia inmediatamente después de que el extremo del segmento de texto;
en este ejemplo, se supone que la dirección es 0000 0000 1000 0000 maleficio. Los datos dinámicos, asignados por malloc en C y por nuevo en Java, está al lado.
Crece hacia la pila en una zona llamada la montón. Esta información también se encuentra en la columna 4 de la tarjeta de datos LEGv8 de referencia en la
parte delantera de este libro.

Figura 2.15 resume las convenciones de registro para el lenguaje ensamblador LEGv8. Esta
convención es otro ejemplo de hacer de la caso común rápida:
la mayoría de los procedimientos pueden ser satisfechos con hasta ocho registros de argumento, nueve registros
guardados, y siete registros temporales sin tener que ir a la memoria.

Elaboración: ¿Qué pasa si hay más de ocho parámetros? La convención LEGv8 es colocar los parámetros adicionales en la
pila justo por encima del puntero de marco. El procedimiento a continuación, espera los primeros ocho parámetros a ser en los
registros X0 mediante X7 y el resto en la memoria, una dirección por medio del puntero de marco.

Como se ha mencionado en el epígrafe de Figura 2.13 , El puntero de marco es conveniente porque


todas las referencias a variables en la pila dentro de un procedimiento tendrán el mismo desplazamiento. El puntero de marco no es

necesario, sin embargo. El compilador C ARMv8 utiliza un puntero de marco, pero algunos compiladores de C no lo hacen; que tratan a

registrarse 29 como otro registro en Guardar.

Elaboración: Algunos procedimientos recursivos se pueden implementar de forma iterativa y sin el uso de la recursividad. Iteración
puede mejorar significativamente el rendimiento mediante la eliminación de la sobrecarga asociada a llamadas a procedimientos
recursivos. Por ejemplo, considere un procedimiento que se utiliza para acumular una suma:

largo suma long int (long long int n, largo long int acc) {
si (n> 0)
suma de retorno (n - 1, acc + n); más

acc regresar;

}
2,8 de procedimientos de apoyo Hardware 109

Número de Preservado en la
Nombre Uso
registro llamada?

X0-X7 0-7 Argumentos / Resultados no

X8 8 resultado indirecto registro de localización no

X9-X15 9-15 Temporaries no

Puede ser utilizado por enlazador como un registro de cero; otras


dieciséis no
X16 (IP0) veces se utilizan como registro temporal

Puede ser utilizado por enlazador como un registro de cero; otras


17 no
X17 (IP1) veces se utilizan como registro temporal

registro de la plataforma para la plataforma de código independiente;


18 no
X18 de lo contrario un registro temporal

X19-X27 19-27 Salvado sí

X28 (SP) 28 puntero de pila sí

X29 (FP) 29 puntero de marco sí

X30 (LR) 30 Vínculo de registro (dirección de retorno) sí

XZR 31 El valor constante 0 n/A

FIGURA 2.15 LEGv8 convenciones registradora. Esta información también se encuentra en la Columna 2 de la tarjeta de datos LEGv8 de referencia en la parte
delantera de este libro. X8 es utilizado por los procedimientos que devuelven un resultado a través de un puntero. ARM desalienta el uso de registros X16 a X18 como
X16 y X17 puede ser usada por el enlazador (véase la Sección
2.12), y X18 se puede utilizar para crear código independiente de plataforma, que se especifica mediante la aplicación plataformas Binary
Interface.

Considere la llamada al procedimiento suma (3,0). Esto dará lugar a las llamadas recursivas a
suma (2,3), sum (1,5), y suma (0,6), y entonces el resultado 6 será devuelto cuatro veces. Esta llamada recursiva de
suma se denomina llamada de cola, y este ejemplo uso de la recursión de cola puede ser implementado de
manera muy eficiente (suponiendo X0 = n, X1 = acc,
y el resultado va en X2):

suma: SUBS XZR, X0, XZR // n comparar a 0


sum_exit B.LE // ir a sum_exit si n <= 0
ADD X1, X1, X0 // añadir n a ACC
SUBI X0, X0, # 1 // restar 1 a n
B suma // ir a resumir
sum_exit:
ADD X2, X1, XZR // valor de retorno acc
BR LR // devuelve a la persona que llama
110 Capítulo 2 Instrucciones: Lenguaje del ordenador

Check ¿Cuál de las siguientes afirmaciones sobre C y Java es generalmente cierto?

Yourself 1. Los programadores de C gestionar los datos de forma explícita, mientras que es automática en Java.

2. C conduce a más errores de puntero y errores de pérdida de memoria que hace Java.

!(@ | = > (wow open tab at


bar is great)
Fourth line of the
2.9 La comunicación con la gente
keyboard poem “Hatless Atlas,”
1991 (some give names to
Las computadoras se inventaron de hacer cálculos, pero tan pronto como llegaron a ser comercialmente viable que
ASCII characters: “!” is “wow,”
se utilizan para procesar texto. La mayoría de las computadoras ofrecen hoy bytes de 8 bits para representar los
“(” is open, “|” is bar, and so
caracteres, con el American Standard Code for Information Interchange ( ASCII) being the representation that nearly
on).
everyone follows. Figure
2.16 summarizes ASCII.

ASCII Character ASCII Character ASCII Character ASCII Character ASCII Character ASCII Character
value value value value value value

32 space 48 0 64 @ 80 P 0 96 ` 112 p

33 ! 49 1 65 A 81 Q 0 97 a 113 q

34 " 50 2 66 B 82 R 0 98 b 114 r

35 # 51 3 67 C 83 S 0 99 c 115 s

36 $ 52 4 68 D 84 T 100 d 116 t

37 % 53 5 69 E 85 U 101 e 117 u

38 & 54 6 70 F 86 V 102 f 118 v

39 ' 55 7 71 G 87 W 103 g 119 w

40 ( 56 8 72 H 88 X 104 h 120 x

41 ) 57 9 73 I 89 Y 105 i 121 y

42 * 58 : 74 J 90 Z 106 j 122 z

43 + 59 ; 75 K 91 [ 107 k 123 {

44 , 60 < 76 L 92 \ 108 l 124 |

45 - 61 = 77 M 93 ] 109 m 125 }

46 . 62 > 78 N 94 ^ 110 n 126 ~

47 / 63 ? 79 O 95 _ 111 o 127 DEL

FIGURE 2.16 ASCII representation of characters. Note that upper- and lowercase letters differ by exactly 32; this observation can lead to shortcuts in checking or changing
upper- and lowercase. Values not shown include formatting characters. For example, 8 represents a backspace, 9 represents a tab character, and 13 a carriage return. Another
useful value is 0 for null, the value the programming language C uses to mark the end of a string.
2.9 Communicating with People 111

ASCII versus Binary Numbers


EXAMPLE
We could represent numbers as strings of ASCII digits instead of as integers. How much does
storage increase if the number 1 billion is represented in ASCII versus a 32-bit integer?

One billion is 1,000,000,000, so it would take 10 ASCII digits, each 8 bits long. Thus the storage
expansion would be (10 × 8)/32 or 2.5. Beyond the expansion in storage, the hardware to add, ANSWER
subtract, multiply, and divide such decimal numbers is difficult and would consume more energy.
Such difficulties explain why computing professionals are raised to believe that binary is natural
and that the occasional decimal computer is bizarre.

A series of instructions can extract a byte from a doubleword, so load register and store register
are sufficient for transferring bytes as well as words. Because of the popularity of text in some
programs, however, LEGv8 provides instructions to move bytes. Load byte ( LDURB) loads a byte from
memory, placing it in the rightmost 8 bits of a register. Store byte ( STURB) takes a byte from the
rightmost 8 bits of a register and writes it to memory. Thus, we copy a byte with the sequence

LDURB X9,[X0,#0] // Read byte from source


STURB X9,[X1,#0] // Write byte to destination

Characters are normally combined into strings, which have a variable number of characters. There
are three choices for representing a string: (1) the first position of the string is reserved to give the
length of a string, (2) an accompanying variable has the length of the string (as in a structure), or (3)
the last position of a string is indicated by a character used to mark the end of a string. C uses the
third choice, terminating a string with a byte whose value is 0 (named null in ASCII). Thus, the string
“Cal” is represented in C by the following 4 bytes, shown as decimal numbers: 67, 97, 108, and 0. (As
we shall see, Java uses the first option.)
112 Chapter 2 Instructions: Language of the Computer

Compiling a String Copy Procedure, Showing How to Use C Strings


EXAMPLE
The procedure strcpy copies string y to string x using the null byte termination convention of C:

void strcpy (char x[], char y[]) {

size t i; i = 0;

while ((x[i] = y[i]) != ‘\0’) /* copy & test byte */ i += 1; }

What is the LEGv8 assembly code?

Below is the basic LEGv8 assembly code segment. Assume that base addresses for arrays x and y
are found in X0 and X1, while i is in X19. strcpy adjusts the stack pointer and then saves the saved
ANSWER register X19 on the stack:

strcpy:
SUBI SP,SP,#8 // adjust stack for 1 more item
STUR X19, [SP,#0] // save X19

To initialize i to 0, the next instruction sets X19 to 0 by adding 0 to 0 and placing that sum in X19:

ADD X19,XZR,XZR // i = 0 + 0

This is the beginning of the loop. The address of y[i] is first formed by adding
i to y[]:

L1: ADD X10,X19,X1 // address of y[i] in X10

Note that we don’t have to multiply i by 8 since y is an array of bytes and not of doublewords, as in
prior examples.
To load the character in y[i], we use load byte unsigned, which puts the character into X11:

LDURB X11, [X10,#0] // X11 = y[i]


2.9 Communicating with People 113

A similar address calculation puts the address of x[i] in X12, and then the character in X11 is
stored at that address.

ADD X12,X19,X0 // address of x[i] in X12


STURB X11, [X12,#0] // x[i] = y[i]

Next, we exit the loop if the character was 0. That is, we exit if it is the last character of the
string:

CBZ X11,L2 // if y[i] == 0, go to L2

If not, we increment i and loop back:

ADDI X19, X19,#1 // i = i + 1 B


L1 // go to L1

If we don’t loop back, it was the last character of the string; we restore X19 and the stack pointer,
and then return.

L2: LDUR X19, [SP,#0] // y[i] == 0: end of string.


// Restore old X19
ADDI SP,SP,#8 // pop 1 doubleword off stack
BR LR // return

String copies usually use pointers instead of arrays in C to avoid the operations on i in the code
above. See Section 2.14 for an explanation of arrays versus pointers.

Since the procedure strcpy above is a leaf procedure, the compiler could allocate i to a temporary
register and avoid saving and restoring X19. Hence, instead of thinking of these registers as being just
for temporaries, we can think of them as registers that the callee should use whenever convenient.
When a compiler finds a leaf procedure, it exhausts all temporary registers before using registers it
must save.

Characters and Strings in Java


Unicode is a universal encoding of the alphabets of most human languages. Figure
2.17 gives a list of Unicode alphabets; there are almost as many alphabets in Unicode as there are useful symbols
in ASCII. To be more inclusive, Java uses Unicode for characters. By default, it uses 16 bits to represent a
character.
114 Chapter 2 Instructions: Language of the Computer

Latin Malayalam Tagbanwa General Punctuation

Greek Sinhala Khmer Spacing Modifier Letters

Cyrillic Thai Mongolian Currency Symbols

Armenian Lao Limbu Combining Diacritical Marks

Hebrew Tibetan Tai Le Combining Marks for Symbols

Arabic Myanmar Kangxi Radicals Superscripts and Subscripts

Syriac Georgian Hiragana Number Forms

Thaana Hangul Jamo Katakana Mathematical Operators

Devanagari Ethiopic Bopomofo Mathematical Alphanumeric Symbols

Bengali Cherokee Kanbun Braille Patterns

Gurmukhi Unified Canadian Shavian Optical Character Recognition


Aboriginal Syllabic

Gujarati Ogham Osmanya Byzantine Musical Symbols

Oriya Runic Cypriot Syllabary Musical Symbols

Tamil Tagalog Tai Xuan Jing Symbols Arrows

Telugu Hanunoo Yijing Hexagram Symbols Box Drawing

Kannada Buhid Aegean Numbers Geometric Shapes

FIGURE 2.17 Example alphabets in Unicode. Unicode version 4.0 has more than 160 “blocks,” which is their name for a collection
of symbols. Each block is a multiple of 16. For example, Greek starts at 0370 hex, and Cyrillic at 0400 hex. The first three columns show 48
blocks that correspond to human languages in roughly Unicode numerical order. The last column has 16 blocks that are multilingual
and are not in order. A 16-bit encoding, called UTF-16, is the default. A variable-length encoding, called UTF-8, keeps the ASCII
subset as eight bits and uses 16 or 32 bits for the other characters. UTF-32 uses 32 bits per character. To learn more, see www.unicode.org
.

The LEGv8 instruction set has explicit instructions to load and store such 16-bit quantities, called halfwords.
Load half ( LDURH) loads a halfword from memory, placing it in the rightmost 16 bits of a register. Like
load byte, load half ( LDURH)
treats the halfword as a signed number and thus sign-extends to fill the 48 leftmost bits of the register. Store
half ( STURH) takes a halfword from the rightmost 16 bits of a register and writes it to memory. We copy a
halfword with the sequence

LDURH X19,[X0,#0] // Read halfword (16 bits) from source STURH X9,[X1,#0] // Write halfword (16
bits) to dest.

Strings are a standard Java class with special built-in support and predefined methods for
concatenation, comparison, and conversion. Unlike C, Java includes a word that gives the length of the
string, similar to Java arrays.

Elaboration: ARMv8 software is required to keep the stack aligned to “quadword” (16 byte) addresses to
get better performance. This convention means that a char
variable allocated on the stack occupies 16 bytes, even though it needs less. However, a C string variable or
an array of bytes will pack 16 bytes per quadword, and a Java string variable or array of shorts packs 8
halfwords per quadword.
2.10 LEGv8 Addressing for Wide Immediates and Addresses 115

Elaboration: Reflecting the international nature of the web, most web pages today use Unicode instead of
ASCII. Hence, Unicode may be even more popular than ASCII today.

Elaboration: LEGv8 keeps everything 64 bits vs. providing both 32-bit and 64-bit address instructions as in
ARMv8, which means it needs to include STURW ( store word) as an instruction even though it is not specified in
ARMv8 in assembly language. ARMv8 just uses
STUR with a W register name (32-bit register) instead of X register name (64-bit register).

I. Which of the following statements about characters and strings in C and Java is true? Check
Yourself
1. A string in C takes about half the memory as the same string in Java.

2. Strings are just an informal name for single-dimension arrays of characters in C and
Java.
3. Strings in C and Java use null (0) to mark the end of a string.

4. Operations on strings, like length, are faster in C than in Java.

II. Which type of variable that can contain 1,000,000,000 ten takes the most
memory space?

1. long long int in C


2. string in C
3. string in Java

2.10 LEGv8 Addressing for Wide Immediates


and Addresses

Although keeping all LEGv8 instructions 32 bits long simplifies the hardware, there are times where it
would be convenient to have 32-bit or larger constants or addresses. This section starts with the
general solution for large constants, and then shows the optimizations for instruction addresses used
in branches.

Wide Immediate Operands


Although constants are frequently short and fit into the 12-bit fields, sometimes they are bigger. The
LEGv8 instruction set includes the instruction move wide with zeros
( MOVZ) and move wide with keep ( MOVK) specifically to set any 16 bits of a constant in a register. The former
instruction zeros the rest of the bits of the register and the latter leaves the remaining bits unchanged. The
16-bit field to be loaded is specified by adding
LSL and then the number 0, 16, 32, or 48 depending on which quadrant of the 64-bit
116 Chapter 2 Instructions: Language of the Computer

word is desired. These instructions allow, for example, a 32-bit constant to be created from two 32-bit
instructions. Figure 2.18 shows the operation of MOVZ and MOVK.

The machine language version of MOVZ X9, 255, LSL 16:

110100101 01 0000 0000 1111 1111 01001

Contents of register X9 after executing MOVZ X9, 255, LSL 16:


0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 0000 0000 0000 0000

The machine language version of MOVK X9, 255, LSL 0:

111100101 00 0000 0000 1111 1111 01001

Given value of X9 above, new contents of X9 after executing MOVK X9, 255, LSL 0:
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 0000 0000 1111 1111

FIGURE 2.18 The effect of the MOVZ and MOVK instructions. The instruction MOVZ transfers a 16-bit immediate constant field
value into one of the four quadrants leftmost of a 64-bit register, filling the other 48 bits with 0s. The instruction MOVK only changes
16 bits of the register, keeping the other bits the same.

Loading a 32-Bit Constant


EXAMPLE
What is the LEGv8 assembly code to load this 64-bit constant into register X19?

00000000 00000000 00000000 00000000 00000000 00111101 00001001 00000000

First, we would load bits 16 to 31 with that bit pattern, which is 61 in decimal, using MOVZ:

ANSWER
MOVZ X19, 61, LSL 16 // 61 decimal = 0000 0000 0011 1101 binary

The value of register X19 afterward is:

00000000 00000000 00000000 00000000 00000000 00111101 00000000 00000000

The next step is to insert the lowest 16 bits, whose decimal value is 2304:

MOVK X19, 2304, LSL 0 // 2304 decimal = 00001001 00000000

The final value in register X19 is the desired value:

00000000 00000000 00000000 00000000 00000000 00111101 00001001 00000000


2.10 LEGv8 Addressing for Wide Immediates and Addresses 117

Either the compiler or the assembler must break large constants into pieces and then reassemble Hardware/
them into a register. As you might expect, the immediate field’s size restriction may be a problem for
Software
memory addresses in loads and stores as well as for constants in immediate instructions.
Interface
Hence, the symbolic representation of the LEGv8 machine language is no longer limited by the
hardware, but by whatever the creator of an assembler chooses to include (see Section 2.12). We stick
close to the hardware to explain the architecture of the computer, noting when we use the enhanced
language of the assembler that is not found in the processor.

Addressing in Branches
The LEGv8 branch instructions have the simplest addressing. They use the LEGv8 instruction format,
called the B-type, which consists of 6 bits for the operation field and the rest of the bits for the address
field. Thus,

B 10000 // go to location 10000 ten

could be assembled into this format (it’s actually a bit more complicated, as we will see):

5 10000 ten
6 bits 26 bits

where the value of the branch opcode is 5 and the branch address is 10000 ten.
Unlike the branch instruction, a conditional branch instruction can specify one operand in addition
to the branch address. Thus,

CBNZ X19, Exit // go to Exit if X19 ≠ 0

is assembled into this instruction, leaving only 19 bits for the branch address:

181 Exit 19
8 bits 19 bits 5 bits

This format is called CB-type, for conditional branch. (The conditional branch instructions that rely
on condition codes also use the CB-type format, but they use the final field to select among the many
possible branch conditions.)
If addresses of the program had to fit in this 19-bit field, it would mean that no program could
be bigger than 2 19, which is far too small to be a realistic option today. An alternative would be to
specify a register that would always
118 Chapter 2 Instructions: Language of the Computer

be added to the branch offset, so that a branch instruction would calculate the following:

Program counter Register Branch o•set

This sum allows the program to be as large as 2 64 and still be able to use conditional branches,
solving the branch address size problem. Then the question is, which register?

The answer comes from seeing how conditional branches are used. Conditional branches are
found in loops and in if statements, so they tend to branch to a nearby instruction. For example, about
half of all conditional branches in SPEC benchmarks go to locations less than 16 instructions away.
Since the program counter ( PC) contains the address of the current instruction, we can branch within

± 2 18 words of the current instruction if we use the PC as the register to be added to the address. Almost
all loops and if statements are much smaller than 2 18 words, so the PC is the ideal choice. This form of
PC-relative addressing An branch addressing is called PC-relative addressing .
addressing regime in
which the address is the Like most recent computers, LEGv8 uses PC-relative addressing for all conditional branches,
sum of the
because the destination of these instructions is likely to be close to the branch. On the other hand,
branch-and-link instructions invoke procedures that have no reason to be near the call, so they
program counter ( PC) and a
constant in the instruction. normally use other forms of addressing. Hence, the LEGv8 architecture offers long addresses for
procedure calls by using the B-type format for both branch and branch-and-link instructions.

Since all LEGv8 instructions are 4 bytes long, LEGv8 stretches the distance of the branch by
having PC-relative addressing refer to the number of words to the next instruction instead of the
number of bytes. Thus, the 19-bit field can branch four times as far by interpreting the field as a
relative word address rather than as a relative byte address: ± 1 MB from the current PC. Similarly, the
26-bit field in branch instructions is also a word address, meaning that it represents a 28-bit byte
address.

The unconditional branch is also PC-relative, which means it can branch


± 128 MB from the current PC.
2.10 LEGv8 Addressing for Wide Immediates and Addresses 119

Showing Branch Offset in Machine Language


EXAMPLE
The while loop on page 95 was compiled into this LEGv8 assembler code:

Loop:LSL X10,X22,#3 // Temp reg X10 = 8 * i


ADD X10,X10,X25 // X10 = address of save[i] LDUR X9,[X10,#0] // Temp reg
X9 = save[i] SUB X11,X9,X24
// X11 = save[i] − k
CBNZ X11, Exit // go to Exit if save[i] ≠ k (X11≠0)
ADDI X22,X22,#1 // i = i + 1
B Loop // go to Loop
Exit:

If we assume we place the loop starting at location 80000 in memory, what is the LEGv8 machine
code for this loop?

The assembled instructions and their addresses are:

80000 1691 0 3 22 10
ANSWER
80004 1112 25 0 10 10
80008 1896 0 0 10 9
80012 1624 24 0 9 11
80016 181 3 11
80020 580 1 22 22
80024 5 −6
80028 . . .

Remember that LEGv8 instructions have byte addresses, so addresses of sequential words
differ by 4, the number of bytes in a word, and that branches multiply their address fields by 4,
the size of LEGv8 instructions in bytes. The
CBNZ instruction on the fifth line adds 3 words or 12 bytes to the address of the instruction,
specifying the branch destination relative to the branch instruction (12 + 80016) and not using the
full destination address (80028). The branch instruction on the last line does a similar calculation
for a backwards branch ( − 24 + 80024), corresponding to the label Loop.
120 Chapter 2 Instructions: Language of the Computer

Most conditional branches are to a nearby location, but occasionally they branch far away, farther than can
Hardware/ be represented in the 19 bits of the conditional branch instruction. The assembler comes to the rescue just

Software as it did with large addresses or constants: it inserts an unconditional branch to the branch target, and
inverts the condition so that the conditional branch decides whether to skip the unconditional branch.
Interface

Branching Far Away


EXAMPLE
Given a branch on register X19 being equal to register zero,

CBZ X19, L1

replace it by a pair of instructions that offers a much greater branching distance. These instructions
replace the short-address conditional branch:
ANSWER
CBNZ X19, L2 B
L1
L2:

LEGv8 Addressing Mode Summary


addressing mode One of several Multiple forms of addressing are generically called addressing modes . Figure
addressing regimes delimited by 2.19 shows how operands are identified for each addressing mode. The addressing modes of the LEGv8
their varied use of operands instructions are the following:
and/or addresses.
1. Immediate addressing, where the operand is a constant within the instruction
itself.

2. Register addressing, where the operand is a register.

3. Base or displacement addressing, where the operand is at the memory location


whose address is the sum of a register and a constant in the instruction.

4. PC-relative addressing, where the branch address is the sum of the PC and a
constant in the instruction.
2.10 LEGv8 Addressing for Wide Immediates and Addresses 121

1. Immediate addressing

op rs rt Immediate

2. Register addressing

op Rm ... Rn Rd Registers

Register

3. Base addressing

op Address
op Rn Rt Memory

Register + ByteHalfword Word Doubleword

4. PC-relative addressing

op Address Rt Memory

PC + Doubleword

FIGURE 2.19 Illustration of four LEGv8 addressing modes. The operands are shaded in color. The operand of mode 3 is in memory, whereas the operand for mode 2 is a
register. Note that versions of load and store access bytes, halfwords, words, or doublewords. For mode
1, the operand is part of the instruction itself. Mode 4 addresses instructions in memory, with mode 4 adding a long address shifted left 2 bits to the PC. Note that a single
operation can use more than one addressing mode. Add, for example, uses both immediate ( ADDI) and register ( ADD) addressing.

Decoding Machine Language


Sometimes you are forced to reverse-engineer machine language to create the original assembly
language. One example is when looking at “core dump.” Figure
2.20 shows the LEGv8 encoding of the opcodes for the LEGv8 machine language. This figure helps
when translating by hand between assembly language and machine language.
122 Chapter 2 Instructions: Language of the Computer

Opcode 11-bit opcode range Instruction


Instruction Opcode
Size Start End Format

B 000101 6 160 191 B - format


STURB 00111000000 11 448 D - format
LDURB 00111000010 11 450 D - format
B.cond 01010100 8 672 679 CB - format
ORRI 1011001000 10 712 713 I - format
EORI 1101001000 10 840 841 I - format
STURH 01111000000 11 960 D - format
LDURH 01111000010 11 962 D - format
AND 10001010000 11 1104 R - format
ADD 10001011000 11 1112 R - format
ADDI 1001000100 10 1160 1161 I - format
ANDI 1001001000 10 1168 1169 I - format
BL 100101 6 1184 1215 B - format
ORR 10101010000 11 1360 R - format
ADDS 10101011000 11 1368 R - format
ADDIS 1011000100 10 1416 1417 I - format
CBZ 10110100 8 1440 1447 CB - format
CBNZ 10110101 8 1448 1455 CB - format
STURW 10111000000 11 1472 D - format
LDURSW 10111000100 11 1476 D - format
STXR 11001000000 11 1600 D - format
LDXR 11001000010 11 1602 D - format
EOR 11101010000 11 1616 R - format
SUB 11001011000 11 1624 R - format
SUBI 1101000100 10 1672 1673 I - format
MOVZ 110100101 9 1684 1687 IM - format
LSR 11010011010 11 1690 R - format
LSL 11010011011 11 1691 R - format
BR 11010110000 11 1712 R - format
ANDS 11101010000 11 1872 R - format
SUBS 11101011000 11 1880 R - format
SUBIS 1111000100 10 1928 1929 I - format
ANDIS 1111001000 10 1936 1937 I - format
MOVK 111100101 9 1940 1943 IM - format
STUR 11111000000 11 1984 D - format
LDUR 11111000010 11 1986 D - format

FIGURE 2.20 LEGv8 instruction encoding. The varying size opcode values can be mapped into the space they occupy in the
widest opcodes. By looking at the first 11 bits of the instruction and looking up the value, you can see which instruction it refers to.
2.10 LEGv8 Addressing for Wide Immediates and Addresses 123

Decoding Machine Code


EXAMPLE
What is the assembly language statement corresponding to this machine instruction?

8b0f0013 hex

The first step is converting hexadecimal to binary:


ANSWER
1000 1011 0000 1111 0000 0000 0001 0011

To know how to interpret the bits, we need to determine the instruction format, and to do that we
first need to find the opcode field. The problem is that the opcode varies from 6 bits to 11 bits
depending on the format. Since opcodes must be unique, one way to identify them is to see how
many 11-bit opcodes do the shorter opcodes correspond.

For example, the branch instruction B use a 6-bit opcode with the value:

00 0101

Measured in 11-bit opcodes, it occupies all the opcode values from

00 0101 00000

to

00 0101 11111

That is, if any 11-bit opcode had a value in that range, such as

00 0101 00100

it would conflict with the 6-bit opcode of branch.


Figure 2.20 lists the instructions in LEGv8 in numerical order by opcode, showing the range of
the 11-bit opcode space they occupy. For example, branch goes from 160 to 191, which is the
decimal version of the bit patterns above. To determine the opcode, you just take the first 11 bits
of the instruction, covert it to decimal representation, and then look up the table to find the
instruction and its format.

In this example, the tentative opcode field is then 10001011000 two, which is 1112 ten. When we
search Figure 2.20 , we see that opcode corresponds to the ADD instruction, which uses the
R-format. Thus, we can parse the binary format into fields listed in Figure 2.21 :

opcode Rm shamt Rn Rd
10001011000 00101 000000 01111 10000
124 Chapter 2 Instructions: Language of the Computer

We decode the rest of the instruction by looking at the field values. The decimal values are
5 for the Rm field, 15 for Rn, and 16 for Rd (shamt is unused). These numbers represent
registers X5, X15, and X16. Now we can reveal the assembly instruction:

ADD X16,X15,X5

Figure 2.21 shows all the LEGv8 instruction formats. Figure 2.1 on pages 64–65 shows the LEGv8
assembly language revealed in this chapter. The next chapter covers LEGv8 instructions for multiply,
divide, and arithmetic for real numbers.

Name Fields Comments

Field size 6 to 11 bits 5 to 10 bits 5 or 4 bits 2 bits 5 bits 5 bits All LEGv8 instructions are 32 bits long

R-format R opcode Rm shamt Rn Rd Arithmetic instruction format

I-format I opcode immediate address Rn Rd Immediate format

D-format D opcode op2 Rn Rt Data transfer format

B-format B opcode address Unconditional Branch format

CB-format CB opcode address immediate Rt Conditional Branch format

IW-format IW opcode Rd Wide Immediate format

FIGURE 2.21 LEGv8 instruction formats.

Check I. What is the range of addresses for conditional branches in LEGv8 (K = 1024)?
Yourself 1. Addresses between 0 and 512K − 1
2. Addresses between 0 and 2048K − 1
3. Addresses up to about 256K before the branch to about 256K after

4. Addresses up to about 1024K before the branch to about 1024K after

II. What is the range of addresses for branch and branch and link in LEGv8 (M = 1024K)?

1. Addresses between 0 and 64M − 1


2. Addresses between 0 and 256M − 1
3. Addresses up to about 32M before the branch to about 32M after
4. Addresses up to about 128M before the branch to about 128M after
2.11 Parallelism and Instructions: Synchronization 125

Elaboration: An easy-to-understand way for hardware to figure out the format of the instruction in parallel
is to think of the hardware as having a read-only memory whose address size matches the largest opcode
and whose content tells the hardware what to do for the specific instruction. Thus, instructions like add ( ADD) that
have an 11-bit opcode have a single entry in the memory, but instructions like branch ( B) with a 6-bit opcode
have many redundant copies. In fact, B has 2 11/ 2 6= 2 5 or 32 entries. A more efficient hardware structure than a
read-only memory that will accomplish the same task is a programmable-logic array ( PLA), which essentially
modifies the address decoder so that there is a single entry for every opcode, no matter its size (see Appendix
B ).

2.11 Parallelism and Instructions:


Synchronization
Parallel execution is easier when tasks are independent, but often they need to cooperate.
Cooperation usually means some tasks are writing new values that others must read. To know when
a task is finished writing so that it is safe for another to read, the tasks need to synchronize. If they
don’t synchronize, there is a danger of a data race , where the results of the program can change
depending on how events happen to occur. data race Two memory accesses
form a data race if they are from

For example, recall the analogy of the eight reporters writing a story on pages 44–45 of Chapter 1 . different threads to the same
location, at least one is a write,
Suppose one reporter needs to read all the prior sections before writing a conclusion. Hence, he or she
and they occur one after another.
must know when the other reporters have finished their sections, so that there is no danger of sections
being changed afterwards. That is, they had better synchronize the writing and reading of each section so
that the conclusion will be consistent with what is printed in the prior sections.

In computing, synchronization mechanisms are typically built with user-level software routines
that rely on hardware-supplied synchronization instructions. In this section, we focus on the
implementation of lock and unlock synchronization operations. Lock and unlock can be used
straightforwardly to create regions where only a single processor can operate, called a mutual
exclusion, as well as to implement more complex synchronization mechanisms.

The critical ability we require to implement synchronization in a multiprocessor is a set of


hardware primitives with the ability to atomically read and modify a memory location. That is, nothing
else can interpose itself between the read and the write of the memory location. Without such a
capability, the cost of building basic synchronization primitives will be high and will increase
unreasonably as the processor count increases.

There are a number of alternative formulations of the basic hardware primitives, all of which
provide the ability to atomically read and modify a location, together with some way to tell if the read
and write were performed atomically. In general, architects do not expect users to employ the basic
hardware primitives, but instead expect system programmers will use the primitives to build a
synchronization library, a process that is often complex and tricky.
126 Chapter 2 Instructions: Language of the Computer

Let’s start with one such hardware primitive and show how it can be used to build a basic
synchronization primitive. One typical operation for building synchronization operations is the atomic
exchange or atomic swap, which inter- changes a value in a register for a value in memory.

To see how to use this to build a basic synchronization primitive, assume that we want to build a
simple lock where the value 0 is used to indicate that the lock is free and 1 is used to indicate that the
lock is unavailable. A processor tries to set the lock by doing an exchange of 1, which is in a register,
with the memory address corresponding to the lock. The value returned from the exchange instruction
is 1 if some other processor had already claimed access, and 0 otherwise. In the latter case, the value
is also changed to 1, preventing any competing exchange in another processor from also retrieving a 0.

For example, consider two processors that each try to do the exchange simultane- ously: this race is
prevented, since exactly one of the processors will perform the exchange first, returning 0, and the second
processor will return 1 when it does the exchange. The key to using the exchange primitive to implement
synchronization is that the operation is atomic: the exchange is indivisible, and two simultaneous exchanges
will be ordered by the hardware. It is impossible for two processors trying to set the synchronization variable
in this manner to both think they have simultaneously set the variable.

Implementing a single atomic memory operation introduces some challenges in the design of the
processor, since it requires both a memory read and a write in a single, uninterruptible instruction.

An alternative is to have a pair of instructions in which the second instruction returns a value
showing whether the pair of instructions was executed as if the pair was atomic. The pair of
instructions is effectively atomic if it appears as if all other operations executed by any processor
occurred before or after the pair. Thus, when an instruction pair is effectively atomic, no other
processor can change the value between the pair of instructions.

In LEGv8 this pair of instructions includes a special load called a load exclusive register ( LDXR) and a
special store called a store exclusive register ( STXR). These instructions are used in sequence: if the
contents of the memory location specified by the load exclusive are changed before the store exclusive to
the same address occurs, then the store exclusive fails and does not write the value to memory. The store
exclusive is defined to both store the value of a (presumably different) register in memory and to change
the value of another register to a 0 if it succeeds and to a 1 if it fails. Thus, STXR specifies three registers:
one to hold the address, one to indicate whether the atomic operation failed or succeeded, and one to
hold the value to be stored in memory if it succeeded. Since the load exclusive returns the initial value,
and the store exclusive returns 0 only if it succeeds, the following sequence implements an atomic
exchange on the memory location specified by the contents of X20:

again:LDXR X10,[X20,#0] // load exclusive


STXR X23, X9, [X20] // store exclusive
CBNZ X9,again // branch if store fails
ADD X23,XZR,X10 // put loaded value in X23
2.11 Parallelism and Instructions: Synchronization 127

Any time a processor intervenes and modifies the value in memory between the
LDXR and STXR instructions, the STXR returns 1 in X9, causing the code sequence to try again. At the
end of this sequence, the contents of X23 and the memory location specified by X20 have been
atomically exchanged.

Elaboration: Although it was presented for multiprocessor synchronization, atomic exchange is also useful
for the operating system in dealing with multiple processes in a single processor. To make sure nothing
interferes in a single processor, the store exclusive also fails if the processor does a context switch between
the two instructions (see Chapter 5 ).

Elaboration: An advantage of the load/store exclusive mechanism is that it can be used to build other
synchronization primitives, such as atomic compare and swap
or atomic fetch-and-increment, which are used in some parallel programming models. These involve more
instructions between the LDXR and the STXR, but not too many.
Since the store exclusive will fail after either another attempted store to the load exclusive address or any
exception, care must be taken in choosing which instructions are inserted between the two instructions. In
particular, only register–register instructions can safely be permitted; otherwise, it is possible to create
deadlock situations where the processor can never complete the STXR because of repeated page faults. In
addition, the number of instructions between the load exclusive and the store exclusive should be small to
minimize the probability that either an unrelated event or a competing processor causes the store exclusive to
fail frequently.

Elaboration: While the code above implemented an atomic exchange, the following code would more
efficiently acquire a lock at the location in register X20, where the value of 0 means the lock was free and 1 to
mean lock was acquired:

ADDI X11,XZR,#1 // copy locked value


again: LDXR X10,[X20,#0] // load exclusive to read lock
CBNZ X10, again // check if it is 0 yet
STXR X11, X9, [X20] // attempt to store new value
BNEZ X9,again // branch if store fails

We release the lock just using a regular store to write 0 into the location:

STUR XZR, [X20,#0] // free lock by writing 0

When do you use primitives like load exclusive and store exclusive? Check
Yourself
1. When cooperating threads of a parallel program need to synchronize to get proper behavior for
reading and writing shared data.

2. When cooperating processes on a uniprocessor need to synchronize for reading and writing
shared data.
128 Capítulo 2 Instrucciones: Lenguaje del ordenador

2.12 Traducir y organizar un programa

En esta sección se describen los cuatro pasos en la transformación de un programa C en un archivo de almacenamiento
(disco o memoria flash) en un programa que se ejecuta en un ordenador. Figura
2.22 muestra la jerarquía de la traducción. Algunos sistemas combinan estos pasos para reducir el tiempo de
traducción, pero los programas pasan por estas cuatro fases lógicas. Esta sección sigue esta jerarquía traducción.

programa en C

Compilador

programa en lenguaje ensamblador

Ensamblador

módulo de lenguaje de máquina: Objeto Objeto: rutina de biblioteca (lenguaje de máquina)

enlazador

programa en lenguaje de máquina: Ejecutable

Cargador

Memoria

FIGURA 2.22 Una jerarquía de traducción de la C. Un programa de lenguaje de alto nivel se compila primero en un programa en lenguaje ensamblador y luego
ensamblados en un módulo de objeto en lenguaje de máquina. El enlazador combina múltiples módulos con rutinas de biblioteca para resolver todas las
referencias. El cargador continuación, coloca el código de máquina en las posiciones de memoria adecuados para su ejecución por el procesador. Para acelerar
el proceso de traducción, algunos pasos se omiten o combinada. Algunos compiladores producen módulos de objeto directamente, y algunos sistemas utilizan la
vinculación de cargadores que realizan los dos últimos pasos. Para identificar el tipo de archivo, UNIX sigue una convención sufijo para los archivos: archivos de
origen C se nombran xc, son archivos de ensamblaje xs, ficheros objeto se nombran xo, rutinas de biblioteca estáticamente enlazadas son xa, rutas de la biblioteca
de enlace dinámico son x.so, y archivos ejecutables por defecto se llaman

a.out. MS-DOS utiliza los sufijos. DO, .ASM, OBJ, .LIB .DLL, y. exe para el mismo efecto.
2.12 Traducción e iniciar un programa 129

Compilador

El compilador transforma el programa de C en una programa en lenguaje ensamblador, una forma simbólica de lo que
entiende la máquina. programas de lenguaje de alto nivel toman muchas menos líneas de código de lenguaje
ensamblador, por lo que la productividad del programador es mucho mayor.

En 1975, muchos sistemas operativos y montadores fueron escritos en lenguaje ensamblador porque los recuerdos lenguaje ensamblador Un

eran pequeños y compiladores eran ineficientes. El incremento millones de veces en la capacidad de la memoria por chip lenguaje simbólico que puede ser
traducido a lenguaje de máquina
DRAM única preocupación ha reducido el tamaño del programa, y ​la optimización de los compiladores de hoy puede
binario.
producir programas en lenguaje ensamblador casi tan bien como un experto en lenguaje ensamblador, ya veces incluso
mejores para los grandes programas.

Ensamblador

Dado que el lenguaje ensamblador es una interfaz de software de nivel superior, el ensamblador también pueden
tratar las variaciones comunes de instrucciones en lenguaje máquina como si fueran instrucciones en su propio
derecho. El hardware no necesita implementar estas instrucciones; Sin embargo, su aparición en lenguaje
ensamblador simplifica la traducción y la programación. Dichas instrucciones se denominan pseudoinstructions .
pseudoinstrucción Una variante

Como se mencionó anteriormente, el hardware LEGv8 se asegura de que el registro XZR (X31) común de instrucciones en lenguaje
ensamblador a menudo tratada como
siempre tiene el valor 0. Es decir, cada vez que el registro XZR se utiliza, se suministra un 0, y el programador
si fuera una instrucción en su propio
no puede cambiar el valor del registro XZR. Registro XZR se utiliza para crear la instrucción de lenguaje
derecho.
ensamblador que copia el contenido de un registro a otro. Por lo tanto, el ensamblador LEGv8 acepta la
siguiente instrucción a pesar de que no se encuentra en el lenguaje de máquina LEGv8:

X9 MOV, X10 // registrar X9 consigue registrarse X10

El ensamblador convierte esta instrucción de lenguaje ensamblador en el lenguaje de máquina


equivalente de la siguiente instrucción:

La ORR X9, XZR, X10 // registro X9 se 0 o registrarse X10

El ensamblador LEGv8 también convierte CMP ( comparar) en una instrucción de resta que establece los
códigos de condición y tiene XZR como el destino. Así

CMP X9, X10 // comparar X9 a X10 y establecer códigos de condición

se convierte

SUBS XZR, X9, X10 // uso X9 - X10 para establecer códigos de condición

También convierte ramas a lugares lejanos en dos ramas. Como se mencionó anteriormente, el ensamblador LEGv8
permite que grandes constantes a ser cargados en un registro a pesar del tamaño limitado de las instrucciones inmediatas.
Por lo tanto, el ensamblador puede aceptar dirección de carga ( LDA) y convertirla en la secuencia de instrucciones necesarias.
Por último, se puede simplificar
130 Capítulo 2 Instrucciones: Lenguaje del ordenador

el conjunto de instrucciones mediante la determinación de la cual la variación de una instrucción del programador quiere. Por
ejemplo, el ensamblador LEGv8 no requiere que el programador especificar la versión inmediata de la instrucción cuando se
utiliza una constante para la aritmética y las instrucciones lógicas; sólo se genera el código de operación adecuada. Así

Y X9, X10, # 15 // registro X9 X10 y obtiene 15

se convierte

ANDI X9, X10, # 15 // registro X9 X10 y obtiene 15

Incluimos el “I” en las instrucciones para recordar al lector que esta instrucción produce un código de
operación diferente en un formato de instrucción diferente a la Y
instrucción sin operandos inmediatos.
En resumen, pseudoinstructions dan LEGv8 un conjunto más rico de instrucciones en lenguaje ensamblador
que los llevados a cabo por el hardware. Si va a escribir programas de montaje, utilizar pseudoinstructions para
simplificar su tarea. Para entender la arquitectura LEGv8 y asegúrese de obtener el mejor rendimiento, sin
embargo, el estudio de las instrucciones reales que se encuentran en LEGv8 Las figuras 2.1 y 2.20 .

Ensambladores también aceptarán números en una variedad de bases. Además de binario y decimal, por lo
general aceptan una base que es más sucinto que binario todavía se convierte fácilmente en un patrón de bits.
montadores LEGv8 utilizan hexadecimal.
Tales características son convenientes, pero la tarea principal de un ensamblador es de montaje en código
máquina. El ensamblador convierte el programa en lenguaje ensamblador en una
archivo de objeto, que es una combinación de instrucciones en lenguaje máquina, los datos y la información necesaria para
colocar correctamente las instrucciones en la memoria.
Para producir la versión binaria de cada instrucción en el programa en lenguaje ensamblador, el ensamblador debe
determinar las direcciones correspondientes a todas las etiquetas. Montadores hacer un seguimiento de las etiquetas
utilizadas en las ramas y las instrucciones de transferencia de datos en una tabla de símbolos . Como era de esperar, la
tabla de símbolos Una tabla que tabla contiene pares de símbolos y direcciones.
coincide con los nombres de las
etiquetas a las direcciones de las
El archivo de objeto para sistemas UNIX normalmente contiene seis piezas distintas:
palabras de memoria que ocupan las
instrucciones.
norte los cabecera del fichero objeto describe el tamaño y la posición de las otras piezas de la
archivo de objeto.

norte los segmento de texto contiene el código de lenguaje de máquina.

norte los segmento de datos estática contiene datos asignados para la vida del programa.
(UNIX permite que los programas utilizan tanto datos estáticos, el cual se asigna a través del programa, y datos
dinámicos, que pueden aumentar o reducir, según sea necesario por el programa. Ver Figura 2.14 .)

norte los información de la relocalización identifica las instrucciones y los datos que dependen de las palabras
en direcciones absolutas cuando el programa se carga en memoria.

norte los tabla de símbolos contiene las etiquetas restantes que no están definidos, tales como
referencias externas.
2.12 Traducción e iniciar un programa 131

norte los información de depuración contiene una descripción concisa de cómo los módulos
fueron recopilados de manera que un depurador puede asociar instrucciones de la máquina con los archivos de código
fuente C y hacer estructuras de datos legibles.

La subsección siguiente muestra cómo fijar este tipo de rutinas que ya han sido ensamblados, tales como
rutinas de biblioteca.

Elaboración: Al igual que en el caso de AÑADIR y ADDI se mencionó anteriormente, el conjunto de instrucciones completo ARMv8
no utiliza Y YO cuando uno de los operandos es una inmediata; sólo se utiliza Y, y permite que el ensamblador recoger el código de
operación adecuada. Para fines de enseñanza, LEGv8 distingue nuevamente los dos casos con diferentes mnemotécnicos.

enlazador

Lo que hemos presentado hasta ahora sugiere que un único cambio en una línea de un solo procedimiento requiere la
compilación y montaje de todo el programa. retraducción completa es un terrible desperdicio de recursos informáticos.
Esta repetición es particularmente derrochador para las rutinas de la biblioteca estándar, porque los programadores se
compilan y montaje de rutinas que, por definición, casi nunca cambian. Una alternativa es compilar y ensamblar cada
procedimiento independiente, por lo que un cambio a una línea requeriría la compilación y montaje de un único
procedimiento. Esta alternativa requiere un nuevo programa de sistemas, llamado editor de enlace o enlazador , que
tiene todos los programas en lenguaje máquina montada de forma independiente y con “puntos” juntos. La razón de
un enlazador es útil es que es mucho más rápido de código de parche de lo que es recompilar y volver a montar. enlazador También llamado
editor de enlace . Un programa que
combina los sistemas de programas en
lenguaje máquina montada de forma
Hay tres pasos para el enlazador:
independiente y resuelve todas las

1. Coloque los módulos de código y de datos simbólicamente en la memoria. etiquetas definidas en un archivo
ejecutable.
2. Determinar las direcciones de las etiquetas de datos y de instrucciones.

3. Parche tanto las referencias internas y externas.

El enlazador utiliza la información de reubicación y tabla de símbolos en cada módulo objeto de resolver todas las
etiquetas no definidos. Tales referencias se dan en las instrucciones de bifurcación y direcciones de datos, por lo que el
trabajo de este programa es muy parecido al de un editor: encuentra las direcciones antiguas y los reemplaza con las nuevas
direcciones. La edición es el origen del nombre “editor de enlace,” o enlazador para abreviar.

Archivo ejecutable Un programa


Si se resuelven todas las referencias externas, el enlazador siguiente determina las posiciones de memoria cada
funcional en el formato de un archivo
módulo ocupará. Recordar que Figura 2.14 en la página 108 muestra la convención LEGv8 para la asignación de programa de objeto que no contiene
y los datos en la memoria. Dado que los archivos fueron montados de forma aislada, el ensamblador no podía saber que referencias no resueltas. Puede
las instrucciones y los datos de un módulo serían colocados en relación con otros módulos. Cuando el enlazador coloca un contener las tablas de símbolos y la

módulo de memoria, todos absoluto referencias, es decir, las direcciones de memoria que no están en relación con un información de depuración. Un
“ejecutable despojado” no contiene
registro, deben estar reubicados para reflejar su verdadera ubicación.
esa información. información de
reubicación puede ser incluido para
El enlazador produce una Archivo ejecutable que puede ser ejecutado en un ordenador. Normalmente, este archivo tiene el
el cargador.
mismo formato que un archivo objeto, a excepción de que no contiene referencias no resueltas. Es posible tener archivos
parcialmente vinculados, tales como rutinas de biblioteca, que todavía tienen direcciones sin resolver y por lo tanto resultan en
archivos objeto.
132 Capítulo 2 Instrucciones: Lenguaje del ordenador

Archivos de vinculación de objetos


EJEMPLO
Vincular los dos archivos objeto a continuación. Mostrar direcciones de las primeras instrucciones del
archivo ejecutable completado actualiza. Mostramos las instrucciones en lenguaje ensamblador sólo para
hacer comprensible el ejemplo; en la realidad, las instrucciones serían números.

Observamos que en los archivos de objetos que hemos puesto de relieve las direcciones y los símbolos que deben

actualizarse en el proceso de enlace: Las instrucciones que se refieren a las direcciones de los procedimientos UNA y segundo
y las instrucciones que se refieren a las direcciones de palabras dobles de datos X y Y.

encabezado del archivo de objetos

Nombre Procedimiento UNA

Tamano del texto 100 maleficio

Tamaño de datos 20 maleficio

segmento de texto Dirección Instrucción

0 LDUR X0, [X27, # 0 ]

4 licenciado en Derecho 0

. . . . . .
segmento de datos 0 (X)

. . . . . .
información de la relocalización Dirección tipo de instrucción Dependencia

0 LDUR X

4 licenciado en Derecho segundo

tabla de símbolos Etiqueta Dirección

X
-
segundo -
Nombre Procedimiento segundo

Tamano del texto 200 maleficio

Tamaño de datos 30 maleficio

segmento de texto Dirección Instrucción

0 STUR X1, [X27, # 0 ] 4

licenciado en Derecho 0

. . . . . .
segmento de datos 0 (Y)

. . . . . .
información de la relocalización Dirección tipo de instrucción Dependencia

0 STUR Y

4 licenciado en Derecho UNA

tabla de símbolos Etiqueta Dirección

Y -
UNA -
2.12 Traducción e iniciar un programa 133

Procedimiento UNA tiene que encontrar la dirección de la variable de etiquetado X para poner en la instrucción de carga y
para encontrar la dirección del procedimiento segundo para colocar en el licenciado en Derecho RESPONDER
instrucción. Procedimiento segundo las necesidades de la dirección de la variable de etiquetado Y para la instrucción de
almacenamiento y la dirección del procedimiento UNA por su licenciado en Derecho instrucción.
Desde Figura 2.14 en la página 108, se sabe que el segmento de texto comienza en la dirección 0000 0000 0040

0000 maleficio y el segmento de datos en 0000 0000 1000 0000 maleficio. El texto del procedimiento UNA se coloca en la primera

dirección y sus datos en el segundo. El encabezado del archivo de objeto para el procedimiento de UNA dice que su

texto es 100 maleficio


bytes y sus datos es 20 maleficio bytes, por lo que la dirección de inicio para el procedimiento de segundo texto es
40 0100 maleficio, y sus datos se inicia en 1000 0020 maleficio.

encabezado del archivo ejecutable

Tamano del texto 300 maleficio

Tamaño de datos 50 maleficio

segmento de texto Dirección Instrucción

0000 0000 0040 0000 maleficio LDUR X0, [X27, # 0 maleficio ]

0000 0000 0040 0004 maleficio licenciado en Derecho 000 00FC maleficio

. . . . . .

0000 0000 0040 0100 maleficio STUR X1, [X27, # 20 maleficio ]

0000 0000 0040 0104 maleficio licenciado en Derecho 3FF FEFC maleficio

. . . . . .
segmento de datos Dirección

0000 0000 1000 0000 maleficio (X)

. . . . . .

0000 0000 1000 0020 maleficio (Y)

. . . . . .

Ahora el enlazador actualiza los campos de dirección de las instrucciones. Utiliza el campo de tipo de
instrucción para conocer el formato de la dirección que se desea editar. Tenemos dos tipos aquí:

1. Las instrucciones de salto y relacionar el uso de PC-direccionamiento relativo. Así, para el


licenciado en Derecho en la dirección 40 0004 maleficio ir a 40 0100 hexagonal ( la dirección del procedimiento SEGUNDO),

se debe poner ( 40 0100 maleficio - 40 0004 maleficio) o 000 00FC maleficio en su campo de dirección. Del mismo modo, ya 40 0000 maleficio
es la dirección del procedimiento UNA, la licenciado en Derecho a
40 0104 maleficio obtiene el número negativo 3FF FEFC hexagonal ( 40 0000 maleficio - 40 0104 maleficio)

en su campo de dirección.

2. Las direcciones de carga y almacenamiento son más difíciles porque son en relación con un registro de base.
Este ejemplo utiliza X27 como el registro de la base, suponiendo que se inicializa a 0000 0000 1000 0000 maleficio. Para
obtener la dirección 0000 0000 1000 0000 hexagonal ( la dirección de la doble palabra X), colocamos 0 maleficio en el campo
de dirección de LDUR en la dirección 40 0000 maleficio. Del mismo modo, colocamos 20 maleficio en el campo de
dirección de STUR en la dirección 40 0100 maleficio para obtener la dirección 0000 0000 1000 0020 hexagonal ( la dirección
de la doble palabra Y).
134 Capítulo 2 Instrucciones: Lenguaje del ordenador

Elaboración: Recordemos que LEGv8 instrucciones son alineados por palabras, por lo licenciado en Derecho gotas de la derecha dos bits
para aumentar el rango de direcciones de la instrucción. Por lo tanto, se utiliza 26 bits para crear un byte de dirección de 28 bits. Por lo tanto, la

dirección real en la parte inferior 26 bits de la primera licenciado en Derecho

instrucción en este ejemplo es 000 003F maleficio, más bien que 000 00FC maleficio.

Cargador

Ahora que el archivo ejecutable está en el disco, el sistema operativo lee en la memoria y lo inicia. los cargador
cargador Un programa de sistemas que sigue estos pasos en sistemas UNIX:
coloca a un programa objeto en la
memoria principal, por lo que está listo 1. Lee el encabezado del archivo ejecutable para determinar el tamaño de los segmentos de texto y datos.
para ejecutar.

2. Crea un espacio de direcciones suficientemente grande para el texto y datos.

3. Copias de las instrucciones y datos desde el archivo ejecutable en la memoria.

4. Copia los parámetros (si los hay) al programa principal en la pila.

5. Inicializa los registros del procesador y fija el puntero de pila a la primera ubicación libre.

6. Ramas a una rutina de puesta en marcha que copia los parámetros en los registros de argumento y llama a la
rutina principal del programa. Cuando los principales retornos de rutina, la rutina de puesta en marcha del
programa termina con una salida llamada al sistema.

Las bibliotecas vinculadas dinámicamente

Prácticamente todos los La primera parte de esta sección se describe el enfoque tradicional de la vinculación de las bibliotecas antes de ejecutar el
problemas de la informática programa. Aunque este enfoque estático es la forma más rápida de llamar a rutinas de biblioteca, tiene algunas
puede ser resuelto por otro desventajas:
nivel de indirección.
norte Las rutinas de biblioteca se convierten en parte del código ejecutable. Si hay una nueva versión de
la biblioteca se libera que corrige errores o apoya nuevos dispositivos de hardware, el programa enlazado
David Wheeler estáticamente sigue usando la versión antigua.

norte Se carga en todas las rutinas de la biblioteca que son llamadas en cualquier parte del ejecutable,

incluso si esas llamadas no se ejecutan. La biblioteca puede ser grande en relación con el programa; por
ejemplo, la biblioteca estándar de C es de 2,5 MB. Estos inconvenientes conducen a bibliotecas de enlace dinámico
(DLL) , donde las rutinas de biblioteca no están vinculadas y cargado hasta que se ejecute el programa. Tanto las
bibliotecas de enlace dinámico
(DLL) rutinas de biblioteca que están rutinas de programas y bibliotecas guardan información adicional sobre la localización de los procedimientos no
vinculados a un programa durante la locales y sus nombres. En la versión original de DLL, el cargador corrió un enlazador dinámico, utilizando la
ejecución. información adicional en el archivo para encontrar las bibliotecas adecuadas y actualice todas las referencias
externas.
2.12 Traducción e iniciar un programa 135

La desventaja de la versión inicial de DLL fue que todavía vinculado todas las rutinas de la biblioteca que podrían ser
llamados, frente a sólo aquellos que son llamados durante la ejecución del programa. Esta observación dio lugar a la
versión vinculación procedimiento perezoso de DLL, donde cada rutina está vinculada únicamente después se llama.

Al igual que muchas innovaciones en nuestro campo, este truco se basa en un nivel de indirección.
Figura 2.23 muestra la técnica. Se inicia con las rutinas no locales llamando a un conjunto de rutinas ficticias
al final del programa, con una entrada por la rutina no local. Estas entradas ficticias contienen cada uno una
rama indirecta.

Texto Texto

licenciado en Derecho licenciado en Derecho


... ...

LDUR LDUR
BR BR
... .. .

Datos Datos

Texto
...
LDA ID B

...

Texto

enlazador / cargador dinámico


rutina Reasignar DLL

SEGUNDO...

Los datos / texto Texto

rutina DLL rutina DLL


... ...
BR BR

(A) En primer llamado a la rutina DLL (B) Las llamadas subsiguientes a la rutina DLL

FIGURA 2.23 enlazada dinámicamente la biblioteca a través de la vinculación procedimiento perezoso. ( a) Las medidas para la primera vez que se hace
una llamada a la rutina DLL. (B) Los pasos para encontrar la rutina, reasignar, y lo vinculan se saltan en llamadas posteriores. Como veremos en Capítulo 5 , El
sistema operativo puede evitar copiar la rutina deseada mediante la reasignación de que el uso de la gestión de memoria virtual.
136 Capítulo 2 Instrucciones: Lenguaje del ordenador

La primera vez que la rutina de biblioteca se llama, el programa llama a la entrada falsa y sigue la rama
indirecta. Apunta a código que pone un número en un registro para identificar la rutina de biblioteca deseada y
luego se ramifica a la dinámica enlazador / cargador. El enlazador / cargador encuentra la rutina deseada,
remaps, y cambia la dirección de la sucursal indirecta para apuntar a esa rutina. A continuación, las ramas a la
misma. Cuando la rutina completa, devuelve al sitio llamado originales. A partir de entonces, la llamada a la
rutina se bifurca biblioteca indirectamente a la rutina sin los saltos adicionales.

En resumen, las DLL requieren espacio adicional para la información necesaria para la vinculación dinámica, pero no
requieren que las bibliotecas enteras pueden copiar o vinculados. Ellos pagan una buena cantidad de sobrecarga de la primera
vez que una rutina es llamada, pero solamente una sola rama indirecta a partir de entonces. Tenga en cuenta que el retorno de
la biblioteca presta ninguna sobrecarga adicional. Windows de Microsoft se basa en gran medida en las bibliotecas de enlace
dinámico, y también es el valor por defecto en la ejecución de programas en los sistemas UNIX hoy.

Inicio de un programa Java


La discusión anterior captura el modelo tradicional de la ejecución de un programa, donde el énfasis está en rápido tiempo de
ejecución de un programa dirigido a una arquitectura de conjunto de instrucciones específicas, o incluso una aplicación
particular de que la arquitectura. De hecho, es posible ejecutar programas Java como C Java fue inventado con un conjunto
diferente de objetivos, sin embargo. Uno de ellos era circular con seguridad en cualquier ordenador, aunque podría ralentizar
el tiempo de ejecución.

Figura 2.24 muestra los pasos típicos de traducción y de ejecución de Java. En lugar de compilar el lenguaje
ensamblador de un equipo de destino, Java se compila primero a las instrucciones que son fáciles de interpretar: la bytecode
de Java conjunto de instrucciones (véase
bytecode de Java
sección 2.15 ). Este conjunto de instrucciones está diseñado para estar cerca del lenguaje Java por lo que este paso de
Instrucción de un conjunto de
compilación es trivial. Prácticamente no se realiza ninguna optimizaciones. Al igual que el compilador de C, el compilador de Java
instrucciones diseñadas para
interpretar los programas Java. comprueba los tipos de datos y produce el correcto funcionamiento de cada tipo. Los programas Java se distribuyen en la versión
binaria de estos códigos de bytes.

programa Java

Compilador

archivos de clase (bytecodes Java) rutinas de biblioteca de Java (lenguaje de máquina)

Justo a tiempo
máquina virtual de Java
compilador

los métodos de Java compilados (lenguaje de máquina)

FIGURA 2.24 Una jerarquía de traducción para Java. Un programa Java se compila por primera vez en una versión binaria del código de bytes de
Java, con todas las direcciones definidas por el compilador. El programa Java ya está listo para funcionar en el intérprete, llamado Máquina virtual de
Java ( JVM). La JVM une a los métodos deseados en la biblioteca de Java, mientras que el programa se está ejecutando. Para lograr un mayor
rendimiento, la JVM puede invocar el compilador JIT, que recoge selectivamente métodos en el idioma nativo de la máquina de la máquina en la que se
está ejecutando.
2.13 Ordenar AC Ejemplo de ponerlo todo junto 137

Un intérprete de software, llamado Java Virtual Machine (JVM) , puede ejecutar código de bytes de Java. Un Java Virtual Machine (JVM) El
programa que interpreta los códigos
intérprete es un programa que simula una arquitectura del conjunto de instrucciones. Por ejemplo, el simulador ARMv8
de bytes de Java.
a utilizado con este libro es un intérprete. No hay ninguna necesidad de un paso de montaje por separado, ya sea la
. traducción es tan simple que el compilador se llena en las direcciones o los encuentra JVM en tiempo de ejecución.

El lado positivo de la interpretación es la portabilidad. La disponibilidad de software de máquinas virtuales de Java significa
que la mayoría de la gente podría escribir y ejecutar programas Java Java poco después se anunció. Hoy en día, las máquinas

virtuales Java se encuentran en mil millones de dispositivos, en todo, desde teléfonos celulares a los navegadores de Internet.

La desventaja de la interpretación es menor rendimiento. Los increíbles avances en el rendimiento de los años
1980 y 1990 hicieron interpretación viable para muchas aplicaciones importantes, pero el factor de 10
desaceleración si se compara con los programas compilados tradicionalmente hechas de Java C poco atractivo para
algunas aplicaciones.
Para preservar la portabilidad y mejorar la velocidad de ejecución, la siguiente fase de desarrollo de Java era
compiladores que traducen mientras el programa estaba en marcha. Tal
Justo a tiempo compiladores (JIT) normalmente perfilar el programa en ejecución para encontrar donde los métodos son Justo a tiempo compilador (JIT) El

“calientes” y luego compilarlos en el conjunto de instrucciones nativo en el que la máquina virtual está en ejecución. La nombre dado comúnmente a un

porción compilado se guarda para la próxima vez que se ejecuta el programa, de modo que pueda correr más rápido cada compilador que opera en tiempo de
ejecución, la traducción de los
vez que se ejecuta. Este equilibrio de interpretación y compilación evoluciona con el tiempo, por lo que con frecuencia se
segmentos de código interpretados en el
ejecutan los programas Java sufren poco de la cabeza de la interpretación.
código nativo de la computadora.

Mientras que las computadoras se vuelven más rápidos para que los compiladores pueden hacer más, y como investigadores

inventan formas superiores para compilar Java sobre la marcha, la diferencia de rendimiento entre Java y C o C ++ se está

cerrando. sección 2.15 entra en mucha mayor profundidad en el


implementación de Java, código de bytes de Java, JVM, y compiladores JIT.

¿Cuál de las ventajas de un intérprete durante un traductor fue el más importante para los diseñadores de Examínese
Java?

1. Facilidad de escribir un intérprete

2. Los mensajes de error Better

3. código objeto más pequeño

4. Máquina independencia

2.13 Ordenar AC Ejemplo de ponerlo todo junto

Uno de los peligros de mostrar código en lenguaje ensamblador en fragmentos es que usted no tiene idea de lo que es un
programa en lenguaje ensamblador completo se parece. En esta sección, se deriva el código LEGv8 a partir de dos

procedimientos escritos en C: uno para intercambiar elementos de la matriz y uno para ordenar ellos.
138 Capítulo 2 Instrucciones: Lenguaje del ordenador

intercambio void (largo long int v [], size_t k)


{Temp int largo de largo;

temp = v [k]; v [k] = v [k +


1]; v [k + 1] = temp; }

FIGURA 2.25 procedimiento de CA que intercambia dos ubicaciones en la memoria. Esta subsección utiliza este procedimiento en un ejemplo de
clasificación.

El procedimiento intercambiar

Vamos a empezar con el código para el procedimiento intercambiar en Figura 2.25 . Este procedimiento simplemente
intercambia dos ubicaciones en la memoria. Al traducir de C a lenguaje ensamblador a mano, seguimos estos pasos
generales:

1. Asignar registros a las variables del programa.

2. código producen para el cuerpo del procedimiento.

3. Preservar los registros a través de la invocación procedimiento. En esta sección se describe el intercambiar procedimiento

en estas tres piezas, concluyendo al poner todas las piezas juntas.

Asignación de retribución para intercambiar

Como se ha mencionado en la página 100, la convención LEGv8 en el paso de parámetros es el uso de registros X0 a X7. Desde
trasiego tiene sólo dos parámetros, v y k, que se encuentran en los registros X0 y X1. La única otra variable es temperatura, que
asociamos con el registro X9 desde swap es un procedimiento de hoja (véase la página 113). Esta asignación del registro
corresponde a las declaraciones de variables en la primera parte del procedimiento de intercambio en

Figura 2.25 .

Código para el cuerpo del Procedimiento intercambiar

Las líneas restantes de código C en intercambio son

temp = v [k]; v [k] = v [k +


1]; v [k + 1] = temp;

Recordemos que la dirección de memoria para LEGv8 se refiere a la byte dirección, etc. palabras dobles son
realmente 8 bytes separados. Por lo tanto, necesitamos multiplicar el índice k un 8 antes de añadir a la dirección. Olvidando
que las direcciones secuenciales de doble palabra difieren en lugar de 8 por 1 es un error común en programación en
lenguaje ensamblador.
2.13 Ordenar AC Ejemplo de ponerlo todo junto 139

Por lo tanto, el primer paso es obtener la dirección de v [k] multiplicando k por 8 a través de un desplazamiento a la izquierda por 3:

LSL X10, X1, # 3 // reg X10 = k * 8


AÑADIR X10, X0, X10 // reg X10 = v + (k * 8) // reg X10 tiene la dirección de v [k]

Ahora cargamos v [k] utilizando X10, y entonces v [k + 1] mediante la adición de 8 a X10:

LDUR X9, [X10, # 0] // X9 reg (temp) = v [k]


LDUR X11, [X10, # 8] // reg X11 = v [k + 1] // refiere a siguiente elemento de
v

A continuación tienda X9 y X11 a las direcciones intercambiadas:

STUR X11, [X10, # 0] // v [k] = reg X11


STUR X9, [X10, # 8] // v [k + 1] = reg X9 (temp)

Ahora hemos asignado registros y escrito el código para realizar las operaciones del procedimiento. Lo que falta es
el código para la conservación de los registros guardados utilizados dentro de intercambiar. Puesto que no estamos
utilizando registros salvados en este procedimiento hoja, no hay nada que conservar.

El lleno intercambiar Procedimiento

Ahora estamos listos para toda la rutina, que incluye la etiqueta de procedimiento y del ramal de retorno. Para
que sea más fácil de seguir, identificamos en Figura 2.26 cada bloque de código con su finalidad en el
procedimiento.

cuerpo del procedimiento

swap: LSL X10, X1, # 3 # reg X10 = k * 8

AÑADIR X10, X0, X10 # reg X10 = v + (k * 8)

# reg X10 tiene la dirección de v [k]

LDUR X9, [X10, # 0] # reg X9 (temp) = v [k]

LDUR X11, [X10, # 8] # reg X11 = v [k + 1]

# se refiere al siguiente elemento de v

STUR X11, [X10, # 0] # v [k] = reg X11

STUR X9, [X10, # 8] # v [k + 1] = reg X9 (temp)

procedimiento de devolución

BR LR # volver a la rutina de llamada

FIGURA 2.26 LEGv8 código de montaje del procedimiento intercambiar en Figura 2.25 .
140 Capítulo 2 Instrucciones: Lenguaje del ordenador

void sort (largo long int v [], int size_t n) {size_t, j;

for (i = 0; i <n; i + = 1) {
para (j = i - 1; j> = 0 && v [j]> v [j + 1]; j + = 1) {
swap (v, j); }}}

FIGURA 2.27 procedimiento AC que realiza una especie en la matriz v.

El procedimiento ordenar

Para asegurarse de que usted aprecia el rigor de la programación en lenguaje ensamblador, vamos a tratar de un segundo

ejemplo, más tiempo. En este caso, vamos a construir una rutina que llama al procedimiento de intercambio. Este programa

ordena una matriz de enteros, usando la burbuja o intercambio especie, que es uno de los más sencillos si no el tipo más

rápido. Figura 2.27 muestra la versión C del programa. Una vez más, presentamos este procedimiento en varias etapas,

concluyendo con el procedimiento completo.

Asignación de retribución para ordenar

Los dos parámetros del procedimiento Ordena, v y norte, son en los registros de parámetros
X0 y X1, y asignamos registro X19 a yo y registrar X20 a j.

Código para el cuerpo del Procedimiento ordenar

El cuerpo del procedimiento consiste en dos anidada para bucles y una llamada a intercambiar que incluye parámetros. Vamos a
desenvolver el código desde el exterior hacia el centro.
El primer paso es la primera traducción para lazo:

for (i = 0; i <n; i + = 1) {

Recordemos que el C para declaración tiene tres partes: inicialización, prueba de lazo, y el incremento de iteración.
Sólo hace falta una instrucción para inicializar yo a 0, la primera parte de la para declaración:

MOV X19, XZR // i = 0

(Recuérdalo MOV es un pseudoinstrucción proporcionada por el ensamblador para la conveniencia del programador
de lenguaje ensamblador; consulte la página 129.) También tiene una sola instrucción para incrementar yo, la última
parte de la para declaración:

ADDI X19, X19, # 1 // i + = 1


2.13 Ordenar AC Ejemplo de ponerlo todo junto 141

El bucle debe salir si i <n es no verdadero o, dicho de otra manera, debería salir si i ≥ norte. Esta prueba se
realiza en dos instrucciones:

for1tst: CMP X19, X1 // comparo X19 a X1 (i a n)

exit1 B.GE // ir a exit1 si X19 ≥ X1 (i≥n)

La parte inferior del bucle sólo ramas de nuevo a la prueba de bucle:

segundo for1tst // rama a prueba de bucle externo

exit1:

El código esqueleto de la primera para bucle es entonces

MOV X19, XZR // i = 0


for1tst: CMP X19, X1 // comparo X19 a X1 (i a n)
exit1 B.GE // ir a exit1 si X19 ≥ X1 (i≥n)
...
(Cuerpo del primero para circular)
...
ADDI X19, X19, # 1 // i + = 1 B
for1tst // rama a prueba de bucle externo
exit1:

Voila! (Los ejercicios explorar la escritura de código más rápido para los bucles similares).
El segundo para bucle se parece a esto en C:

para (j = i - 1; j> = 0 && v [j]> v [j + 1]; j - = 1) {

La parte de la inicialización de este bucle es de nuevo una instrucción:

SUBI X20, X19, # 1 // j = i - 1

La disminución de j al final del bucle es también una instrucción:

SUBI X20, X20, # 1 // j - = 1

La prueba de bucle tiene dos partes. Salimos del bucle si una u otra condición falla, por lo que la primera prueba que salir
del bucle si falla ( j < 0):

for2tst: CMP X20, XZR // comparar X20 a 0 (j a 0)


exit2 B.LT // ir a exit2 si X20 <0 (j <0)

Esta rama saltará la segunda prueba de condición. Si no salta, a continuación, j ≥ 0.


142 Capítulo 2 Instrucciones: Lenguaje del ordenador

Las segundas salidas de prueba si v [j]> v [j + 1] es no verdaderos o salidas si v [j] ≤ v [j + 1]. Primero creamos la
dirección de multiplicar j por 8 (ya que necesitamos una dirección de byte) y añadirlo a la dirección base de v:

LSL X10, X20, # 3 // reg X10 = j * 8


AÑADIR X11, X0, X10 // reg X11 = v + (j * 8)

Ahora cargamos v [j]:

LDUR X12, [X11, # 0] // reg X12 = v [j]

Como sabemos que el segundo elemento es la siguiente palabra doble, añadimos 8 a la dirección en
el registro X11 Llegar v [j + 1]:

LDUR X13, [X11, # 8] // reg X13 = v [j + 1]

probamos v [j] ≤ v [j + 1] para salir del bucle

CMP X12, X13 // comparar X12 a X13


B.LE exit2 // ir a exit2 si X12 X13 ≤

La parte inferior de las ramas bucle de nuevo a la prueba de bucle interior:

B for2tst // rama a prueba de bucle interior

La combinación de las piezas, el esqueleto de la segunda para bucle se ve así:

SUBI X20, X19, # 1 // j = i - 1


for2tst: CMP X20, XZR // comparar X20 a 0 (j a 0)
exit2 B.LT // ir a exit2 si X20 <0 (j <0)
LSL X10, X20, # 3 // reg X10 = j * 8
AÑADIR X11, X0, X10 // reg X11 = v + (j * 8)
LDUR X12, [X11, # 0] // reg X12 = v [j]
LDUR X13, [X11, # 8] // reg X13 = v [j + 1]
CMP X12, X13 // comparar X12 a X13
exit2 B.LE // ir a exit2 si X12 X13 ≤
. . .
(Cuerpo del segundo bucle for)
. . .
SUBI X20, X20, # 1 // j - 1 =
segundo for2tst // rama a prueba de bucle interior

exit2:
2.13 Ordenar AC Ejemplo de ponerlo todo junto 143

La llamada a procedimiento en ordenar

El siguiente paso es el cuerpo de la segunda para lazo:

swap (v, j);

Vocación intercambiar es bastante fácil:

intercambio BL

Paso de parámetros en ordenar

El problema viene cuando queremos pasar parámetros debido a que la ordenar procedimiento necesita los valores en los
registros X0 y X1, sin embargo, el procedimiento de intercambio necesita tener sus parámetros colocado en esos mismos
registros. Una solución consiste en copiar los parámetros de ordenar en otros registros anteriores en el procedimiento, por lo
que los registros X0 y X1
disponible para la convocatoria de intercambiar. ( Esta copia es más rápido que guardar y restaurar en la pila.) En primer lugar,
copiamos X0 y X1 dentro X21 y X22 Durante el procedimiento:

MOV X21, X0 // copia de parámetros X0 en X21


MOV X22, X1 // copia parámetro X1 en X22

A continuación, pasamos a los parámetros intercambiar con estas dos instrucciones:

X0 MOV, X21 // primer parámetro de intercambio es v


X1 MOV, X20 // segundo parámetro de intercambio es j

Registros conservantes ordenar

El código único que queda es el ahorro y la restauración de registros. Es evidente que debemos guardar la dirección de
retorno en el registro LR, ya que ordenar es un procedimiento y se llama a sí mismo. los ordenar procedimiento también utiliza los
registros Callee-salvado X19, X20, X21, y X22, por lo que deben ser guardados. El prólogo de la ordenar procedimiento es
entonces

SUBI SP, SP, # 40 // hacer espacio en la pila durante 5 reglas


STUR LR, [SP, # 32] // guardar en la pila LR
STUR X22, [SP, # 24] // guardar X22 en la pila
STUR X21, [SP, # 16] // guardar X21 en la pila
STUR X20, [SP, # 8] // guardar X20 en la pila
STUR X19, [SP, # 0] // guardar X19 en la pila

La cola del procedimiento simplemente invierte todas estas instrucciones, y luego se añade una BR

regresar.

El procedimiento completo ordenar

Ahora ponemos todas las piezas juntas en Figura 2.28 , Teniendo cuidado de sustituir las referencias a registros
X0 y X1 en el para bucles con referencias a registros X21 y X22.
144 Capítulo 2 Instrucciones: Lenguaje del ordenador

ahorro de registros

para ordenar: SUBI SP, SP, # 40 // hacer espacio en la pila de 5 registros


STUR X30, [SP, # 32] // guardar en la pila LR
STUR X22, [SP, # 24] // guardar X22 en la pila
STUR X21, [SP, # 16] // guardar X21 en la pila
STUR X20, [SP, # 8] // guardar X20 en la pila
STUR X19, [SP, # 0] // guardar X19 en la pila

cuerpo del procedimiento

MOV X21, X0 # copia de parámetros X0 en X21


parámetros de movimiento
MOV X22, X1 # copia de parámetros X1 en X22

MOV X19, X19 XZR, #I=0

lazo externo for1tst: CMP X1 # comparar X19 a X1 (i a n)


B.GE exit1 # ir a exit1 si X19 ≥ X1 (i≥n)

SUBI X20, X19, # 1 #J=i-1


for2tst: CMP X20, XZR # comparar X20 a 0 (j a 0)
B.LT exit2 X10, X20, # 3 # ir a exit2 si X20 <0 (j <0)
LSL X11, X0, X10 X12, # reg X10 = j * 8

bucle interno ADD [X11, # 0] X13, [X11, # # reg X11 = v + (j * 8)


LDUR 8] X12, X13 exit2 # reg X12 = v [j]
LDUR # reg X13 = v [j + 1]
CMP # Comparar X12 a X13
B.LE # ir a exit2 si X12 X13 ≤

MOV X0, X21 # primer parámetro de intercambio es v


Pasar parámetros y
MOV BL X1, X20 # segundo parámetro de intercambio es j
llamada
intercambio

bucle interno SUBI X20, X20, # 1 B #J-1=


for2tst # rama a prueba de bucle interior
lazo externo exit2: ADDI X19, X19, # 1 #I+=1
segundo for1tst # rama a prueba de bucle externo

La restauración de registros

exit1: STUR X19, [SP, # 0] STUR # restaurar X19 de la pila


X20, [SP, # 8] STUR # restaurar X20 de la pila
STUR STUR SUBI
X21, [SP, # 16] X22, # restaurar X21 de la pila
[SP, # 24] X30, [SP, # # restaurar X22 de la pila
32] SP, SP, # 40 # restauración de la pila LR
# restaurar puntero de pila

procedimiento de devolución

BR LR # volver a la rutina de llamada

FIGURA 2.28 LEGv8 versión montaje de procedimiento ordenar en Figura 2.27 .


2.13 Ordenar AC Ejemplo de ponerlo todo junto 145

Una vez más, para hacer el código más fácil de seguir, identificamos cada bloque de código con su propósito en el
procedimiento. En este ejemplo, nueve líneas de la ordenar procedimiento en C se convirtió en 34 líneas en el lenguaje
ensamblador LEGv8.

Elaboración: Una optimización que trabaja con este ejemplo es inlining procedimiento.
En lugar de pasar argumentos a parámetros e invocando el código con una licenciado en Derecho instrucción, el
compilador copia el código del cuerpo de la intercambiar procedimiento en el que la llamada a intercambiar aparece en el
código. Inlining evitaría cuatro instrucciones en este ejemplo. La desventaja de la optimización de procesos en línea es que
el código compilado sería más grande si el procedimiento inline se llama desde varios lugares. Tal expansión código podría
convertirse en inferior rendimiento si se incrementa la tasa de error de caché; ver Capítulo 5 .

Figura 2.29 muestra el impacto de la optimización del compilador en el rendimiento del programa de género, tiempo de Rendimiento de los
compilación, ciclos de reloj, el recuento de instrucción, y el IPC. Tenga en cuenta que el código no optimizado tiene el mejor
programas
IPC, y O1 optimización tiene el cómputo de instrucciones más bajo, pero O3 es el más rápido, que nos recuerda que el
tiempo es la única medida precisa del desempeño del programa.
comprensión

Figura 2.30 compara el impacto de los lenguajes de programación, compilación frente a la interpretación y
algoritmos en el rendimiento de las clases. La cuarta columna muestra que el programa no optimizado C es 8,3
veces más rápido que el código Java interpretado para Bubble Sort. Usando el compilador JIT de Java hace 2,1
veces Más rápido que el C no optimizado y dentro de un factor de 1,13 del código C más alta optimizado. ( sección
2.15 da más detalles sobre la interpretación frente compilación de Java y el código Java y LEGv8 para Bubble
Sort.) Las relaciones no son tan cerca de la ordenación rápida en la columna 5, presumiblemente debido a que es
más difícil de amortizar el coste de compilación en tiempo de ejecución durante el tiempo de ejecución más corto .
La última columna muestra el impacto de un mejor algoritmo, que ofrece tres órdenes de magnitud por un aumento
de rendimiento al ordenar 100.000 artículos. Incluso comparando interpretado Java en la Columna 5 al compilador
C en mayor optimización en la Columna 4, Quicksort late ordenamiento de burbuja por un factor de 50 (0,05 × 2468,
o 123 veces más rápido que el código C no optimizado frente a 2,41 veces más rápido).

Elaboración: Los compiladores ARMv8 siempre ahorrar espacio en la pila de los argumentos en caso de que necesitan ser
almacenados, por lo que en realidad siempre decremento SP por 64 para dar cabida a todos los ocho registros de argumento (64
bytes). Una de las razones es que C proporciona una vararg
opción que permite a un puntero a recoger, por ejemplo, el tercer argumento a un procedimiento. Cuando el
compilador encuentra la rara vararg, copia los ocho registros de argumento en la pila en los ocho lugares
reservados.
146 Capítulo 2 Instrucciones: Lenguaje del ordenador

Desempeño ciclos de reloj cómputo de instrucciones

optimización de gcc relativo (millones) (millones) IPC

Ninguna 1.00 158615 114938 1.38

O1 (medio) 2.37 66990 37470 1.79

O2 (completo) 2.38 66521 39993 1.66

O3 (integración procedimiento) 2.41 65747 44993 1.46

FIGURA 2.29 Comparación de rendimiento, cómputo de instrucciones, y el IPC mediante la optimización del compilador para la ordenación de
burbuja. Los programas ordenados 100.000 palabras de 32 bits con la matriz inicializado a valores aleatorios. Estos programas se ejecutan en un Pentium 4
con una velocidad de reloj de 3,06 GHz y un bus de sistema de 533 MHz, con 2 GB de SDRAM DDR PC2100. Se utilizó la versión 2.4.20 de Linux.

Burbuja Ordenar relativa quicksort relativa Aceleración ordenación rápida

Idioma método de ejecución Optimización actuación actuación frente a la ordenación de burbuja

do Compilador Ninguna 1.00 1.00 2468

Compilador O1 2.37 1.50 1562

Compilador O2 2.38 1.50 1555

Compilador O3 2.41 1.91 1955

Java Interprete - 0.12 0.05 1050

compilador JIT - 2.13 0.29 338

Figura 2.30 Rendimiento de dos algoritmos de clasificación en C y Java utilizando la interpretación y la optimización de los compiladores de C relativos a la versión sin optimizar. La
última columna muestra la ventaja en el rendimiento de la ordenación rápida sobre ordenamiento de burbuja para cada opción de idioma y ejecución. Estos programas se ejecutan en el mismo
sistema que en Figura 2.29 . La JVM es Sun versión 1.3.1, y el JIT es Sun hotspot versión 1.3.1.

2.14 Las matrices frente Punteros

Un reto para cualquier nuevo programador C es punteros comprensión. Al comparar el código de montaje que utiliza
matrices y los índices de matriz para el código ensamblador que utiliza punteros ofrece información sobre los punteros.
Esta sección muestra C y LEGv8 versiones de montaje de dos procedimientos para borrar una secuencia de palabras
dobles en la memoria: uno utilizando índices de matriz y una con punteros. Figura 2.31 muestra los dos procedimientos
C.
El propósito de esta sección es mostrar cómo los punteros del mapa en instrucciones LEGv8, y no apoyar un
estilo de programación de fecha. Veremos el impacto de la optimización del compilador moderna en estos dos
procedimientos al final de la sección.

Versión gama de Clear


Vamos a empezar con la versión matriz, clear1, centrándose en el cuerpo del bucle e ignorando el código del
procedimiento de ligamiento. Suponemos que los dos parámetros formación
y tamaño se encuentran en los registros X0 y X1, y eso yo se asigna a registrar X9.
2.14 Arrays frente Punteros 147

clear1 (largo, largo array int [], int size_t tamaño) {size_t i;

for (i = 0; i <tamaño; i + = 1)
array [i] = 0;
} Clear2 (largo, largo array int *, size_t int tamaño) {long long int * p;

para (p = & array [0]; p <Y array [tamaño]; p = p + 1)


* P = 0;
}

FIGURA 2.31 Dos procedimientos C para el establecimiento de una matriz para todos ceros. clear1 utiliza los índices, mientras claras2 utiliza
punteros. El segundo procedimiento necesita alguna explicación para aquellos familiarizados con C. La dirección de una variable se indica
mediante Y, y el objeto apuntado por un puntero se indica por *. Las declaraciones declaran que formación y pag son punteros a enteros. La primera
parte de la para incluyete claras2
asigna la dirección del primer elemento de formación al puntero pag. La segunda parte de la para pruebas de bucle para ver si el puntero está
apuntando más allá del último elemento de formación. Incrementar un puntero a una, en la parte inferior de la para lazo, significa mover el puntero al
siguiente objeto secuencial de su tamaño declarado. Ya que pag es un puntero a números enteros, el compilador genera instrucciones para
incrementar LEGv8 pag por ocho, el número de bytes en un número entero LEGv8. La asignación en el bucle coloca 0 en el objeto apuntado por pag.

La inicialización de yo, la primera parte de la para bucle, es sencillo:

MOV X9, XZR // i = 0 (registro X9 = 0)

para establecer array [i] a 0 debemos obtener primero su dirección. Comience multiplicando yo por 8 para obtener la dirección

de byte:

bucle1: LSL X10, X9, # 3 // X10 = i * 8

Desde la dirección inicial de la matriz está en un registro, hay que añadir que el índice para obtener la
dirección de array [i] usando una instrucción Add:

AÑADIR X11, X0, X10 // X11 = dirección de array [i]

Por último, podemos almacenar 0 en esa dirección:

STUR XZR, [X11, # 0] // array [i] = 0

Esta instrucción es el extremo del cuerpo del bucle, por lo que el siguiente paso es para incrementar yo:

X9 ADDI, X9, # 1 // i = i + 1

La prueba de bucle si yo es menor que el tamaño de:

CMP X9, X1 // i comparar con el tamaño


B.LT bucle1 // si (i <tamaño) ir a loop1
148 Capítulo 2 Instrucciones: Lenguaje del ordenador

Ahora hemos visto todas las partes del procedimiento. Aquí está el código LEGv8 para la limpieza de una matriz
mediante índices:

MOV X9, XZR // i = 0


bucle1: LSL X10, X9, # 3 // X10 = i * 8
AÑADIR X11, X0, X10 // X11 = dirección de array [i]
STUR XZR, [X11, # 0] // array [i] = 0 ADDI
X9, X9, # 1 // i = i + 1
CMP X9, X1 // i comparar con el tamaño
bucle1 B.LT // si (i <tamaño) ir a loop1

(Este código funciona siempre y cuando tamaño es mayor que 0; ANSI C requiere una prueba de tamaño antes del bucle, pero
vamos a omitir que la legalidad aquí.)

Versión puntero de Claro


El segundo procedimiento que utiliza punteros asigna los dos parámetros formación y
tamaño a los registros X0 y X1 y asigna pag para registrarse X9. El código para el segundo procedimiento se inicia
con la asignación del puntero pag a la dirección del primer elemento de la matriz:

MOV X9, X0 // p = dirección de array [0]

El siguiente código es el cuerpo de la para bucle, que simplemente almacena 0 en pag:

LOOP2: STUR XZR, [X9, # 0] // Memoria [p] = 0

Esta instrucción implementa el cuerpo del bucle, por lo que el siguiente código es el incremento de iteración, que
cambia pag para apuntar a la siguiente palabra doble:

ADDI X9, X9, # 8 // p = p + 8

Incrementar un puntero por 1 significa mover el puntero al siguiente objeto secuencial en C. Desde pag es un puntero
a enteros declarado como long int largo, cada uno de los cuales utiliza 8 bytes, los incrementos del compilador pag por
8.
La prueba de bucle es el siguiente. El primer paso es el cálculo de la dirección del último elemento de formación. Comenzar con
la multiplicación tamaño por 8 para obtener su dirección de byte:

LSL X10, X1, # 3 // X10 = tamaño * 8

y luego añadimos el producto a la dirección inicial de la matriz para obtener la dirección de la primera palabra doble
después la matriz:

AÑADIR X11, X0, X10 // X11 = dirección de array [tamaño]

La prueba de bucle es simplemente para ver si pag es menor que el último elemento de formación:

X9 CMP, X11 // p comparar a & array [tamaño]


LOOP2 B.LT // si (p <Y array [tamaño]) ir a LOOP2
2.14 Arrays frente Punteros 149

Con todas las piezas completas, podemos mostrar una versión puntero del código para poner a cero una matriz:

X9 MOV, X0 // p = dirección de array [0]


LOOP2: STUR XZR, [X9, # 0] // Memoria [p] = 0
X9 ADDI, X9, # 8 // p = p + 8
LSL X10, X1, # 3 // X10 = tamaño * 8
AÑADIR X11, X0, X10 // X11 = dirección de array [tamaño]
X9 CMP, X11 // comparar p a <y array [tamaño]
LOOP2 B.LT // si (p <Y array [tamaño]) ir a LOOP2

Al igual que en el primer ejemplo, este código se supone tamaño es mayor que 0. Tenga en cuenta que este
programa calcula la dirección de la final de la matriz en cada iteración del bucle, a pesar de que no cambia.
Una versión más rápida del código mueve este cálculo fuera del bucle:

X9 MOV, X0 // p = dirección de array [0]


LSL X10, X1, # 3 // X10 = tamaño * 8
AÑADIR X11, X0, X10 // X11 = dirección de array [tamaño]
LOOP2: STUR XZR, 0 [X9, # 0] // Memoria [p] = 0
X9 ADDI, X9, # 8 // p = p + 8
X9 CMP, X11 // comparar p a <y array [tamaño]
LOOP2 B.LT // si (p <Y array [tamaño]) ir a LOOP2

Al comparar las dos versiones de Claro


Comparando el lado dos secuencias de código a lado ilustra la diferencia entre los índices de matriz
y punteros (los cambios introducidos por la versión puntero se destacan):

X9 MOV, XZR // i = 0 X9 MOV, X0 // p = & array [0]

bucle1: LSL X10, X9, # 3 // X10 = i * 8 LSL X10, X1 , # 3 // X10 = tamaño * 8

AÑADIR X11, X0, X10 // X11 = & array [i] AÑADIR X11, X0, X10 // X11 = & array [ tamaño ]

STUR XZR, [X11, # 0] // array [i] = 0 ADDI X9, X9, # 1 LOOP2: STUR XZR, [ X9 , # 0]) // Memoria [p] = 0

// i = i + 1 ADDI X9, X9, # 8 // p = p + 8

X9 CMP, X1 // i comparar con el tamaño X9 CMP, X11 // comparar p a & array [tamaño]

bucle1 B.LT // if () ir a loop1 B.LT LOOP2 // si (p <Y array [tamaño]) ir a LOOP2

La versión de la izquierda debe tener la “multiplicar” y añadir el interior del bucle porque
yo se incrementa y cada dirección debe ser recalculado del nuevo índice. La versión puntero de memoria
a la derecha incrementa el puntero pag directamente. La versión puntero se mueve el cambio de escala y
el unido array Además fuera del bucle,
150 Capítulo 2 Instrucciones: Lenguaje del ordenador

reduciendo de esta manera las instrucciones ejecutadas por iteración de seis a cuatro. Esta optimización manual
corresponde a la optimización del compilador de reducción de la resistencia (SHIFT en lugar de multiplicar) y la
inducción eliminación variable (la eliminación de cálculos de dirección matriz dentro de bucles).
sección 2.15 describe estos dos y otros muchos
optimizaciones.

Elaboración: Como se mencionó anteriormente, un compilador C añadiría una prueba para asegurarse de que tamaño
es mayor que 0. Una manera sería añadir una rama justo antes de la primera instrucción del bucle a la CMP instrucción.

Comprensión La gente una vez que se les enseñó a utilizar punteros en C para conseguir una mayor eficiencia que la disponible con
matrices: “Use punteros, incluso si no se puede entender el código” compiladores optimizadores modernos pueden producir
rendimiento de
código para la versión de matriz que es igual de bueno. La mayoría de los programadores prefieren hoy que el compilador
los programas haga el trabajo pesado.

2.15
2.15 Advanced Material:
Interpretación Compilación C y
de Java

En esta sección se presenta una breve descripción de cómo funciona el compilador de C y cómo se ejecuta Java. Debido
a que el compilador afectará significativamente el rendimiento de un equipo, la comprensión de la tecnología compilador
de hoy en día es fundamental para comprender el rendimiento. Tenga en cuenta que el tema de la construcción de
compiladores se enseña generalmente en un curso de uno o dos semestres, por lo que nuestra introducción
necesariamente sólo tocan en lo básico.

lenguaje orientado a La segunda parte de esta sección es para los lectores interesados ​en ver cómo una a objetos lenguaje orientado como
objetos UNA Java ejecuta en una arquitectura LEGv8. Muestra los bytes de Java códigos utilizados para la interpretación y el código
lenguaje de programación que se
LEGv8 para la versión Java de algunos de los segmentos C en las secciones anteriores, incluyendo la ordenación de
orienta alrededor de los objetos en
burbuja. Abarca tanto la máquina virtual de Java y compiladores JIT.
lugar de acciones, o los datos frente
a la lógica.
El resto de sección 2.15 se pueden encontrar en línea.

2.16 Cosas reales: Instrucciones de MIPS

El conjunto de instrucciones más cercano a ARMv8 proviene de otra compañía. MIPS y ARMv8 comparten
la misma filosofía de diseño, a pesar de ser MIPS 25 años más
2.15 Advanced Material: Compilación C e Interpretación de Java 150.e1

2.15 Advanced Material: Compilación C y


Interpretación de Java

En esta sección se presenta una breve descripción de cómo funciona el compilador de C y cómo se ejecuta Java. Debido
a que el compilador afectará significativamente el rendimiento de un equipo, la comprensión de la tecnología compilador
de hoy en día es fundamental para comprender el rendimiento. Tenga en cuenta que el tema de la construcción de
compiladores se enseña generalmente en un curso de uno o dos semestres, por lo que nuestra introducción
necesariamente sólo tocan en lo básico.

La segunda parte de esta sección, comenzando en la página 150.e15, es para los lectores interesados ​en ver cómo
un lenguaje orientado a objetado como Java se ejecuta en la arquitectura LEGv8. Muestra los bytecodes Java utilizadas
para la interpretación y el código LEGv8 para la versión Java de algunos de los segmentos C en las secciones
anteriores, incluyendo la ordenación de burbuja. Abarca tanto la máquina virtual Java y justo a tiempo (JIT)
compiladores.

compilación C

Esta primera parte de la sección introduce el interno anatomía de un compilador. Para comenzar, Figura e2.15.1 muestra
la estructura de los compiladores recientes, y se describen las optimizaciones en el orden de los pasos de esa
estructura.

dependencias Función
Dependen del idioma; Transformar el lenguaje de forma
parte delantera por
independiente de la máquina intermedia común
idioma

representación
intermedia
Algo dependen del idioma; en gran medida Por ejemplo, las transformaciones de
optimizaciones
independiente de la máquina bucle y inlining procedimiento
de alto nivel
(también llamado integración
procedimiento) Incluyendo
optimizaciones globales y locales

dependencias del lenguaje pequeñas;


optimizador
dependencias máquina ligera (por ejemplo, registro
global
regístrese cuentas / tipos) asignación

Altamente dependiente de la máquina; selección instrucción detallada y


Generador de códigos
independiente del lenguaje optimizaciones dependientes de la
máquina; puede incluir o estar seguido de
ensamblador

FIGURA e2.15.1 La estructura de un compilador de optimización moderna consiste en un número de pasadas o fases. Lógicamente, cada
pasada puede ser pensado como correr hasta su finalización antes de que ocurra la siguiente. En la práctica, algunos pases pueden manejar un
procedimiento a la vez, esencialmente entrelazado con otro pase.
150.e2 2.15 Advanced Material: Compilación C e Interpretación de Java

Para ilustrar los conceptos de esta parte de esta sección, vamos a utilizar la versión C de una mientras bucle de la
página 95:

while (guardar k [i] ==) i + = 1;

El extremo delantero

La función de la parte delantera es leer en un programa de fuente; comprobar la sintaxis y la semántica; y traducir
el programa fuente a una forma intermedia que interpreta la mayor parte de la operación específica del idioma del
programa. Como veremos más adelante, las formas intermedias suelen ser simples, y algunos están, de hecho,
similar a los códigos de bytes de Java (ver Figura e2.15.8 ).

El extremo frontal está típicamente dividido en cuatro funciones separadas:

1. Exploración lee en caracteres individuales y crea una serie de fichas.


Ejemplos de fichas son palabras reservadas, nombres, operadores y signos de puntuación. En el
ejemplo anterior, la secuencia de token es mientras, (, guardar, [, i,], ==, k,), i, + =, 1. Una palabra como mientras
se reconoce como una palabra reservada en C, pero salvar, yo, y j son reconocidos como nombres, y 1
es reconocido como un número.

2. análisis toma la corriente de modo, asegura la sintaxis es correcta, y produce


un árbol de sintaxis abstracta, que es una representación de la estructura sintáctica del programa. Figura
e2.15.2 muestra lo que el árbol de sintaxis abstracta podría ser similar para este fragmento de programa.

3. El análisis semántico toma el árbol de sintaxis abstracta y comprueba el programa de


la corrección semántica. verificaciones semánticas normalmente aseguran que las variables y tipos se declaran
correctamente y que los tipos de operadores y objetos partido, un paso llamado comprobación de tipos. Durante
este proceso, una tabla de símbolos que representa a todos los objetos-clases, variables y funciones
nombradas-normalmente se crea y se utiliza para escribir a comprobar el programa.

4. La generación de la representación intermedia ( IR) toma la tabla de símbolos y


el árbol de sintaxis abstracta y genera la representación intermedia que es la salida de la parte delantera.
representa