Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ac2 2019 - Apunte
Ac2 2019 - Apunte
Cuatrimestre 2019
Arquitectura de
Computadoras II
Arquitectura de Computadoras II
Tabla de contenido
Unidad 1 - MEMORIA----------------------------------------------------------------------------------- 4
1 - Jerarquía de Memoria 4
2. Memoria Caché 6
Política de ubicación 12
Correspondencia directa 13
Correspondencia asociativa 17
Correspondencia asociativa de conjuntos 19
Política De Sustitución 22
Política De Actualización 24
Tamaño de la caché 25
Cachés compartidas o separadas 33
3. Memoria Principal 42
Bibliografía; 52
Unidad 2 – Segmentación del Cauce (Pipeline) 53
1- Conceptos Básicos 53
2 - Etapas del MIPS64 63
3. Riesgos (Ralentización del Cauce) 69
Bibliografía; 86
Unidad 3 – Arquitecturas De Computadoras Paralelas 87
3.1 - ASPECTOS DEL DISEÑO DE COMPUTADORAS PARALELAS--------------------------------------88
3 1.1 Modelos de comunicación 91
Multiprocesadores 91
Multicomputadoras 92
3 1.2 Redes de interconexión 96
Topología 98
Conmutación 102
Algoritmos de enrutamiento 104
3 1.3 Desempeño 106
Métricas de hardware 106
Métricas de software 107
Cómo lograr un buen desempeño 109
3 1.4 Software 111
A. Modelos de control 112
B. Granularidad del paralelismo 113
C. Paradigmas computacionales 114
D. Métodos de comunicación 115
E. Primitivas de sincronización 116
1
Arquitectura de Computadoras II
2
Arquitectura de Computadoras II
GUIA DE PREGUNTAS------------------------------------------------------------------------------------------- 177
Guía de Preguntas – Unidad I 178
Guía de Preguntas – Unidad II 179
Guía de Preguntas – Unidad III 180
Anexo 182
Instrucciones MIPS64 183
SISD VS SIMD 184
Supermicro 4028GR-TR 4U 8-Way GPU SuperServer Review 187
El ránking de las supercomputadoras 190
Supercomputadora con procesadores chinos rebasa a la competencia 191
Sequoia IBM BlueGene/Q 193
Análisis a fondo: Arquitectura GPU NVIDIA Pascal – Diseñada para la velocidad 205
El paralelismo 228
3
Arquitectura de Computadoras II
Unidad 1 - MEMORIA
1 - Jerarquía de Memoria
La información con la que opera un procesador se encuentra en una memoria
interna muy reducida conocida como “los registros”. Esta pequeña memoria no puede
albergar toda la información requerida por un programa, por lo que se requiere una
memoria externa adicional. Esta memoria externa es de mucha más capacidad,
aunque también mucho más lenta de acceso.
En este capítulo nos vamos a centrar en esta memoria externa que, como
veremos, se estructura en una jerarquía de distintas tecnologías de memoria,
consiguiendo así una muy buena relación de capacidad, tiempo de acceso y precio.
Nos centraremos, sobre todo, en la memoria más cercana y rápida, la memoria
caché. Luego se verá una breve presentación a los tipos y tecnologías de la memoria
principal y, por último, haremos una pequeña introducción a la memoria virtual.
4
Arquitectura de Computadoras II
ofrece una gran cantidad de memoria, como porque el coste por bit es pequeño. Sin
embargo, para conseguir buen rendimiento y velocidad se necesitan memorias de
rápido acceso, que son de poca capacidad y más caras.
La pirámide del gráfico superior, está construida por diversos tipos de memoria,
de tal manera que a medida que se va de arriba hacia abajo, sucede lo siguiente:
5
Arquitectura de Computadoras II
2. Memoria Caché
Vamos a comenzar por el primer nivel de la memoria externa al procesador, la
memoria caché, situada entre la CPU y la memoria principal.
Veremos cómo una memoria tan pequeña (en comparación con la memoria
principal) puede ser tan útil, y las maneras en que se puede organizar para
aprovecharla de la mejor manera posible.
La caché es una pequeña memoria situada entre el procesador y la memoria
principal, que, aunque muy rápida, solamente dispone de unos cuantos kilobytes de
capacidad.
6
Arquitectura de Computadoras II
7
Arquitectura de Computadoras II
8
Arquitectura de Computadoras II
9
Arquitectura de Computadoras II
10
Arquitectura de Computadoras II
11
Arquitectura de Computadoras II
Las tres funciones de correspondencia que se suelen utilizar son las siguientes:
• Correspondencia Directa
• Correspondencia Asociativa
• Correspondencia Asociativa de Conjuntos
12
Arquitectura de Computadoras II
A continuación vamos a tratar con cierto detalle cada una de estas funciones de
correspondencia.
Para cada una de ellas veremos su estructura general acompañada de un ejemplo,
que en los tres casos supondrá lo siguiente:
Correspondencia directa
13
Arquitectura de Computadoras II
14
Arquitectura de Computadoras II
obtiene la celda dentro del bloque. Los b-l bits de mayor peso de la dirección deben
ponerse en el campo de etiqueta de la línea correspondiente de la caché.
En una referencia posterior, cuando se compruebe si el bloque referenciado
está en la caché, si la entrada correspondiente está ocupada, hay que comprobar si el
bloque de esa entrada es el que corresponde a la dirección que se está referenciando.
Para ello simplemente hay que comprobar que el campo de etiqueta de la dirección es
igual a la etiqueta de la línea que corresponde a ese bloque. Si no es así, habrá que
traer el bloque de memoria y sustituir al que estaba en esa línea. Esto puede
representar un problema.
15
Arquitectura de Computadoras II
16
Arquitectura de Computadoras II
Correspondencia asociativa
17
Arquitectura de Computadoras II
Con este esquema hay flexibilidad para ubicar un bloque en cualquier línea de
la caché, y su espacio se puede aprovechar más eficientemente, pues cuando se trae
un bloque a la caché nunca habrá que reemplazar a ninguno de los que ya estaban
cargados a menos que todas las líneas estén ocupadas. Con esta técnica ya no deben
producirse las repetidas expulsiones mutuas de dos bloques que teníamos con la
correspondencia directa. Los algoritmos de sustitución que veremos más adelante se
diseñarán precisamente para mejorar lo más posible la tasa de aciertos.
La desventaja obvia de la correspondencia asociativa es el incremento
económico que genera la electrónica adicional necesaria.
18
Arquitectura de Computadoras II
Esto quiere decir que en cada línea de la caché, junto con cada bloque de 4
bytes deben almacenarse también los 14 bits de su etiqueta correspondiente.
Ya que esta correspondencia no fuerza ninguna ubicación concreta para cada
bloque de memoria principal, ya no hay colisiones como en la correspondencia directa,
sino que al traer un bloque a la caché, si ésta está totalmente ocupada, simplemente
debe sustituirse alguno de los bloques que ya estaban por el recién traído. Puesto que
no se fija de antemano cuál debe ser el bloque a sustituir, no se corre el peligro de la
correspondencia directa, en la que podía darse el caso de tener que sustituir un bloque
que se estaba referenciando muy a menudo. La política de sustitución se encargará de
elegir el bloque que al ser sustituido genere el menor perjuicio posible a la tasa de
aciertos de la caché.
Como se muestra en el ejemplo, con esta correspondencia se consigue que,
normalmente, los últimos bloques referenciados por la CPU se encuentren en la
caché, sin que uno de ellos haya tenido que expulsar a otro recientemente
referenciado para cargarse en la caché.
19
Arquitectura de Computadoras II
20
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
puede haber tantos bloques como permita el tamaño del conjunto. En nuestro ejemplo
los conjuntos son de 4 bloques, como el Motorola 68040 y el
PowerPC 604, que también utilizan una memoria asociativa con conjuntos de 4
bloques (memoria asociativa de conjuntos de 4 vías). Los Pentium, sin embargo,
disponen de una caché asociativa de conjuntos de 2 vías.
Volviendo a nuestro ejemplo, podemos ver que al primer bloque de memoria
principal (el bloque 0) le corresponde el conjunto 0 de la caché, y al segundo bloque, el
conjunto 1. Como ya sabíamos, nos encontramos con que al bloque 100H también le
corresponde el conjunto 0, pero en esta ocasión, para cargar el bloque 100H no hay
que expulsar al bloque 0 (como sucedía en la correspondencia directa), ya que ahora
en cada conjunto se pueden ubicar hasta 4 de los bloques a los que la función de
correspondencia otorga la misma dirección. Para diferenciar los distintos bloques que
corresponden al mismo conjunto se utiliza la etiqueta de 6 bits que tiene cada bloque.
No puede haber dos bloques con la misma etiqueta que les corresponda el
mismo conjunto.
De esta manera se evita en gran medida el problema de la correspondencia
directa, en la que dos bloques muy usados en un bucle podían estar expulsándose
mutuamente, desaprovechando así la eficacia de la memoria caché.
Política De Sustitución
Cuando se produce una falta de caché y hay que traer el bloque desde
memoria principal, si no hay una línea libre para el bloque, habrá que sustituir alguno
de los que están en la caché por el recién referenciado.
Si se utiliza correspondencia directa, no hay ninguna elección, hay que sustituir
el bloque de la única línea en la que se puede ubicar el bloque referenciado. Si se trata
de correspondencia asociativa de conjuntos, se puede elegir entre cualquiera de los
bloques del conjunto que le corresponde al bloque referenciado. Y si la función de
correspondencia es la completamente asociativa, se puede elegir para sustituir
cualquiera de los bloques que están en la caché. Así, tenemos que en los dos últimos
tipos de correspondencias necesitamos una política de sustitución. Esta cuestión es
extremadamente importante, pues la política utilizada es un factor determinante para la
tasa de aciertos del sistema.
22
Arquitectura de Computadoras II
Hay dos enfoques a la hora de elegir una política de sustitución: el que tiene en
cuenta la estadística de utilización de los bloques (la historia de uso), y el que no lo
tiene en cuenta. Entre los primeros se encuentran las políticas LRU y LFU, y como
representantes del segundo enfoque está la política random y la FIFO.
LRU (Least Recently Used). En general, el objetivo es mantener en la caché
los bloques que tienen más probabilidades de ser accedidos en un futuro próximo,
pero no resulta nada fácil saber esto. No obstante, el principio de localidad nos dice
que en ciertas áreas de memoria, y durante un periodo razonable de tiempo, hay una
alta probabilidad de que los bloques que acaban de ser referenciados recientemente
sean referenciados otra vez en un futuro próximo. Por eso, cuando hay que
seleccionar un bloque víctima, parece razonable elegir el que lleva más tiempo sin ser
referenciado (el menos recientemente referenciado, the least recently used).
Como hemos dicho con esta política se desaloja de la caché el bloque que
tiene más tiempo sin usarse. En su implementación por hardware cada vez que se usa
un bloque se debe almacenar alguna referencia al tiempo (timestamp)y por lo tanto se
sustituye aquel bloque que tenga la referencia más antigua.
Esta política de sustitución falla cuando se está accediendo de forma
secuencial y cíclica a elementos de una matriz que no cabe completamente en la
caché.
Una política parecida es la LFU (Least Frequently Used), (utilizado menos
frecuentemente): Se sustituye aquel bloque que ha experimentado menos referencias.
En su implementación: cada bloque posee un contador, el que se incrementa
cada vez que el bloque ha sido referenciado. Se sustituye aquel que tenga el contador
más bajo. en la cual se sustituye el bloque menos referenciado. Ésta también se
implementa con ayuda de contadores.
Como políticas no basadas en la estadística de uso, tenemos la FIFO (First In,
First Out) que ofrece unos resultados ligeramente inferiores a la LRU. Se hace una
lista con la secuencia de entrada de los bloques a la memoria caché. Se desaloja el
bloque más antiguo.
Para su implementación con ayuda de un buffer circular (una lista circular) con
una manecilla que indica el más antiguo.
Hay que tener en cuenta que no se desaloja el bloque cuyo uso sea el más
antiguo (eso es LRU), se desaloja aquella que su ingreso a la caché es el más antiguo.
Es decir se sustituye aquel bloque que ha estado más tiempo en la caché (aún cuando
se haya usado recientemente)
Los problemas que presenta se deben al hecho de que solamente tiene en
cuenta el tiempo que lleva un bloque en la caché, y no cuáles han sido las últimas
referencias; por esto también puede fallar con algunas matrices.
La política Random, se sustituye un bloque cualquiera según una función
aleatoria.
Estudios realizados mediante simulación han mostrado que la sustitución
aleatoria proporciona un desempeño ligeramente menor a un algoritmo de reemplazo
como los anteriores (basados en el grado de utilización).
Por lo tanto, ofrece una buena tasa de aciertos, no tiene el problema de la LRU
con las matrices, y es fácil y económico de implementar.
23
Arquitectura de Computadoras II
Política De Actualización
24
Arquitectura de Computadoras II
25
Arquitectura de Computadoras II
26
Arquitectura de Computadoras II
27
Arquitectura de Computadoras II
28
Arquitectura de Computadoras II
29
Arquitectura de Computadoras II
En las siguientes páginas vamos a tratar algunas vías más para mejorar el
tiempo medio de acceso a la caché.
El tiempo medio de acceso a una memoria caché se basa en estos tres
factores: tiempo de acceso (en acierto), tasa de fallos y el tiempo de penalización por
fallo. Para los procesadores superescalares de hoy día, debemos añadir un factor
más: el ancho de banda.
Así pues, vamos a organizar las mejoras en las siguientes categorías:
30
Arquitectura de Computadoras II
31
Arquitectura de Computadoras II
En un ordenador con un sistema de memoria con una caché de dos niveles (L1
Y L2), cuando el procesador realiza un acceso a memoria, el dato se acabará
obteniendo de uno de estos tres lugares:
• Caché L1
• Caché L2
• Memoria principal
Así, en el cálculo del tiempo medio de acceso (Tmedio) a memoria, habrá que
sumar los tiempos de acceso a cada una de las tres memorias (L1, L2, MP)
considerando la probabilidad de que el acceso se acabe realizando a cada una de
ellas.
TL1: tiempo de acceso a la caché de nivel 1
PFallo = 1-PAcierto
32
Arquitectura de Computadoras II
Los diseños de los primeros sistemas que incluyeron memoria caché disponían de una
única caché para almacenar tanto operandos como instrucciones.
33
Arquitectura de Computadoras II
34
Arquitectura de Computadoras II
35
Arquitectura de Computadoras II
36
Arquitectura de Computadoras II
Ya hemos visto los beneficios del buffer de escritura y del buffer de víctimas.
Vamos a continuar sacando provecho de él.
Cuando el procesador arranca una escritura en memoria, se comprueba si la
dirección de escritura pertenece al rango de direcciones de alguno de los bloques del
buffer de escritura, y si es así se copia el dato a ese bloque del buffer de escritura. Si,
en cambio, el buffer no contiene el bloque correspondiente al dato a escribir, se utiliza
una entrada libre del buffer para poner en él el bloque completo con el nuevo dato a
escribir.
37
Arquitectura de Computadoras II
Esta mejora para reducir la penalización ante un fallo de caché está basada en
la observación de que, normalmente, el procesador realiza lecturas de un byte o una
palabra, no de un bloque completo. Así, la estrategia de esta optimización es la
impaciencia: cuando el procesador encarga la lectura de una palabra, no se espera a
tener el bloque completo cargado en la caché para entregar la palabra solicitada, en
cuanto se tenga la palabra requerida por el procesador, se entrega y se continua la
ejecución mientras, en paralelo, se carga el bloque completo en la caché.
Para hacer esto hay dos estrategias:
• La palabra crítica, primero. Ante un fallo de caché, se carga primero la palabra
solicitada y se le envía al procesador. El procesador continúa la ejecución mientras se
carga el resto del bloque en la caché. Parecido a esto es la “carga directa”, en la que
la palabra solicitada se lleva al procesador en paralelo con la carga del bloque
completo en la caché.
• Rearranque rápido. En este enfoque, las palabras del bloque se van leyendo de
memoria en orden normal (secuencial), pero tan pronto como llega la palabra
solicitada por el procesador, se le envía para que prosiga la ejecución mientras se
carga el resto del bloque en la caché.
38
Arquitectura de Computadoras II
Las técnicas utilizadas hasta ahora para mejorar las prestaciones de la caché
han requerido cambios en el hardware; ahora lo haremos modificando el software, esto
es, con optimizaciones en el compilador, para que organice mejor la disposición del
código y los datos, de tal manera que se minimicen las faltas de caché.
Veamos tres ejemplos de cómo se puede reorganizar el código sin afectar a la
semántica del programa.
• Se puede hacer que cada rutina del programa se ubique al comienzo de un
bloque, con lo que, si el código es secuencial, disminuye la posibilidad de un fallo en
la caché de código.
• Otra mejora consiste en que si el compilador sabe qué rama de una bifurcación va a
ser la más tomada, puede cambiar el sentido de la bifurcación (y sus respectivos
bloques de código) de tal manera que el bloque de la rama más tomada esté ubicado
en secuencia, para no tener que saltar a otro punto de la memoria, lo que originaría
seguramente un fallo de caché.
• El cálculo con matrices es la causa de una gran parte de los fallos de caché. Los
datos de una matriz están organizados por filas y columnas, y para operar con todos
sus elementos, se puede recorrer por filas (primero todos los elementos de una fila,
luego los de la siguiente…) o por columnas (primero todos los elementos de una
columna, luego los de la siguiente…). Pues bien, si la matriz no cabe en la caché y
ocupa varios bloques y suponemos que, por ejemplo, los datos están organizados por
filas, es preferible recorrer la matriz por filas que por columnas, pues de hacerlo
por columnas, cada acceso secuencial en el tiempo se haría a elementos muy
separados en el espacio, con la consecuente mayor probabilidad de fallo.
39
Arquitectura de Computadoras II
40
Arquitectura de Computadoras II
Los bucles son los fragmentos de código que más se prestan a obtener
beneficios de las precargas.
Arriba a la izquierda tenemos un fragmento de código en el que se realiza un
cierto cálculo con los elementos de una matriz. El compilador, al analizar el código
calculará los puntos en los que debe insertar instrucciones PREFETCH para forzar la
pre-carga de datos que utilizará en un futuro próximo.
El tiempo necesario para la pre-carga debe calcularse bien pues, de lo
contrario, un bloque cargado con demasiada antelación, podría resultar expulsado
antes de acceder a él, si se produce una colisión con otro bloque que sea referenciado
por el procesador. Si, por el contrario, el bloque no se ha cargado todavía cuando el
procesador requiere el acceso, se produciría un fallo de caché; justo lo que se quiere
evitar.
El cálculo del punto del programa en el que deben insertarse las instrucciones
PREFETCH es muy complicado pues intervienen diversos factores. Por esto, el
ejemplo de arriba es solamente una muestra indicativa de cómo y dónde se podrían
insertar estas instrucciones en un fragmento de un programa.
41
Arquitectura de Computadoras II
3. Memoria Principal
42
Arquitectura de Computadoras II
43
Arquitectura de Computadoras II
Los ordenadores utilizan dos tipos de memoria del sistema: la memoria caché y
la memoria principal.
La memoria caché está formada por memoria estática (SRAM) muy rápida que
puede estar integrada en el mismo chip que el procesador (L1) o fuera del él (L2). La
memoria principal está compuesta por módulos de memoria dinámica (DRAM), más
lenta y barata.
Así pues, hay dos grandes ramas en la tecnología de la memoria:
• RAM dinámica (DRAM), utilizada para la memoria principal
• RAM estática (SRAM), empleada en la construcción de la memoria caché.
Los circuitos de la RAM dinámica son muy simples, (normalmente, un bit está
constituido por un condensador y un transistor), y requieren que su contenido se tenga
que refrescar después de cada lectura para no perderlo. Esto significa que entre un
acceso y otro, se debe dedicar un tiempo extra al refresco del contenido, lo que hace
que el tiempo de ciclo sea superior al tiempo de acceso.
En cambio, la SRAM utiliza 6 transistores por bit, pero evita que la información
pierda en cada lectura.
El interés principal en el diseño de la SRAM está en la velocidad y la
capacidad, mientras que en el caso de la DRAM, lo que preocupa es el coste por bit y
la capacidad.
En memorias diseñadas con tecnologías comparables en el tiempo, la
capacidad de la RAM dinámica es 4 a 8 veces mayor que la de la estática. El tiempo
de ciclo de la SRAM es 8 a 16 veces más rápido que la DRAM, pero también es 8 a 16
veces más cara.
44
Arquitectura de Computadoras II
Cada chip DRAM está compuesto de múltiples celdas o bits organizados como
una matriz de filas y columnas. Así, cada fila (llamada página) contiene varias celdas.
Para acceder a una determinada celda, el controlador de memoria debe enviar
la dirección, esto es, la fila y la columna correspondiente. El controlador de memoria
se comunica con ésta a través del Bus de Memoria, el cual está formado por dos sub-
buses:
• Bus de direcciones/comandos
• Bus de datos
El bus de datos es un conjunto de líneas que llevan los datos a/desde la
memoria. Cada línea de datos transporta un bit en cada acceso. El ancho de banda
del bus de datos depende del número de líneas y de la frecuencia. El ancho del bus de
datos suele ser de 64 bits (líneas), lo que significa que en cada acceso se transportan
64 bits. A cada unidad de datos de 64 bits se le llama “palabra”.
45
Arquitectura de Computadoras II
Las prestaciones de las memorias suelen considerar dos aspectos: el ancho de banda
y la latencia.
• El ancho de banda es el número de bits que se transmiten por unidad de tiempo.
Esto depende de dos factores: de la velocidad de transmisión de un bit y del
número de hilos del bus de datos, es decir, del número de bits que se transmiten en
paralelo.
• La latencia está relacionada con los tiempos que transcurren entre ciertos eventos.
• El tiempo de acceso es el tiempo dedicado exclusivamente a la transmisión de los
bits, esto es, el tiempo que transcurre entre la petición del dato y la llegada del dato.
(La señal de arranque de la transmisión se establece después de establecer las
direcciones RAS y CAS +RW).
46
Arquitectura de Computadoras II
47
Arquitectura de Computadoras II
48
Arquitectura de Computadoras II
49
Arquitectura de Computadoras II
• DDR (o DDR-1). Suele utilizar un reloj del bus de memoria a 100, 133 o 266
MHz, consiguiendo un ancho de banda de hasta 3.200 MB/s. Suele operar
a un voltaje de 2,5 voltios, mientras que la SDRAM utiliza 3,3 voltios.
• DDR-2. Disminuye el consumo bajando de 2,5 a 1,8 voltios, a la vez que
permite una frecuencia de reloj del bus del sistema de 266 a 400 MHz. Se
consigue un ancho de banda de 6,4 GB/s.
• DDR-3. Baja el voltaje a 1,5 voltios y opera a una frecuencia de 400 a 800
MHz, consiguiendo un ancho de banda entre 6,4 y los 12,8 /17 GB/s
DDR 3 Vs DDR 4
50
Arquitectura de Computadoras II
51
Arquitectura de Computadoras II
A los SIMM les sucedieron los actuales DIMM, que han atravesado por distintos
formatos. Estos módulos cuentan con dos filas de contactos, pues son diferentes los
de las dos caras. No obstante, pueden tener chips en una o en las dos caras, y suelen
contener de 4 a 16 DRAM ofreciendo un bus de datos de 64 bits (más los hilos de
corrección de errores ECC).
Las primeras memorias SDRAM ya se distribuían en DIMMs de 168 pines,
mientras que las DDR contaban con 172, 184 o 200 pines. Las DDR2 y las DDR3
cuentan con diversas configuraciones, pero en las últimas versiones de ambas, tienen
240 pines.
Bibliografía;
D. A. PATTERSON & J. L. HENNESSY. Morgan - "Computer Organization and Design”,
4ª Edition. Kaufmann Publishers, 2007.
“Computer Architecture. A quantitative Approach”, 4ª Edition. J. L. HENNESSY & D. A.
PATTERSON
Francisco Aylagas Romero, Elvira Martínez de Icaya Gómez, (Arquitectura de
Computadores - Ingeniería de Computadores) Universidad Politécnica de Madrid
(UPM) y Escuela Universitaria de Informática (EUI) – http://www.dia.eui.upm.es/cgi-
bin/asigfram.pl?cual=ICarq_com&nombre=Arquitectura-de-Computadores - 2013-2014.
52
Arquitectura de Computadoras II
1- Conceptos Básicos
En este capítulo vamos a ver cómo mejorar las prestaciones de la CPU
mediante los procesadores segmentados (o en pipeline), los cuales incorporan una
técnica para acelerar el ritmo de ejecución de las instrucciones.
En primer lugar empezaremos por comentar algunos aspectos básicos para
introducir los conceptos en los que se apoya esta técnica.
A continuación nos centraremos en nuestro procesador de referencia, el
MIPS64, viendo la configuración de las etapas que componen su cauce.
Como veremos, hay diversos factores que pueden impedir un aprovechamiento
óptimo del concepto de pipeline en la CPU. Trataremos estos factores y las técnicas
para evitarlos en la medida de lo posible.
Por último abordaremos una mejora más del pipeline mediante el concepto de
operaciones multiciclo que reducirán las esperas o paradas generadas por las
instrucciones pesadas, como las multiplicaciones, divisiones o las operaciones en
coma flotante.
53
Arquitectura de Computadoras II
54
Arquitectura de Computadoras II
55
Arquitectura de Computadoras II
56
Arquitectura de Computadoras II
Según lo que acabamos de ver, parece que interesa dividir las fases de
ejecución de las instrucciones en más etapas, para así obtener un mayor rendimiento
en la ejecución.
La ejecución de una instrucción podría descomponerse en las siguientes 5
etapas:
1. F: Alimentación de la instrucción (fetch)
2. D: Decodificación de la instrucción / Lectura de registros
3. E: Ejecución (en la ALU) / Cálculo de la dirección efectiva
4. M: Acceso a memoria
5. W: Escritura del resultado en registros de la CPU
Si ahora la ejecución de una instrucción está descompuesta en 5 etapas, cada
etapa puede durar aproximadamente 1/5 de la duración total de la ejecución de la
instrucción. Si suponemos que la duración de un ciclo de reloj es igual a la duración de
cada una de estas pequeñas etapas, podemos decir, en principio, que con la técnica
de la segmentación (o pipelining) se consigue que a cada ciclo de reloj finalice una
instrucción, o lo que es lo mismo, una velocidad de instrucción por ciclo.
Debemos tener en cuenta que:
Cada etapa dispone de los recursos hardware necesarios para realizar su
cometido.
Las ejecuciones de las instrucciones se solapan.
Todas las etapas tienen la misma duración (ciclo de reloj).
La duración del ciclo de reloj lo fija la etapa más lenta.
57
Arquitectura de Computadoras II
Por lo que hemos dicho hasta ahora, esta técnica puede reducir el número de
ciclos/instrucción en un factor igual a la profundidad del pipeline (número de etapas).
Según esto, parece que cuanto mayor sea el número de etapas de un pipeline, mayor
es la velocidad de ejecución.
Sin embargo, los diseñadores del S/360 de IBM (años 60) ya se dieron cuenta
de que la cantidad de lógica de control necesaria para gestionar y optimizar los buffers
intermedios y las dependencias entre las etapas del pipeline crece enormemente con
el número de etapas, hasta el punto de que esta lógica de control entre etapas puede
llegar a ser más compleja y costosa (en tiempo) que la lógica propia de cada etapa.
Dada la conveniencia de un alto número de etapas, a medida que se consiguen
avances en la tecnología, los procesadores cada vez disfrutan de un mayor número de
etapas, consiguiendo así, la correspondiente mejora en sus prestaciones.
58
Arquitectura de Computadoras II
59
Arquitectura de Computadoras II
60
Arquitectura de Computadoras II
61
Arquitectura de Computadoras II
62
Arquitectura de Computadoras II
Una vez vistos los conceptos básicos del pipeline, vamos a concretarlo en una
versión simplificada de la arquitectura MIPS64.
En un principio vamos a considerar una versión básica de 5 etapas, en la que
la Unidad Aritmético-Lógica solamente va a operar con datos enteros.
El tiempo de ejecución de cada etapa va a ser un ciclo.
En esta versión básica (solo para un grupo reducido de instrucciones) vamos a
disponer de una estructura en la que veremos que las instrucciones de salto generan
ciertos retardos. Más adelante mejoraremos la estructura para conseguir mejorar los
problemas de los retardos.
Ahora iremos mostrando en las siguientes páginas la descripción de cada una
de las 5 etapas de este pipeline simplificado de MIPS64.
63
Arquitectura de Computadoras II
64
Arquitectura de Computadoras II
65
Arquitectura de Computadoras II
66
Arquitectura de Computadoras II
67
Arquitectura de Computadoras II
68
Arquitectura de Computadoras II
Una vez elegido el número óptimo de etapas, para que el factor de aceleración
sea igual al número de etapas se requiere que todas las etapas del pipeline siempre
estén llenas de instrucciones útiles, y que nada retrase el avance de las instrucciones
a través del pipeline.
Por desgracia, no es fácil mantener siempre ocupadas todas las etapas del
pipeline. Hay tres causas que lo impiden:
• Motivos estructurales.
• Dependencias de operandos.
• Instrucciones de bifurcación.
En las siguientes transparencias las comentaremos con cierto detalle.
69
Arquitectura de Computadoras II
70
Arquitectura de Computadoras II
71
Arquitectura de Computadoras II
Si desde dos etapas se accede a un mismo recurso, una de las etapas tendrá
que detener su ejecución y esperar a que quede libre el recurso necesario.
Por ejemplo, en las etapas de Fectch y Ejecución puede ser necesario un
acceso simultáneo a la ALU para realizar una operación aritmética, como el
incremento que debe hacer al PC para actualizarlo (en F) o la suma que se requiere
para realizar el cálculo de la dirección efectiva de un operando (en E). Esto se
soluciona fácilmente mediante dos sumadores distintos.
Por otra parte, también se puede requerir un acceso simultáneo a memoria
desde las etapas F y M; para extraer la siguiente instrucción a ejecutar y para leer o
escribir un operando o resultado en memoria.
72
Arquitectura de Computadoras II
Los distintos tipos de dependencias pueden dan lugar a otros tantos tipos de
“riesgos de datos” (RAW, WAR y WAW).
Realmente, la única dependencia verdadera de datos es la que da lugar a
riesgo de tipo RAW, que viene dada por la propia lógica del programa; los otros dos
tipos son “dependencias de nombre” y dependen de las características del cauce.
Más adelante trataremos las dependencias de nombre, pero ahora vamos a
ocuparnos de la verdadera dependencia de datos (RAW).
La situación es la siguiente: Una instrucción Ij actualiza el valor de una variable,
pero una instrucción posterior, Ik, realiza una lectura de esa variable antes de que Ij
haya terminado la operación escribiendo la variable compartida.
Veamos, en las siguientes páginas ejemplos concretos de esta dependencia de
datos y varias soluciones propuestas.
73
Arquitectura de Computadoras II
74
Arquitectura de Computadoras II
75
Arquitectura de Computadoras II
denomina interlock. Resolver las dependencias significa hacer algo para retrasar la
ejecución de I2 o para acelerar, en la medida de lo posible, la entrega a I2 del
resultado que produce I1.
Veamos dos posibilidades de resolución (no excluyentes) para cuando se
detecta una dependencia de datos entre dos etapas del pipeline.
Detener el pipeline. La aproximación más sencilla para evitar los problemas
de dependencias de datos con ayuda del hardware es detener la actividad en
las etapas necesarias del pipeline hasta que desaparezca la dependencia, es
decir, hasta que se pueda ejecutar correctamente la instrucción dependiente.
En el ejemplo de la figura, esto significa detener las instrucciones que siguen a
la instrucción daddi desde el ciclo 4 hasta que el registro R1 pueda leerse
debidamente actualizado en segundo subciclo de t6.
Con esta estrategia, primero se detecta la dependencia y después se detiene el
pipeline a partir de la instrucción dependiente hasta que desaparece la
dependencia.
Obsérvese que la detención de n ciclos del cauce tiene el mismo efecto que la
inserción de n instrucciones NOP.
76
Arquitectura de Computadoras II
77
Arquitectura de Computadoras II
78
Arquitectura de Computadoras II
79
Arquitectura de Computadoras II
80
Arquitectura de Computadoras II
lugar es: I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12,... Mientras que cuando sí se
produce la bifurcación, la secuencia es: I1, I2, I3, I4, I5, I6, I11, I12, ...
Si a este mismo procesador (con un hueco de retardo en las bifurcaciones) se
le ponen bifurcaciones retardadas, la secuencia de instrucciones ejecutadas cuando
se produce la bifurcación es: I1, I2, I3, I4, I5, I6, I7, I11, I12,... Es decir I7, se ejecuta
siempre, haya o no bifurcación.
Esto es así porque el efecto de la bifurcación se retarda un ciclo de reloj, es
decir, después de alimentar una instrucción de salto, se siguen extrayendo y
ejecutando las instrucciones siguientes, según su orden en la memoria, durante un
ciclo más de reloj. Después, se establece en el contador de programa la dirección
indicada en la instrucción de salto, con lo que la 2ª instrucción después de la de salto,
será ya la correspondiente a la de la dirección indicada en dicha instrucción de salto.
81
Arquitectura de Computadoras II
I1, I2, I3, I5, I6, I4, I7, I8, I9, I10, I11, I12, ...
82
Arquitectura de Computadoras II
83
Arquitectura de Computadoras II
84
Arquitectura de Computadoras II
Como hemos visto, la predicción ante un salto puede ser “saltar” o “no saltar”,
para decidir por dónde continúa extrayendo instrucciones.
Para la arquitectura MIPS, con una porción de código concreta y con los
mismos datos, vamos a ver lo que sucede cuando la predicción es “no saltar” y,
posteriormente, cuando es “saltar”.
Predicción NO SALTAR: Después de alimentar la instrucción de salto, se continúa
con la Decodificación, pero hasta el final de esta etapa no se sabrá si habrá que saltar
o no. Como la predicción es “no saltar”, en la etapa F se alimenta la siguiente
instrucción en memoria. Al final de la etapa D se ve que se ha cometido un fallo en la
predicción, por lo que habrá que eliminar la instrucción daddi del cauce y empezar a
extraer y ejecutar la instrucción de destino del salto. Se ha perdido un ciclo de tiempo.
Predicción SALTAR: Igual que antes, después de alimentar la instrucción de salto, se
continúa con la Decodificación. Como la predicción es “saltar”, en este ciclo se querría
extraer la siguiente instrucción de la dirección del salto, pero como hasta el final de la
Decodificación tampoco se conoce la dirección del salto, en este ciclo no se puede
extraer ninguna instrucción, y hay que esperar al final de la Decodificación para poder
alimentar la instrucción de destino del salto.
Como vemos, en MIPS, ante una condición que establezca que se debe saltar,
se pierde un ciclo tanto con una predicción de “saltar” como de “no saltar”. Por el
contrario, si la condición se evaluara como falsa (no saltar), con la predicción de NO
SALTAR, sí se podría seguir alimentando instrucciones de la siguiente dirección de
memoria. Por lo que hemos visto, en MIPS 64 no tiene ninguna utilidad predecir
“Tomar el salto”, por lo que su predicción es NO SALTAR.
85
Arquitectura de Computadoras II
Bibliografía;
86
Arquitectura de Computadoras II
Aunque las computadoras cada vez son más rápidas, lo que se les exige está
creciendo por lo menos al mismo ritmo. Los astrónomos quieren simular toda la
historia del Universo, desde el big bang hasta que acabe la función. A los ingenieros
farmacéuticos les encantaría poder diseñar medicamentos a la medida de
enfermedades específicas en sus computadoras en lugar de tener que sacrificar
legiones de ratas. Los diseñadores de aviones podrían crear productos con mejor
rendimiento de combustible si las computadoras pudieran efectuar todo el trabajo, sin
necesidad de construir prototipos para túneles de viento. En pocas palabras, por más
potencia de cómputo que tengamos al alcance, para muchos usuarios, sobre todo en
las ciencias, la ingeniería y la industria, nunca es suficiente.
Aunque la frecuencia de reloj es cada vez más alta, la velocidad de los circuitos
no se puede incrementar indefinidamente. La velocidad de la luz ya representa un
problema importante para los diseñadores de computadoras del extremo superior, y
las posibilidades de lograr que los electrones y fotones se muevan a mayor velocidad
no son muy halagüeñas. Los problemas de disipación de calor están convirtiendo a las
supercomputadoras en acondicionadores de aire de vanguardia. Por último, aunque
los transistores son cada vez más pequeños, llegará el momento en que cada
transistor tendrá tan pocos átomos que los efectos de la mecánica cuántica (por
ejemplo, el principio de incertidumbre de Heisenberg) podrían convertirse en un
problema importante.
Por ello, para poder atacar problemas cada vez más grandes, los arquitectos
de computadoras están recurriendo a las computadoras paralelas. Aunque tal vez
nunca sea posible construir una computadora con una sola CPU y un tiempo de ciclo
de 0.001 ns, bien podría ser factible construir una con 1000 CPU, cada una de ellas
con un tiempo de ciclo de 1 ns. Si bien este último diseño usa CPU más lentas que el
primero, en teoría su capacidad de cómputo total es la misma. Es en esto en lo que
están fincadas las esperanzas.
Las FLOPS (operaciones de coma flotante por segundo) son una medida del rendimiento de una computadora, especialmente e
Una computadora de escritorio, que usa por ejemplo un procesador Pentium 4 o Athlon 64, típicamente opera a más de 3 GHz,
87
Arquitectura de Computadoras II
88
Arquitectura de Computadoras II
89
Arquitectura de Computadoras II
90
Arquitectura de Computadoras II
Multiprocesadores
En el primer diseño, todas las CPU comparten una misma memoria física,
como se ilustra en la figura 8-1 (a). Un sistema basado en memoria compartida como
éste se llama multiprocesador o a veces simplemente sistema con memoria
compartida.
El modelo del multiprocesador se extiende al software. Todos los procesos que
están ejecutándose en un multiprocesador pueden compartir un solo espacio de
direcciones virtual mapeado en la memoria común. Cualquier proceso puede leer o
escribir una palabra de memoria con sólo ejecutar una instrucción LOAD o STORE. No
se necesita nada más. Dos procesos pueden comunicarse con sólo hacer que uno de
ellos escriba datos en la memoria y que el otro los lea después.
La capacidad de dos (o más) procesos para comunicarse con sólo leer y
escribir en la memoria es la razón por la que los multiprocesadores son tan populares.
Se trata de un modelo fácil de entender para los programadores que se puede aplicar
a una amplia gama de problemas. Consideremos, por ejemplo, un programa que
examina una imagen de mapa de bits y enumera todos los objetos que contiene. Una
copia de la imagen se guarda en la memoria, como se muestra en la figura 8-l(b).
Cada una de las 16 CPU ejecuta un solo proceso, al cual se ha asignado una de las
16 secciones para que la analice. Sin embargo, cada proceso tiene acceso a toda la
imagen, lo cual es indispensable porque algunos objetos ocupan varias secciones. Si
un proceso descubre que uno de sus objetos rebasa la frontera de su sección,
simplemente sigue al objeto a la siguiente sección leyendo las palabras de esa
sección. En este ejemplo, varios procesos descubrirán el mismo objeto, por lo que se
91
Arquitectura de Computadoras II
requiere cierta coordinación al final para determinar cuántas, casas, árboles y aviones
hay.
Multicomputadoras
92
Arquitectura de Computadoras II
En particular, la CPU 0 tiene que descubrir (de alguna manera) cuál CPU tiene
los datos que necesita y enviar a esa CPU un mensaje en el que solicita una copia de
los datos. Por lo regular, lo que haría entonces la CPU 0 sería bloquearse (es decir,
esperar) hasta recibir una respuesta a su solicitud. Cuando el mensaje llega a la CPU
1, el software de esa CPU debe analizarlo y devolver los datos solicitados. Cuando el
mensaje de respuesta llega a la CPU 0, el software se desbloquea y puede continuar
su ejecución.
En una multicomputadora, la comunicación entre procesos a menudo utiliza
primitivas en software como send (enviar) y receive (recibir). Esto hace que el software
tenga una estructura diferente, mucho más complicada, que, en un multiprocesador, y
también implica que la división correcta de los datos y su colocación en los lugares
óptimos es una cuestión importante en una multicomputadora. Esto es menos
importante en un multiprocesador porque la colocación no afecta la corrección ni la
programabilidad, aunque sí podría afectar el desempeño. En pocas palabras,
programar una multicomputadora es mucho más difícil que programar un
multiprocesador.
En estas condiciones, ¿para qué construir multicomputadoras, si los
multiprocesadores son más fáciles de programar? La respuesta es sencilla: las
93
Arquitectura de Computadoras II
94
Arquitectura de Computadoras II
95
Arquitectura de Computadoras II
middleware. Por lo general el middleware del lado cliente está implementado por el
Sistema Operativo, el cual posee las bibliotecas que ejecutan todas las
funcionalidades para la comunicación a través de la red..
Middleware trabaja con algunos lenguajes del tipo de Orca (Bal y otros 1990) y
middleware como Linda (Carriero y Gelernter 1989) junto con sus derivados
JavaSpaces y TSpaces (Wyckoff y otros 1998) proporcionan DSM sin necesidad de
soporte hardware o de paginación, de una forma independiente de la plataforma.
96
Arquitectura de Computadoras II
97
Arquitectura de Computadoras II
Topología
98
Arquitectura de Computadoras II
muy probable que el conmutador central sea un importante cuello de botella. Además,
desde el punto de vista de la tolerancia de fallos, este diseño es deficiente porque un
solo fallo en el conmutador central destruye por completo el sistema.
99
Arquitectura de Computadoras II
10
Arquitectura de Computadoras II
10
Arquitectura de Computadoras II
Conmutación
10
Arquitectura de Computadoras II
10
Arquitectura de Computadoras II
Algoritmos de enrutamiento
En cualquier red que no sea cero-dimensional hay que tomar decisiones acerca
de la ruta que los paquetes han de seguir del origen al destino. En muchos casos
existen varias rutas. La regla que determina por cuál sucesión de nodos debe viajar un
paquete para ir del origen al destino se denomina algoritmo de enrutamiento.
Se requieren buenos algoritmos de enrutamiento porque es común que haya
varios caminos disponibles. Un buen algoritmo de enrutamiento puede distribuir la
carga entre varios enlaces a fin de aprovechar al máximo el ancho de banda
10
Arquitectura de Computadoras II
10
Arquitectura de Computadoras II
largo del eje x hasta la coordenada correcta, y luego a lo largo del eje y hasta la
coordenada correcta, y así sucesivamente si hay más dimensiones. Por ejemplo, para
ir de (3, 7,5) a (6, 9, 8) el paquete primero iría dex = 3ax = 6 pasando por (4, 7, 5), (5,
7 5) y (6, 7, 5). Luego viajaría por el eje y viajando a (6, 8, 5) y (6, 9, 5). Por último, el
paquete viajaría por el eje z a (6, 9, 6), (6, 9, 7) y (6, 9, 8). Este algoritmo evita los
ciclos que causan un bloqueo mutuo.
3.1.3 Desempeño
Lo que se busca al construir una computadora paralela es que opere más
rápidamente que una máquina uniprocesador. Si no logra este sencillo objetivo, no
tiene razón de existir. Además, la meta debe alcanzarse con eficacia de costos. Una
máquina que es dos veces más rápida que un uniprocesador pero cuesta 50 veces
más probablemente no tendrá muchas ventas. En esta sección examinaremos algunos
de los aspectos de desempeño asociados a las arquitecturas de computadoras
paralelas.
Métricas de hardware
10
Arquitectura de Computadoras II
Métricas de software
10
Arquitectura de Computadoras II
10
Arquitectura de Computadoras II
La ley de Amdahl no es la única razón por la que es casi imposible lograr una
aceleración perfecta. Las latencias de comunicación distintas de cero, los anchos de
banda de comunicación finitos y las ineficiencias algorítmicas también son factores.
Además, aunque se contara con 1000 CPU, no todos los programas pueden escribirse
de modo que aprovechen tantas CPU, y el gasto extra de ponerlas todas en marcha
puede ser considerable. Por añadidura, es común que el algoritmo mejor conocido no
se pueda paralelizar bien, y sea necesario usar un algoritmo subóptimo en el caso
paralelo. A pesar de todo esto, para muchas aplicaciones es altamente deseable lograr
que el programa funcione con una rapidez n veces mayor, aunque se necesiten 2n
CPU para ello. Después de todo, las CPU no son tan caras, y muchas compañías se
conforman con una eficiencia muy por debajo del 100% en otras facetas de su
operación.
10
Arquitectura de Computadoras II
11
Arquitectura de Computadoras II
3.1.4 Software
11
Arquitectura de Computadoras II
A. Modelos de control.
B. Granularidad del paralelismo.
C. Paradigmas computacionales.
D. Métodos de comunicación.
E. Primitivas de sincronización.
Cada una de estas cuestiones se estudiará en su oportunidad.
A. Modelos de control
Tal vez la decisión fundamental que el software debe tomar es si habrá un solo
enlace de control o varios. En el primer modelo hay un programa y un contador de
programa, pero varios conjuntos de datos. Cuando se emite una instrucción, se
ejecuta con todos los conjuntos de datos simultáneamente, con diferentes elementos
de procesamiento.
Por ejemplo, imagine un programa meteorológico que cada hora recibe
mediciones de temperatura de miles de sensores remotos que tienen que promediar
para cada sensor. Cuando el programa emite la instrucción
11
Arquitectura de Computadoras II
cada procesador la ejecuta utilizando sus propios datos y su propio R1. Después,
cuando el programa emite la instrucción
una vez más, cada procesador lo hace utilizando sus propios datos. Al final del cálculo,
cada procesador habrá calculado la temperatura media para un sensor distinto.
Las implicaciones de este modelo de programación para el hardware son
enormes. De hecho, lo que dice es que cada elemento de procesamiento es
básicamente una ALU y una memoria, sin lógica propia para decodificar instrucciones.
En vez de ello, una sola unidad centralizada trae instrucciones y le dice a las ALU lo
que tienen que hacer a continuación.
En el modelo alternativo hay varios enlaces de control, cada uno con su propio
contador de programa, registros y variables locales. Cada enlace de control ejecuta su
propio programa con sus propios datos, posiblemente comunicándose o
sincronizándose con otros enlaces de control cada cierto tiempo. Existen muchas
variaciones de esta idea básica, y juntas constituyen el modelo dominante del
procesamiento en paralelo. Por esta razón, ahora nos concentraremos
primordialmente en la computación en paralelo con múltiples enlaces de control.
11
Arquitectura de Computadoras II
C. Paradigmas computacionales
Casi todos los programas paralelos, sobre todo los que implican grandes
números de enlaces o procesos independientes, usan algún paradigma subyacente
para estructurar su trabajo. Existen muchos de esos paradigmas. En esta sección sólo
mencionaremos algunos de los más utilizados.
1. Una generalización de la idea de tener un programa paralelo que consta de un
enlace de control y múltiples unidades de ejecución es el paradigma de
programa único, múltiples datos (SPMD, Single Program Múltiple Data). La idea
aquí es que, aunque el sistema consiste en varios procesos independientes, todos
ejecutan el mismo programa, pero con diferentes conjuntos de datos. Sólo que
ahora, a diferencia del ejemplo de las temperaturas, no están en coordinación,
sincronizados hasta la última instrucción. En vez de ello, cada uno realiza el
mismo cálculo, pero a su propio ritmo.
11
Arquitectura de Computadoras II
D. Métodos de comunicación
Cuando un programa se divide en fragmentos (digamos, procesos) que se
ejecutan en paralelo, los fragmentos (procesos) a menudo necesitan comunicarse
entre sí. Esta comunicación puede efectuarse de una de dos maneras: variables
compartidas o transferencia explícita de mensajes. En el primer método, todos los
procesos tienen acceso a la memoria lógica común y pueden comunicarse leyéndola y
escribiendo en ella. Por ejemplo, un proceso puede ajustar una variable y otro proceso
puede leerla.
En un multiprocesador, las variables pueden compartirse entre múltiples
procesos mapeando la misma página al espacio de direcciones de cada proceso.
Entonces se pueden leer y escribir variables compartidas empleando instrucciones de
máquina LOAD y STORE. En una multicomputadora, aunque no tiene memoria física
compartida, también es posible compartir variables lógicamente, aunque es un poco
más complicado. Como vimos antes, Linda maneja el concepto de espacio de tuplas
compartido, aun en una multicomputadora, y Orca maneja el concepto de objetos
compartidos cruzando fronteras de máquinas. Otra posibilidad es compartir un solo
espacio de direcciones en una multicomputadora y paginar a través de la red de
interconexión. En síntesis, es posible permitir que los procesos se comuniquen a
través de variables compartidas tanto en multiprocesadores como en
multicomputadoras.
La alternativa a la comunicación a través de memoria compartida es la
comunicación por transferencia explícita de mensajes. En este modelo, los procesos
usan primitivas como send y receive para comunicarse. Un proceso emite un send,
nombrando a otro proceso como destino. Tan pronto como el segundo emite un
receive, el mensaje se copia en el espacio de direcciones del receptor.
La transferencia de mensajes tiene muchas variaciones, pero todas se reducen
a tener dos primitivas send y receive que sirven para transmitir mensajes. Éstas
11
Arquitectura de Computadoras II
E. Primitivas de sincronización
Los procesos paralelos no sólo necesitan comunicarse; con frecuencia también
necesitan sincronizar sus acciones. Un ejemplo de sincronización es cuando los
procesos comparten variables lógicamente y tienen que asegurarse de que mientras
un proceso está escribiendo en una estructura de datos compartida ningún otro
proceso esté tratando de leerla. En otras palabras, se requiere alguna forma de
exclusión mutua para evitar que varios procesos usen los mismos datos al mismo
tiempo.
Existen diversas primitivas de software que pueden servir para asegurar la
exclusión mutua. Éstas incluyen semáforos, candados, mutexes y secciones críticas.
La característica común de todas estas primitivas es que permiten a un proceso
solicitar el uso exclusivo de algún recurso (variable compartida, dispositivo de E/S,
etc.). Si se otorga el permiso, el proceso puede usar el recurso. Si un segundo proceso
pide permiso mientras el primero todavía está usando el recurso, se le negará el
permiso o se bloqueará hasta que el primer proceso haya liberado el recurso.
Un segundo tipo de primitiva de sincronización que se necesita en muchos
programas paralelos es alguna forma de permitir que todos los procesos se bloqueen
hasta que finalice cierta fase del trabajo, como se muestra en la figura 8-11(b). Una
primitiva común aquí es la barrera. Cuando un proceso llega a una barrera, se bloquea
hasta que todos los procesos llegan a ella. Cuando llega el último proceso, todos los
procesos se liberan simultáneamente y pueden continuar.
11
Arquitectura de Computadoras II
Aunque podríamos hablar mucho más acerca del software para computadoras
paralelas, las limitaciones de espacio nos obligan a regresar al tema principal de este
capítulo, la arquitectura de las computadoras paralelas. Se han propuesto y construido
muchos tipos de computadoras paralelas, por lo que es natural preguntarse si hay
alguna forma de clasificarlas dentro de alguna taxonomía. Muchos investigadores lo
han intentado, con regular éxito (Flynn, 1972; Gajski y Pier, 1985; Treleaven, 1985).
Lamentablemente, todavía no ha surgido el Carlos Linneof de la computación en
paralelo. El único esquema que se usa mucho es el de Flynn, pero hasta el de él es,
en el mejor de los casos, una aproximación muy burda (figura 8-13).
11
Arquitectura de Computadoras II
11
Arquitectura de Computadoras II
4. Por último, tenemos las MIMD, que no son más que múltiples CPU
independientes que operan como parte de un sistema mayor. Casi todos los
procesadores paralelos pertenecen a esta categoría. Tanto los
multiprocesadores como las multicomputadoras son máquinas MIMD.
11
Arquitectura de Computadoras II
12
Arquitectura de Computadoras II
12
Arquitectura de Computadoras II
Otras clasificaciones
12
Arquitectura de Computadoras II
12
Arquitectura de Computadoras II
12
Arquitectura de Computadoras II
convertir el escalar en un vector, cuyos elementos son todos iguales al escalar, y luego
realizar la operación con dos vectores.
Todas las operaciones comunes con vectores pueden construirse utilizando
estas formas. Por ejemplo, el producto interior (producto punto) de dos vectores
consiste en multiplicar primero los elementos correspondientes (f ) y obtener después
la sumatoria del resultado (/).
12
Arquitectura de Computadoras II
número que se resta) a 0.9212 x 1012 o bien convertir el minuendo (el número
del cual se resta) a 10.82 x 10". En general, ambas conversiones implican riesgos.
Elevar un exponente podría causar un subdesbordamiento de la mantisa, y bajar un
exponente podría causar un desbordamiento de la mantisa. El subdesbordamiento es
el menos grave de los dos, porque el número se puede aproximar con 0, así que
seguiremos la primera ruta. Después de ajustar ambos exponentes a 12, tenemos los
valores que se muestran en el paso 2 de la figura 8-17. A continuación realizamos la
resta, seguida de la normalización del resultado.
El uso de filas de procesamiento puede aplicarse al ciclo for loop que se
presentó al principio de esta sección. En la figura 8-18 vemos un sumador de punto
flotante con filas de procesamiento de cuatro etapas. En cada ciclo, la primera etapa
obtiene un par de operandos. Luego, la segunda etapa ajusta el exponente del
operando más pequeño de modo que coincida con el del más grande. La tercera etapa
efectúa la operación, y la cuarta normaliza el resultado. De este modo, un resultado
sale de la fila de procesamiento en cada ciclo.
12
Arquitectura de Computadoras II
de 24 bits sirven para direccionar la memoria. Los 64 registros B de 24 bits sirven para
guardar registros A cuando no se necesitan, en lugar de escribirlos de vuelta en la
memoria. Los ocho registros S de 64 bits sirven para contener cantidades escalares
(enteras y de punto flotante). Los valores de estos registros pueden utilizarse como
operandos para operaciones tanto enteras como de punto flotante. Los 64 registros T
de 64 bits son almacenamiento adicional para los registros S, otra vez con objeto de
reducir el número de instrucciones LOAD y STORE.
12
Arquitectura de Computadoras II
vectorial. Con el encadenamiento, tan pronto como se han multiplicado los primeros
elementos, el producto puede ir directamente al sumador, junto con el primer elemento
de R3. No se requiere un almacenamiento intermedio. Esta técnica mejora
considerablemente el desempeño.
Como comentario final acerca de la Cray-1, resulta interesante examinar su
desempeño absoluto. El reloj opera a 80 MHz y tiene una memoria principal de 8 MB.
En su época (de mediados a fines de los años setenta) era la computadora más
potente del mundo. Hoy día ya no es posible comprar una PC con un reloj tan lento ni
una memoria tan pequeña; ya nadie las fabrica. Esta observación es un testimonio a la
rapidez con que avanza la industria de las computadoras.
12
Arquitectura de Computadoras II
Consistencia estricta
Consistencia secuencial
12
Arquitectura de Computadoras II
13
Arquitectura de Computadoras II
Consistencia débil
13
Arquitectura de Computadoras II
Consistencia de liberación
13
Arquitectura de Computadoras II
Si el bus está ocupado cuando una CPU quiere leer o escribir en la memoria, la
CPU esperará hasta que el bus se desocupe. Aquí radica el problema de este diseño.
Con dos o tres CPU, la contención por el bus será manejable; con 32 o 64 será
intolerable. El sistema estará limitado totalmente por el ancho de banda del bus, y casi
todas las CPU estarán ociosas la mayor parte del tiempo.
La solución a este problema es añadir una caché a cada CPU, como se
muestra en la figura 8-22(b). La caché puede estar dentro del chip de la CPU, junto al
chip, en la tarjeta del procesador, o en alguna combinación de las tres posibilidades.
Puesto que ahora muchas lecturas se pueden atender con la caché local, habrá
mucho menos tráfico de bus, y el sistema podrá manejar más CPU.
Otra posibilidad más es el diseño de la figura 8-22(c), en el que cada CPU tiene
no sólo una caché, sino también una memoria privada local a la que accede a través
de un bus dedicado (privado). Para usar esta configuración de manera óptima, el
compilador debe colocar todo el texto del programa, cadenas, constantes y demás
datos sólo de lectura, pilas y variables locales en las memorias privadas. Entonces, la
memoria compartida se usará sólo para variables compartidas escribibles. En casi
todos los casos, esta colocación cuidadosa reduce considerablemente el tráfico de
bus, pero requiere la cooperación activa del compilador.
Caché espía
13
Arquitectura de Computadoras II
13
Arquitectura de Computadoras II
13
Arquitectura de Computadoras II
13
Arquitectura de Computadoras II
13
Arquitectura de Computadoras II
Aun con todas las posibles optimaciones, el uso de un solo bus limita el tamaño
de un multiprocesador UMA a unas 16 o 32 CPU. Si queremos rebasar ese límite,
necesitamos un tipo de red de interconexión distinto. El circuito más sencillo para
conectar n CPU a k memorias es el conmutador de barras cruzadas que se muestra
en la figura 8-25. Este tipo de conmutadores se ha usado desde hace décadas en las
centrales de conmutación telefónica para conectar un grupo de líneas entrantes a un
conjunto de líneas salientes de forma arbitraria.
En cada intersección de una línea horizontal (entrante) y una vertical (saliente)
hay un punto de cruce. Un punto de cruce es un conmutador pequeño que se puede
abrir o cerrar eléctricamente, dependiendo de si se quiere conectar o no las líneas
horizontal y vertical. En la figura 8-25(a) vemos tres puntos de cruce cerrados
simultáneamente, lo que permite conexiones entre los pares (CPU, memoria)
(001,000), (101, 101) y (110,010) al mismo tiempo. Hay muchas otras combinaciones
posibles. De hecho, el número de combinaciones es igual al número de formas
distintas en que cuatro torres se pueden colocar sin peligro en un tablero de ajedrez.
Una de las propiedades más útiles del conmutador de barras cruzadas es que
es una red no bloqueadora, lo que significa que a ninguna CPU se le niega la
conexión que necesita porque algún punto de cruce o línea está ocupado (suponiendo
que el módulo de memoria en sí está disponible). Además, no es necesario planear
con anticipación. Aunque ya se hayan establecido siete conexiones arbitrarias,
siempre será posible conectar la última CPU con la última memoria. Más adelante
veremos esquemas de interconexión que no poseen estas propiedades.
Una de las peores propiedades del conmutador de barras cruzadas es el hecho
de que el número de puntos de cruce aumenta en proporción a n2. Con 1000 CPU y
1000 módulos de memoria necesitamos un millón de puntos de cruce. Un conmutador
13
Arquitectura de Computadoras II
13
Arquitectura de Computadoras II
Es evidente que el Enterprise 10000 está en el límite; usa cuatro buses para
espiar en paralelo y un conmutador de barras cruzadas muy ancho para transferir
datos. Si queremos ir mucho más allá de 64 CPU, vamos a necesitar algo muy distinto.
Kumar y Reddy, 1987). Una posibilidad es la austera red omega que se ilustra
en la figura 8-28. Aquí hemos conectado ocho CPU con ocho memorias empleando 12
conmutadores. De forma más general, para n CPU y n memorias necesitaríamos log2n
etapas, con ni2 conmutadores por etapa, para un total de (n!2)\og2n conmutadores,
que es mucho mejor que n2 puntos de cruce, sobre todo para valores grandes de n.
14
Arquitectura de Computadoras II
14
Arquitectura de Computadoras II
A estas alturas debe ser evidente que los multiprocesadores UMA de un solo
bus generalmente están limitados a unas cuantas docenas de CPU, y los
multiprocesadores de barras cruzadas o conmutados necesitan mucho hardware
(costoso) y no son mucho más grandes. Si se quiere llegar a más de 100 CPU, algo
tiene que ceder. Por lo regular, lo que cede es la idea de que todos los módulos de
memoria tienen el mismo tiempo de acceso. Esta concesión da lugar a la idea de
multiprocesadores con acceso no uniforme a la memoria (NUMA, NonUniform
Memory Access). Al igual que sus parientes UMA, éstos ofrecen un solo espacio de
direcciones para todas las CPU, pero a diferencia de las máquinas UMA, el acceso a
los módulos de memoria local es más rápido que a los módulos remotos. Así pues,
todos los programas UMA se pueden ejecutar sin cambios en las máquinas NUMA,
pero el desempeño es más bajo que en una máquina UMA si la velocidad de reloj es la
misma.
Las máquinas NUMA tienen tres características clave comunes a todas ellas
que juntas las distinguen de otros multiprocesadores:
1. Hay un solo espacio de direcciones visible para todas las CPU.
2. El acceso a la memoria remota se efectúa con instrucciones LOAD y STORE.
3. El acceso a la memoria remota es más lento que el acceso a la memoria local.
Cuando el tiempo de acceso a la memoria remota no se oculta (porque no hay
uso de cachés), el sistema se llama NC-NUMA. Si hay cachés coherentes, el sistema
se llama CC-NUMA (al menos la gente de hardware lo llama así). La gente de software
a menudo lo llama DSM en hardware porque es básicamente igual a la memoria
compartida distribuida (DSM) pero implementado por el hardware utilizando páginas
pequeñas.
Una de las primeras máquinas NC-NUMA (aunque todavía no se acuñaba ese
nombre) fue la Cm* de Carnegie-Mellon, que se ilustra en forma simplificada en la
figura 8-29 (Swan et al., 1977). La Cm* consistía en una colección de CPU LSI-11,
cada una con un poco de memoria que se direccionaba por un bus local. (El LSI-11 fue
una versión en un solo chip del DEC PDP-11, una minicomputadora popular en los
años setenta.) Además, los sistemas LSI-11 estaban conectados por un bus del
sistema. Cuando una solicitud de memoria llegaba a la MMU (que tenía modificaciones
especiales), se verificaba si la palabra requerida estaba en la memoria local. Si así
era, se enviaba una solicitud por el bus local para obtener la palabra; si no, la solicitud
se enviaba por el bus del sistema al sistema que contenía la palabra, el cual entonces
14
Arquitectura de Computadoras II
respondía. Desde luego, lo segundo tardaba mucho más que lo primero. Si bien un
programa podía ejecutarse sin problema usando memoria remota, tardaba 10 veces
más en ejecutarse que el mismo programa usando memoria local.
14
Arquitectura de Computadoras II
(modificada). Puesto que esta base de datos se debe consul¬tar en cada instrucción
que hace referencia a la memoria, se tiene que mantener en hardware especial
extremadamente rápido capaz de responder en una fracción de ciclo de bus.
A fin de hacer un poco más concreta la idea de un multiprocesador basado en
directorios, consideremos un ejemplo (hipotético) sencillo, un sistema con 256 nodos,
cada uno de los cuales consiste en una CPU y 16 MB de RAM conectada a la CPU por
un bus local. La memoria total es de 2H bytes, dividida en 226 líneas de caché de 64
bytes cada una. La memoria se reparte estáticamente entre los nodos, con 0-16M en
el nodo 0, 16M-32M en el nodo 1, y así. Los nodos se conectan con una red de
interconexión, como se muestra en la figura 8-30(a). La red podría ser una cuadrícula,
un hipercubo u otra topología. Cada nodo contiene también las entradas de directorio
para las 218 líneas de caché de 64 bytes que constituyen su memoria de 224 bytes.
Por el momento, supondremos que una línea puede estar contenida en cuando más
una caché.
Para ver cómo funciona el directorio, sigamos la pista a una instrucción LOAD
emitida por la CPU 20 que hace referencia a una línea que está en caché. Primero la
CPU que emite la instrucción la presenta a su MMU, la cual la traduce en una
dirección física, digamos 0x24000108. La MMU divide esta dirección en las tres partes
que se muestran en la figura 8-30(b). En decimal, las tres partes son el nodo 36, línea
4 y distancia 8. La MMU ve que la palabra de memoria a la que se hizo referencia es
del nodo 36, no del nodo 20, por lo que envía un mensaje de solicitud por la red de
interconexión al nodo base de la línea, el 36, preguntándole si su línea 4 está en caché
y, si así es, dónde está.
14
Arquitectura de Computadoras II
14
Arquitectura de Computadoras II
14
Arquitectura de Computadoras II
14
Arquitectura de Computadoras II
Aunque la máquina DASH tuvo una influencia notable, nunca fue un producto
comercial. En vista de la importancia que están adquiriendo los multiprocesadores CC-
14
Arquitectura de Computadoras II
El tamaño del sistema se expande más allá de cuatro CPU insertando una
tarjeta de controlador de red en una ranura de la tarjeta quad diseñada para
controladores de red. Dicha tarjeta, llamada tarjeta IQ-Link, es el adhesivo que
convierte todas las tarjetas quad en un solo multiprocesador. Su labor primaria es
implementar el protocolo SCI. Cada tarjeta IQ-Link contiene 32 MB de caché, un
directorio que se mantiene al tanto de lo que está en la caché, una interfaz de
espionaje con el bus local de la tarjeta quad. y un chip a la medida llamado bomba de
datos que conecta la tarjeta IQ-Link con otras tarjetas IQ-Link. Básicamente, el chip
“bombea" datos del lado de la entrada al lado de la salida, quedándose con los datos
que van dirigidos a su nodo y dejando pasar los demás datos sin modificación.
Juntas, todas las tarjetas IQ-Link forman un anillo, como se muestra en la figura
8-32. El protocolo SCI mantiene la coherencia de todas las cachés de tarjeta IQ-Link
usando el anillo; no tiene conocimiento del protocolo MESI que se usa para mantener
la coherencia entre las cuatro CPU y la caché de 32 MB en cada nodo, así que este
diseño tiene dos niveles de protocolo de coherencia, igual que DASH.
14
Arquitectura de Computadoras II
Sequent optó por usar SCI como interconexión de las tarjetas quad porque SCI
se diseñó para sustituir al bus en sistemas multiprocesador y multicomputadora
grandes (como el NUMA-Q). SCI apoya la coherencia de caché que se requiere en los
multiprocesadores, pero también la transferencia rápida de bloques que se necesita en
las multicomputadoras. SCI puede manejar hasta 64K nodos, cada uno con un espacio
de direcciones de hasta 248 bytes. El sistema NUMA-Q más grande consiste en 63
tarjetas quad, que contienen 252 CPU y casi 2™ bytes de memoria física, muy por
debajo de los límites de SCI.
El anillo que conecta las tarjetas IQ-Link cumple con el protocolo SCI. En
realidad, no se trata realmente de un anillo, sino de cables individuales punto a punto.
Su anchura es de 18 bits que incluyen un bit de reloj, un bit indicador y 16 bits de
datos, todos enviados en paralelo. Los enlaces operan a 500 MHz, lo que da una tasa
de datos de 1 GB/s. El tráfico por los enlaces consiste en paquetes, cada uno de los
cuales tiene una cabecera de 14 bytes, 0, 16. 64 o 256 bytes de datos, y una suma de
verificación de dos bytes. El tráfico de paquetes consiste en solicitudes y respuestas.
La memoria física del NUMA-Q 2000 se divide entre los nodos, de modo que
cada página de memoria tiene una máquina base. Cada tarjeta quad puede contener
hasta 4 GB de RAM y las líneas de caché son de 64 bytes, de modo que cada tarjeta
quad guarda 226 líneas de caché. Cuando una línea de caché no se está usando, se
encuentra en sólo un lugar, la memoria base.
Sin embargo, las líneas de caché a menudo se encuentran en una o más
cachés remotas, por lo que cada nodo necesita una tabla de memoria local de 226
entradas para poder localizar todas sus líneas de caché, dondequiera que se
encuentren. Una posibilidad habría sido tener un mapa de bits por cada entrada, que
indique cuáles tarjetas IQ-Link tienen la línea. DASH opera de este modo. Sin
embargo, SCI evita este mapa de bits porque no funciona bien cuando cambia la
escala. (Recuerde que SCI puede manejar 64K nodos; tener 226 entradas de
directorio, cada una de 64K bits, sería demasiado costoso.)
En lugar de usar un mapa de bits, todas las copias de una línea de caché se
“ensartan” en una lista doblemente enlazada. La entrada de la tabla de memoria local
del nodo base indica cuál nodo tiene la cabeza de la lista. En la NUMA-Q 2000 un
número de 6 bits es suficiente, porque hay cuando más 63 nodos. Para el sistema SCI
máximo, un número de 16 bits es lo bastante grande. De cualquier modo, este
esquema funciona mucho mejor en sistemas grandes que un mapa de bits al estilo
DASH con 63 o 64K bits. Esta propiedad es lo que hace que SCI sea mucho más
escalable que un diseño estilo DASH.
Además de la tabla de memoria local, cada tarjeta IQ-Link tiene un directorio
con una entrada por cada línea de caché que tiene actualmente. Puesto que la caché
tiene una capacidad de 32 MB y las líneas de caché son de 64 bytes, cada tarjeta IQ-
Link puede contener hasta 211' líneas de caché. Así pues, cada directorio tiene 219
entradas, una para cada línea de caché.
Si una línea está en una sola caché, la tabla de memoria local del nodo base
apunta al nodo en el que se encuentra la línea. Si después la línea se coloca en caché
en un segundo nodo, el protocolo SCI hará que el directorio base apunte a la nueva
entrada, que a su vez apunta a la entrada vieja. De este modo se forma una lista de
dos elementos. A medida que nuevos nodos comparten la misma línea, se agregan,
por turno, a la cabeza de la lista. Todos los nodos que contienen la línea de caché se
enlazan así en una cadena arbitrariamente larga. Este encadenamiento se ilustra en la
15
Arquitectura de Computadoras II
figura 8-33 para el caso de una línea de caché que se encuentra en los nodos 4. 9 y
22.
Cada entrada de directorio consta de 36 bits. Seis de ellos apuntan al nodo que
tiene la línea anterior de la cadena. Así mismo, seis bits apuntan al nodo que tiene la
siguiente línea de la cadena. Un cero indica el fin de la cadena, y es por ello que el
sistema máximo es de 63 nodos, no de 64. Se necesitan siete bits para registrar el
estado de la línea.
Por último, se requieren 13 bits para el campo de etiqueta que identifica la
línea. Recuerde que el sistema NUMA-Q 2000 más grande contiene 63 x 232=238 bytes
de RAM, por lo que hay casi 232 líneas de caché. Los cachés son de correspondencia
directa, así que con 232 líneas de caché que corresponden a 219 entradas de caché hay
213 líneas que corresponden a cada entrada. Por tanto, se necesita una etiqueta de 13
bits para saber cuál es la que está ahí.
Toda línea de caché tiene una localidad fija en una y sólo una memoria que es
su base. Estas líneas pueden estar en uno de tres estados: NO EN CACHÉ,
COMPARTIDA y MODIFICADA. La terminología SCI para estos estados es HOME,
FRESH y GONE, respectivamente, pero a fin de evitar complicaciones innecesarias
seguiremos con la terminología anterior, pues ya hemos estado usándola. El estado
NO EN CACHÉ implica que la línea no está en la caché de ninguna tarjeta IQ-Link,
aunque podría estar en una caché local de la misma tarjeta quad. El estado
COMPARTIDA implica que la línea está en al menos una caché de tarjeta IQ- Link,
posiblemente en más, y que la memoria está actualizada. Por último, el estado
MODI¬FICADA implica que la línea está en caché en alguna tarjeta IQ-Link y podría
haberse modificado allí con lo que la memoria no estaría al día.
El la tarjeta IQ-Link los bloques pueden estar en cualquiera de 29 estados
estables o en cualquiera de un gran número de estados transitorios. De hecho, se
necesitan 7 bits para registrar el estado de cada línea de caché, como se muestra en
la figura 8-33. Cada estado estable se compone de dos campos. El primero indica si la
línea es la cabeza de su lista, el final de su lista, un miembro intermedio de su lista o la
15
Arquitectura de Computadoras II
15
Arquitectura de Computadoras II
15
Arquitectura de Computadoras II
Esto nos lleva a encontrar líneas que son realmente remotas. Una solución es
asignar a cada página una máquina base en términos de dónde está su entrada de
directorio, pero no dónde están los datos. Así, puede enviarse un mensaje a la
máquina base para al menos localizar la línea de caché. Otros esquemas implican
organizar la memoria en forma de árbol y buscar hacia arriba hasta encontrar la línea.
El segundo problema de la lista anterior tiene que ver con no eliminar la última
copia. Como en CC-NUMA. Una línea de caché podría estar en varios nodos al mismo
tiempo. Cuando ocurre un fallo de caché, se debe traer una línea, lo que normalmente
implica que hay que desalojar otra línea. ¿Qué sucede si la línea escogida para el
desalojo es la última copia? En tal caso, no podemos eliminarla.
Una solución es regresar al directorio y verificar si hay otras copias. Si las hay,
la línea puede desalojarse sin peligro; si no, hay que pasarla a otro lugar. Otra solución
consiste en marcar una copia de cada línea de caché como copia maestra y nunca
desalojarla. Esta solución evita tener que consultar el directorio. Tomando todo en
cuenta, COMA promete alcanzar un mejor desempeño que CC-NUMA, pero no se han
construido muchas máquinas COMA, así que se necesita más experiencia. Las dos
máquinas COMA que se han construido hasta ahora son la KSR-1 (Burkhardt et al.,
1992) y la Data Diffusion Machine (Hagersten et al., 1992). Se puede encontrar más
información acerca de máquinas COMA en (Falsafi y Wood, 1997; Joe y Hennessy,
1994; Morin et al., 1996; y Saulsbury et al., 1995).
Como vimos en la figura 8-14, los dos tipos de procesadores paralelos MIMD
son los multiprocesadores y las multicomputadoras. En la sección anterior estudiamos
los multiprocesadores. Vimos que, desde la perspectiva del sistema operativo, los
multiprocesadores parecen tener una memoria compartida a la que se accede con
instrucciones LOAD y STORE ordinarias. Como vimos, esta memoria compartida se
puede implementar de varias maneras, que incluyen espiar buses. conmutadores de
barras cruzadas, redes de conmutación multietapas, y diversos esquemas basados en
directorios. No obstante, los programas escritos para un nrultiprocesador pueden
accesar a cualquier localidad de memoria sin saber nada acerca de la topología
interna ni del esquema de implementación. Esta ilusión es lo que hace a los
multiprocesadores tan atractivos.
Por otra parte, los multiprocesadores también tienen sus limitaciones, y ésta es
la razón por la que las multicomputadoras también son importantes. En primer lugar,
los multiprocesadores no pueden escalarse a tamaños muy grandes. Ya vimos la
enorme cantidad de hardware que Sun tuvo que usar para escalar el Enterprise 10000
a 64 CPU. La Sequent NUMA-Q llega a 256 CPU, pero el precio que se paga es un
tiempo de acceso a memoria no uniforme. En contraste, ahora estudiaremos dos
multicomputadoras que tienen 2048 y 9152 CPU, respectivamente. Pasarán años
antes de que alguien construya un multiprocesador comercial con 9000 nodos, y para
entonces ya se estarán usando multicomputadoras de 100,000 nodos.
Además, la contención por la memoria en un multiprocesador puede afectar
mucho el desempeño. Si 100 CPU están tratando de leer y escribir las mismas
variables constantemente, la lucha por las distintas memorias, buses y directorios
puede perjudicar enormemente el desempeño.
Como consecuencia de éstos y otros factores, ha surgido un gran interés por
construir y usar computadoras paralelas en las que cada CPU tiene su propia memoria
privada, no accesible directamente para ninguna otra CPU. Éstas son las
15
Arquitectura de Computadoras II
Casi todas estas máquinas usan CPU estándar como procesadores. Las
preferidas son la línea Pentium de Intel, el UltraSPARC de Sun, el IBM RS/6000 y el
DEC Alpha. Lo que distingue a los MPP es su uso de una red de interconexión propia
de alto desempeño diseñada para transferir mensajes con baja latencia y gran ancho
de banda. Ambas cosas son importantes porque casi todos los mensajes son
pequeños (mucho menos de 256 bytes) pero casi todo el tráfico total se debe a
15
Arquitectura de Computadoras II
mensajes grandes (más de 8 KB). Los MPP también usan una gran cantidad de
software y bibliotecas propios.
Otro aspecto que caracteriza a los MPP es su enorme capacidad de E/S. Los
problemas lo bastante grandes como para justificar el uso de MPP casi siempre tienen
cantidades enormes de datos que procesar, a veces del orden de terabytes. Estos
datos deben distribuirse entre muchos discos y tienen que desplazarse dentro de la
máquina a gran velocidad.
Por último, otro aspecto característico de los MPP es su atención a la tolerancia
ante fallos. Con miles de CPU, son inevitables varios fallos por semana. Abortar una
serie de procesamiento de 18 horas porque una CPU se cayó es inaceptable, sobre
todo cuando cabe esperar un fallo de esos cada semana. Por ello, los MPP grandes
siempre cuentan con hardware y software especial para monitorear el sistema,
detectar fallos y recuperarse de ellos sin tener que parar.
Aunque sería agradable pasar ahora al estudio de los principios generales del
diseño de los MPP, la verdad es que no hay muchos principios. En lo esencial, un
MPP es una colección de nodos de computación más o menos estándar unidos por
una interconexión muy rápida de los tipos que ya estudiamos. Lo que haremos,
entonces, es examinar dos ejemplos de MPP: el Cray T3E y el Intel/Sandia Option
Red.
El Cray T3E
15
Arquitectura de Computadoras II
registros se pueden cargar con direcciones de memoria remota para leer o escribir
palabras (o bloques de 8 palabras) de memoria remota. Por tanto, la T3E sí tiene
acceso a la memoria remota, pero no a través de las instrucciones LOAD y STORE
normales. Esto hace que sea una especie de híbrido entre una máquina NC-NUMA y
un MPP, pero tiene más rasgos de MPP, ya que el sistema operativo ciertamente sabe
que no puede leer o escribir en la memoria remota como si fuera local. La coherencia
de la memoria está garantizada porque las palabras que se leen de una memoria
remota no se colocan en caché; la memoria remota es la única copia.
Los nodos T3E se conectan de dos formas distintas, como se muestra en la
figura 8-35. La interconexión principal es un toroide 3D dúplex. Por ejemplo, un
sistema con 512 nodos podría configurarse como un cubo de 8 x 8 x 8. Cada nodo del
toroide 3D tiene seis enlaces con otros nodos: sus vecinos al norte, oriente, sur,
poniente, arriba y abajo. La tasa de transferencia por estos enlaces es de 480 MB/s en
cada dirección.
Los nodos también están conectados por uno o más GigaRings, el subsistema
de E/S de gran ancho de banda conmutado por paquetes. Los nodos lo usan para
comunicarse entre sí y con las redes, discos y otros periféricos enviando paquetes de
hasta 256 bytes por él. Cada GigaRing consiste en un par de anillos contrarrotatorios
con una anchura de 32 bits que conectan los nodos de CPU con nodos de E/S
especiales. Estos últimos contienen ranuras para insertar tarjetas de red (por ejemplo,
HIPPI, Ethernet, ATM, FDDI o canal de fibra), discos, cintas y otros dispositivos.
Como puede haber hasta 2048 nodos en un sistema T3E, ocurren fallos con
cierta regularidad. Para resolver este problema, por cada 128 nodos de usuario, el
sistema contiene un nodo de repuesto. Los nodos muertos pueden sustituirse por
nodos de repuesto mientras está funcionando el sistema, sin necesidad de un
rearranque. Además de los nodos de usuario y los nodos de repuesto, algunos nodos
se dedican a ejecutar servidores de sistema operativo porque los nodos de usuario no
ejecutan el sistema operativo completo, sino sólo un núcleo básico. El sistema
operativo que se usa es una versión de UNIX.
15
Arquitectura de Computadoras II
Las computadoras del extremo superior y las fuerzas armadas han estado
entrelazadas en Estados Unidos desde 1943, cuando el ejército contrató a John
Mauchly para construir ENIAC, la primera computadora electrónica moderna. La
relación entre las fuerzas armadas estadounidenses y la computación de alta
velocidad continúa. A mediados de los años noventa, los departamentos de la Defensa
y de Energía de Estados Unidos lanzaron un ambicioso programa para efectuar
avances en supercomputación diseñando cinco MPP que operarían a velocidades de
1,3,10,30 y 100 teraflops/s, respectivamente. Para hacer una comparación con una
computadora más conocida, 100 teraflops (1014 operaciones de punto flotante/s) es
500,000 veces la potencia de un Pentium Pro de 200 MHz.
A diferencia de la Cray T3E, que es un producto comercial normal que se
compra en la tienda (aunque hay que llevar mucho dinero), las máquinas de teraflops
son sistemas únicos otorgados mediante licitación competitiva por el Departamento de
Energía, que opera los laboratorios nacionales de Estados Unidos. Intel ganó el primer
contrato; IBM ganó los dos siguientes. Si planea licitar por contratos futuros, 80
millones de dólares sería una buena cifra para tenerla en mente. Dado que estas
máquinas son para uso militar (primordialmente para simular explosiones nucleares),
alguna persona imaginativa del Pentágono pensó en nombres patrióticos para las tres
primeras: rojo, blanco y azul (los colores de la bandera estadounidense); lo malo es
que se equivocó en el orden: la máquina de 1 TFLOPS/s (instalada en el Sandia
National Laboratory en diciembre de 1996) se llama Option Red (opción roja), y las
dos siguientes se llaman Option Blue (1999) y Option White (1900),
respectivamente. En el resto de esta sección nos concentraremos en la primera de las
máquinas de teraflops, la Option Red.
La máquina Option Red consiste en 4608 nodos dispuestos en una malla
tridimensional. Las CPU están instaladas en dos tipos de tarjetas. Las tarjetas kestrel
se usan como nodos de cómputo, y las tarjetas eagle (águila) se usan como nodos de
servicio, disco, red y arranque. Hay 4536 nodos de cómputo, 32 nodos de servicio, 32
nodos de disco, 6 nodos de red y dos nodos de arranque.
La tarjeta kestrel, que se ilustra en la figura 8-36(a), contiene dos nodos
lógicos, cada uno con dos CPU Pentium Pro de 200 MHz y 64 MB de RAM
compartida. Cada nodo kestrel tiene su propio bus local de 64 bits y su propio chip de
interfaz con red (NIC, Network Interface Chip). Los dos NIC están interconectados,
por lo que sólo uno de ellos está vinculado realmente con la red de interconexión, a fin
de hacer más compacto el paquete (aun así, la máquina ocupa un área de piso de 160
m2). Las tarjetas eagle también tienen CPU Pentium Pro, pero sólo dos por tarjeta.
Estas tarjetas tienen también capacidad de E/S adicional.
Las tarjetas están interconectadas por una estructura de cuadrícula de 32 x 38
x 2 dispuesta en forma de dos planos 32 x 38 con todos los nodos correspondientes
interconectados (el tamaño de la cuadrícula lo determinaron consideraciones de
empaque, por lo que no todos los puntos de la cuadrícula tienen tarjetas). En cada
punto de cuadrícula hay un chip enrutador especial con seis enlaces: norte, oriente,
sur, poniente, al otro plano y a la tarjeta kestrel o eagle conectada a él. Cada enlace
puede transferir 400 MB/s en cada dirección simultáneamente. Los chips enrutadores
utilizan enrutamiento por túnel a fin de reducir la latencia.
Se usa enrutamiento dimensional; los paquetes pueden pasar primero al otro
plano, luego en dirección oriente-poniente, luego norte-sur y por último al plano
15
Arquitectura de Computadoras II
correcto, si no están ya ahí. La razón para efectuar dos traslados entre los planos es la
tolerancia ante fallos. Supongamos que un paquete simplemente tiene que llegar a su
vecino que está un brinco al norte, pero el enlace entre ellos está roto. En vez de ello,
el mensaje puede pasar al otro plano, dar un brinco al norte y regresar al mismo plano,
pasando por alto el enlace defectuoso.
15
Arquitectura de Computadoras II
8.4.3 Planificación
Una pregunta obvia es: “¿Qué diferencia hay entre un COW descentralizado y
una LAN llena de máquinas de usuario?” La respuesta tiene que ver con el software y
la utilización, no con el hardware. En una LAN, los usuarios tienen máquinas
personales y las usan para todo su trabajo. En contraste, un COW descentralizado es
un recurso compartido al cual los usuarios pueden presentar trabajos que requieren
múltiples CPU. Para atender solicitudes de múltiples usuarios, cada uno de los cuales
necesita múltiples CPU, un COW (centralizado o descentralizado) necesita un
planificador de trabajos.
16
Arquitectura de Computadoras II
Puesto que los COW tienen éxito o fracasan dependiendo de la cantidad de las
tarjetas de red insertables que pueden obtenerse comercialmente, vale la pena
examinar algunas de las tecnologías que están disponibles. Nuestro primer ejemplo es
Ethernet, que viene en tres versiones, lenta, de media velocidad y rápida (o, más
16
Arquitectura de Computadoras II
16
Arquitectura de Computadoras II
16
Arquitectura de Computadoras II
16
Arquitectura de Computadoras II
mayor parte, los mismos paquetes de software se ejecutan en MPP y COW, así que
no es difícil trasladar las aplicaciones de una plataforma a otra.
Los sistemas de transferencia de mensajes tienen dos o más procesos que se
ejecutan de forma independiente. Por ejemplo, un proceso podría estar produciendo
ciertos datos y otro u otros procesos podrían estarlos consumiendo. No existe garantía
de que cuando el transmisor tenga más datos los receptores estarán listos para
recibirlos, ya que cada uno ejecuta su propio programa.
Casi todos los sistemas de transferencia de mensajes cuentan con dos
primitivas (por lo regular llamadas de biblioteca), send y receive, pero puede haber
varios tipos de semánticas distintas. Las tres principales variantes son:
1. Transferencia de mensajes sincrónica.
2. Transferencia de mensajes con buffers.
3. Transferencia de mensajes no bloqueadora.
En la transferencia de mensajes sincrónica, si el transmisor ejecuta un send
y el receptor todavía no ha ejecutado un receive, el transmisor se bloquea (suspende)
hasta que el receptor ejecuta un receive, y en ese momento se copia el ensaje.
Cuando el transmisor recupera el control después de la llamada, sabe que el
mensaje se envió y se recibió correctamente. Este método tiene la semántica más
sencilla y no requiere buffers. Una desventaja importante es que el transmisor
permanece bloqueado hasta que el receptor ha obtenido el mensaje y ha confirmado
tal recepción.
En la transferencia de mensajes con buffers, cuando se envía un mensaje
antes de que el receptor esté listo, el mensaje se coloca en un buffer en algún lado,
por ejemplo en un buzón, hasta que el receptor lo saca. Así, en la transferencia de
mensajes con buffers un transmisor puede continuar después de un send, aunque el
receptor esté ocupado con otra cosa. Puesto que el mensaje realmente se envió, el
transmisor está en libertad de reutilizar el buffer de mensajes de inmediato. Este
esquema reduce el tiempo que el transmisor tiene que esperar. Básicamente, tan
pronto como el sistema ha enviado el mensaje el transmisor puede continuar. Sin
embargo, el transmisor no tiene ninguna garantía de que el mensaje se recibió
correctamente. Incluso si la comunicación es confiable, el receptor podría haberse
caído antes de recibir el mensaje.
En la transferencia de mensajes no bloqueadora, se permite al transmisor
continuar de inmediato después de efectuar la llamada. Lo único que la biblioteca hace
es pedir al sistema operativo que lleve a cabo la llamada después, cuando tenga
tiempo. El resultado es que el transmisor prácticamente no se bloquea. La desventaja
de este método es que cuando el transmisor continúa después del send no puede
reutilizar el buffer de mensajes, porque es posible que el mensaje todavía no se haya
enviado. El transmisor necesita una forma de averiguar si ya puede reutilizar el buffer.
Una idea es hacer que le pregunte repetidamente al sistema. La otra es recibir una
interrupción cuando el buffer esté disponible. Ninguna de estas cosas simplifica el
software.
En las dos secciones que siguen examinaremos brevemente dos sistemas de
transferencia de mensajes que se usan en muchas multicomputadoras: PVM y MPI.
Estos no son los únicos, pero son los más ampliamente utilizados. PVM es más
antiguo y fue el estándar de fado durante años, pero ahora MPI es el muchacho nuevo
en el barrio y está retando al campeón reinante.
16
Arquitectura de Computadoras II
Cada proceso ejecutará prog. PVM decide dónde colocará los procesos, pero
un usuario puede supeditar esa decisión con argumentos del comando spawn.
También se pueden iniciar procesos desde un proceso en ejecución invocando
Pvm_spawn. Los procesos pueden organizarse en grupos cuya composición cambia
dinámicamente durante la ejecución.
La comunicación en PVM se maneja con primitivas de transferencia de
mensajes explícitas y de tal manera que se puedan comunicar máquinas que usen
diferentes representaciones de los números. Cada proceso PVM tiene un buffer de
envío activo y un buffer de recepción activo en cualquier instante. Para enviar un
mensaje, un proceso invoca procedimientos de biblioteca para empacar valores en el
buffer de envío activo en un formato que se describe a sí mismo, de modo que el
receptor pueda reconocerlos y convertirlos a su formato nativo.
Una vez que se ha armado el mensaje, el transmisor invoca el procedimiento
de biblioteca pvm_send, que es una transmisión bloqueadora. El receptor tiene varias
opciones. La más sencilla es pvm_recv, que bloquea al receptor hasta que llega un
mensaje apropiado. Cuando la llamada regresa el mensaje está en el buffer de
recepción activo, y puede desempacarse y convertirse en valores apropiados para su
máquina utilizando una serie de procedimientos de desempacado. Si un receptor está
preocupado por la posibilidad de bloquearse indefinidamente, puede invocar
pvm_trecv, que bloquea al receptor durante cierto tiempo, pero si en ese tiempo no
llega un mensaje apropiado se desbloquea e informa del fracaso. Una opción más es
pvm_nrecv, que regresa inmediatamente, sea con un mensaje o con una indicación de
que no ha llegado ningún mensaje. Esta llamada puede efectuarse una y otra vez para
ver si han llegado mensajes.
Además de estas primitivas para mensajes de punto a punto, PVM también
maneja difusión (pvm_bcast) y multidifusión (pvm-mcast). La primera transmite a todos
los procesos de un grupo; la segunda transmite a una lista específica de procesos.
La sincronización entre procesos se efectúa usando pvm_barrier. Cuando un
proceso invoca este procedimiento, se bloquea hasta que cierto número de otros
procesos han llegado también a la barrera y han efectuado la misma llamada. Hay
otras llamadas PVM para gestión de anfitriones, gestión de grupos, gestión de buffers,
señalización, verificación de estado y funciones diversas. En síntesis, PVM es un
16
Arquitectura de Computadoras II
paquete sencillo, directo, fácil de usar, disponible en casi todas las computadoras
paralelas, todo lo cual explica su popularidad.
Esta llamada envía al destino un buffer con cuenta de elementos del tipo de
datos especificados. El campo etiqueta rotula el mensaje para que el receptor pueda
decir que sólo quiere recibir un mensaje con esa etiqueta. El último campo indica en
cuál grupo de procesos está el destino (el campo destino sólo es un índice dentro de la
lista de procesos para el grupo especificado). La llamada correspondiente para recibir
un mensaje es
que anuncia que el receptor está buscando un mensaje de cierto tipo proveniente de
cierto origen, con cierta etiqueta.
MPI reconoce cuatro modos de comunicación básicos. El modo 1 es sincrónico,
en el que el transmisor no puede comenzar a transmitir hasta que el receptor haya
invocado a MPI_Recv. El modo 2 usa buffers, por lo que no aplica la restricción
anterior. El modo 3 es estándar, que depende de la implementación y puede ser
sincrónico o usar buffers. El modo 4 es “listo”, en el que el transmisor asegura que el
receptor está disponible (como en el sincrónico), pero no se comprueba que sea cierto.
Cada una de estas primitivas tiene una versión bloqueadora y una no bloqueadora, así
que hay ocho primitivas en total. La recepción sólo tiene dos variantes: bloqueadora y
no bloqueadora.
16
Arquitectura de Computadoras II
Por nuestros ejemplos, debe ser obvio que es más fácil aumentar la escala de
una multicomputadora que de un multiprocesador. El Sun Enterprise 10000, con un
máximo de 64 CPU, y el NUMA-Q, con un máximo de 256 CPU, son representativos
de los multiprocesadores UMA y NUMA grandes, respectivamente. En contraste, las
máquinas T3E y Option Red pueden tener 2048 y 9416 CPU, respectivamente.
Podemos debatir eternamente la importancia de estas cifras, pero no podemos
escapar la conclusión de que las multicomputadoras pueden ser mucho más grandes
que los multiprocesadores. Esto siempre ha sido cierto y seguirá siendo cierto durante
muchos años más.
Sin embargo, las multicomputadoras no tienen memoria compartida en el nivel
de arquitectura, lo que dio pie al desarrollo de sistemas de transferencia de mensajes
como PVM y MPI. A muchos programadores no les gusta este modelo y quisieran
tener la ilusión de memoria compartida, aunque no esté realmente ahí. Si se puede
lograr este objetivo se tendría lo mejor de dos mundos: hardware grande de bajo costo
(al menos por nodo) y facilidad de programación. Éste es el Santo Grial de la
computación en paralelo.
Muchos investigadores han llegado a la conclusión de que si bien no es fácil
aumentar la escala de la memoria compartida en el nivel de arquitectura, puede haber
otras formas de alcanzar la misma meta. En la figura 8-3 vemos que hay otros niveles
en el que puede introducirse una memoria compartida. En las secciones que siguen
veremos algunas formas de introducir memoria compartida en el modelo de
programación de una multicomputadora sin que esté presente en el nivel de hardware.
16
Arquitectura de Computadoras II
16
Arquitectura de Computadoras II
17
Arquitectura de Computadoras II
la página actual y la gemela. Sólo se envían las palabras que se modificaron, lo que
reduce el tamaño de los mensajes.
Cuando ocurre un fallo de página, es preciso localizar la página faltante. Puede
haber varias soluciones, incluidas las que se usan en máquinas NUMA y COMA, como
los directorios (en la base). De hecho, muchas de las soluciones que se usan en DSM
también son aplicables a NUMA y COMA porque DSM en realidad sólo es una
implementación en software de NUMA o COMA en la que cada página se trata como
una línea de caché.
DSM es un área de investigación muy activa. Entre los sistemas interesantes
están C ASHMERE (Kontothanassis etal., 1997; Stets etai, 1997), CRL (Johnson et al.,
1995), Shasta (Scales et al., 1996) y Treadmarks (Amza, 1996; Lu et al., 1997).
Linda
out("abc", 2, 5);
que produce una tupia con cuatro campos, de los cuales el segundo y el tercero están
determinados por los valores actuales de las variables i y j.
17
Arquitectura de Computadoras II
17
Arquitectura de Computadoras II
todos los trabajadores se mantienen ocupados continuamente, con muy poco gasto
extra.
Existen diversas implementaciones de Linda en sistemas de multicomputadora.
En todos ellos, un aspecto clave es cómo se distribuyen las tuplas entre las máquinas
y cómo se les puede localizar si es necesario. Diversas posibilidades incluyen difusión
y directorios. El copiado es otro aspecto importante. Estos puntos se tratan en
(Bjomson, 1993).
Orca
17
Arquitectura de Computadoras II
Una vez definida una pila, es posible declarar variables de este tipo, como en;
s, t: pila;
que crea dos objetos pila e inicializa la variable tope de cada uno con 0.
Podemos meter la variable entera k en la pila s con el enunciado
s$push(k);
etcétera. La operación sacar tiene un guardia, por lo que un intento por sacar una
variable de^ una pila vacía suspenderá al invocador hasta que otro proceso haya
metido algo en la pila. f ’ Orca cuenta con un enunciado fork para crear un proceso
nuevo en un procesador espe-:;~ cificado por el usuario. El nuevo proceso ejecuta el
procedimiento nombrado en el enunciado fork. Es posible pasar parámetros, que
podrían ser objetos, al nuevo proceso, y es así como se distribuyen los objetos entre
las máquinas. Por ejemplo, el enunciado
for i in 1 .. n do fork foobar(s) on i; od;
genera un proceso nueve en cada una de las máquinas de la 1 hasta la n, ejecutando
el programa foobar en cada una de ellas. Puesto que estos ti procesos nuevos (y el
padre) se ejecutan en paralelo, todos pueden meter elementos en la pila compartida s,
y sacarlos de ella, como si todos se estuvieran ejecutando en un multiprocesador con
memoria compartida. Corresponde al sistema de tiempo de ejecución mantener la
ilusión de una memoria compartida que en realidad no existe.
Las operaciones con objetos compartidos son atómicas y secuencialmente
consistentes. El sistema garantiza que si varios procesos realizan operaciones con el
mismo objeto compartido casi al mismo tiempo, el sistema escogerá algún orden y
todos los procesos verán el mismo orden.
Orca integra datos compartidos y sincronización en una forma que no está
presente en los sistemas DSM basados en páginas. En los programas paralelos se
requieren dos tipos de sincronización. El primero es la sincronización por exclusión
mutua, para evitar que dos procesos ejecuten la misma región crítica al mismo tiempo.
En Orca, cada operación con un objeto compartido es de hecho como una región
crítica porque el sistema garantiza que el resultado final será el mismo que se
obtendría si todas las regiones críticas se ejecutaran una por una (es decir,
secuencialmente). En este sentido, un objeto Orca es como una forma distribuida de
monitor (Hoare, 1975).
El otro tipo de sincronización es la sincronización por condición, en la que un
proceso se bloquea hasta que se cumple una condición. En Orca, la sincronización por
condición se efectúa con guardias. En el ejemplo de la figura 8-42, un proceso que
trata de sacar un elemento de una pila vacía se suspende hasta que la pila deja de
estar vacía.
El sistema de tiempo de ejecución Orca se encarga del copiado de objetos,
migración, consistencia e invocación de operaciones. Cada objeto puede estar en uno
de dos estados: copia única o repetido. Un objeto en estado de copia única existe en
una sola máquina, por lo que todas las solicitudes que lo requieren se envían ahí. Un
objeto repetido está presente en todas las máquinas que contienen un proceso que lo
usa, lo cual facilita las operaciones de lectura (porque se pueden efectuar localmente)
a expensas de hacer las actualizaciones más costosas. Cuando se ejecuta una
operación que modifica un objeto repetido, primero debe obtener un número de
secuencia de un proceso centralizado que los emite. Luego se envía un mensaje a
cada máquina que tiene una copia del objeto, pidiéndole que ejecute la operación.
17
Arquitectura de Computadoras II
Puesto que todas estas actualizaciones llevan números de secuencia, todas las
máquinas realizan las operaciones en orden secuencial, lo que garantiza la
consistencia secuencial.
Globe
Casi todos los sistemas DSM, Linda y Orca se ejecutan en sistemas locales, es
decir, dentro de un solo edificio o campus universitario. Sin embargo, también es
posible construir un sistema de memoria compartida en el nivel de aplicaciones en una
multicomputadora distribuida en todo el mundo. En el sistema Globe, un objeto puede
estar en el espacio de direcciones de varios procesos al mismo tiempo, posiblemente
en continentes distintos (Kermarrec et al., 1998; van Steen et al., 1999). Para acceder
a los datos de un objeto compartido, los procesos de usuario deben usar sus métodos,
lo que permite a diferentes objetos tener diferentes estrategias de implementación. Por
ejemplo, una opción es tener una sola copia de los datos que se solicita
dinámicamente cuando se necesita (apropiado para datos que un solo dueño actualiza
con frecuencia). Otra opción es tener todos los datos situados dentro de cada copia
del objeto y enviar actualizaciones a cada copia con un protocolo de multidifusión
confiable.
Lo que hace a Globe un tanto ambicioso es su meta de abarcar mil millones de
usuarios y un billón de objetos (posiblemente móviles). Localizar objetos,
administrarlos y controlar el cambio de escala son aspectos cruciales. Globe logra esto
con la ayuda de un marco general en el que cada objeto puede tener su propia
estrategia de copiado, estrategia de seguridad, etc. Esto evita el problema “unitalla”
que se presenta en otros sistemas, sin perder la facilidad de programación que ofrece
la memoria compartida.
Otros sistemas distribuidos de área extensa son Globus (Foster y Kesselman,
1998a; Foster y Kesselman, 1998b) y Legión (Grimshaw y Wulf, 1996; Grimshaw y
Wulf, 1997), pero éstos no ofrecen la ilusión de memoria compartida como Globe.
3.2 RESUMEN
17
Arquitectura de Computadoras II
17
Arquitectura de Computadoras II
GUIA DE PREGUNTAS
Aclaración: Las preguntas de diferentes
unidades que se muestran a continuación son una
guía de estudio, de ninguna manera remplaza el
contenido de las unidades. Se evalúa en los
parciales/finales la lecto/comprensión de texto no
la memorización de las respuestas de dichas
preguntas.
17
Arquitectura de Computadoras II
17
Arquitectura de Computadoras II
17
Arquitectura de Computadoras II
18
Arquitectura de Computadoras II
Bibliografía
D. A. PATTERSON & J. L. HENNESSY. Morgan - "Computer Organization and Design”,
4ª Edition. Kaufmann Publishers, 2007.
“Computer Architecture. A quantitative Approach”, 4ª Edition. J. L. HENNESSY & D. A.
PATTERSON
Francisco Aylagas Romero, Elvira Martínez de Icaya Gómez, (Arquitectura de
Computadores - Ingeniería de Computadores) Universidad Politécnica de Madrid
(UPM) y Escuela Universitaria de Informática (EUI) – http://www.dia.eui.upm.es/cgi-
bin/asigfram.pl?cual=ICarq_com&nombre=Arquitectura-de-Computadores - 2013-2014.
Tanenbaum ,A; Capítulo 8; “Arquitecturas De Computadoras Paralelas” Pag. 523 a 612
18
Arquitectura de Computadoras II
Anexo
18
Arquitectura de Computadoras II
Instrucciones MIPS64
18
Arquitectura de Computadoras II
SISD VS SIMD
¿Cómo se puede descomponer las tareas, que tradicionalmente se ejecutaban
en un sistema mono procesador, para que pueda ejecutarse en un sistema
paralelo?
Sabemos que los SISD se refieren a las máquinas de von neuman. trabajan
con un solo procesador y realizan la labor sobre un solo dato a la vez,
La instrucción ejecuta una tarea. Hasta que esta última no se realice no se
puede continuar con la siguiente tarea.
Por lo tanto, El computador de tu casa, de tu oficina o de tu universidad,
contienen un solo procesador, el cual realizara tus tareas secuencialmente (El PC,
celulares, tablets y demás sistemas, poseen la arquitectura de SISD)
El código escalar o de SISD, Resulta ser largo y demora cualquier proceso en
ejecución. Por ejemplo:
SIMD - GPU
Los SIMD es una instrucción, que realiza una tarea simultáneamente. Optimiza
código en programación y agiliza las tareas dadas.
Los SIMD se usan en gran parte en la tecnología de las tarjetas gráficas como:
Nvidia o los conocidos GPU (Unidad de procesamiento gráfico). son programadas por
medio de la estructura SIMD.
Ejemplo del funcionamiento de la tarjeta GPU
18
Arquitectura de Computadoras II
Análisis de Video
https://www.youtube.com/watch?time_continue=1&v=-P28LKWTzrI
En el video se observa, una tarea realizada por la maquina SISD(Cpu) y otra
que es SIMD (GPU). La instrucción recibida es: "Pintar una cara".
Esa instrucción la realiza CPU, luego de unos minutos,
18
Arquitectura de Computadoras II
18
Arquitectura de Computadoras II
Caracteristicas
Dual socket R3 (LGA 2011) supports Intel Xeon processor E5-2600 v3 family; QPI up
to 9.6GT/s
Up to 1.5TB ECC, up to DDR4 2133MHz; 24x DIMM slots (3 DIMMs/ channel design)
Expansion slots:
8 PCIe 3.0 x16 (double-width) slots
2 PCIe 3.0 x8 (in x16) slots
1 PCIe 2.0 x4 (in x16) slot
Intel i350 gigabit Ethernet (GbE) dual port networking
24x 2.5″ hot-swap drive bays
8x 92mm RPM hot-Swap cooling fans
1600W redundant (2+2) power supplies; 80Plus Platinum Level (94%+)
18
Arquitectura de Computadoras II
18
Arquitectura de Computadoras II
18
Arquitectura de Computadoras II
Sunway TaihuLight
19
Arquitectura de Computadoras II
Una nueva versión de la lista trimestral Top 500, que incluye las
supercomputadoras de conocimiento público más potentes del mundo, ha sido publicada
el 20 de junio en el sitio de la organización. En rigor, poco ha sucedido en las primeras
posiciones de la lista desde junio de 2013, en que el súper sistema chino Tianhe-2 se
situó en el primer lugar.
Cada procesador constituye un nodo del sistema, que a su vez está integrado por
40.960 nodos, que en total suman 10.649.600 núcleos de procesadores. Los nodos están
vinculados mediante una solución propietaria denominada Sunway Network, basada en
PCI Express 3.0.
https://diarioti.com/supercomputadora-con-procesadores-chinos-rebasa-a-la-
competencia/98611
19
Arquitectura de Computadoras II
19
Arquitectura de Computadoras II
19
Arquitectura de Computadoras II
Sequoia tambien es uno de los sistemas más eficientes de la lista TOP500, la cual se
mostró el lunes, 18 de Junio de 2012 en la Conferencia de Supercomputación Internacional
2012 (International Supercomputing Conference) en Hamburgo, Alemania. Esta es la 39ª
edición de la lista, la cual se actualiza dos veces al año.
Un nodo IBM BlueGene/Q. Encima una tarjeta con la CPU y sus memorias. Cables
naranjas de fibra óptica conectan las entradas y salidas. Los tubos naranjas son la refrigeración
líquida.
Lugares de instalación:
- D.O.E (Department Of Energy), Departamento de Energía
- N.N.S.A. (National Nuclear Security Agency), Agencia de Seguridad Nuclear Nacional
- L.L.N.L. (Lawrence Livermore National Laboratory), Laboratorio Nacional Lawrence Livermore
Fabricante: IBM
Superficie ocupada: 320 m².
Modelo de sistema: BlueGene/Q
Procesador (CPU): Power BQC, 16 núcleos, 1'60 GHz, 32Mb caché, 64 bits, 45nm, a medida
Número de Procesadores: 98304 (casi cien mil)
Número Núcleos total: 1572864 (millón y
medio) Racks: 96
Energía eléctrica consumida: 7'89
MW Memoria:1572864 GB
Interconexión: A medida
Arquitectura: M.P.P. (Massively Parallel Processing or Massively Parallel Processor) Proceso
Paralelo Masivo.
Acelerador gráfico y/o Co-Procesador: no
Sistema Operativo: Linux
Rmax = 16'324751 petaflop/s
Rpeak = 20'132659 petaflop/s
Eficiencia = 81'09 %
Mflops/Watt = 2069,04
19
Arquitectura de Computadoras II
19
Arquitectura de Computadoras II
19
Arquitectura de Computadoras II
19
Arquitectura de Computadoras II
19
Arquitectura de Computadoras II
· Los núcleos de la CPU son de tipo multihilo simultáneo de 4 vías. Cada núcleo tiene
una unidad SIMD Quad-vector de doble precisión de punto flotante. Los núcleos tienen
una caché L2 de 32 MB eDRAM, operando a la mitad de velocidad del núcleo. La
cache de nivel 2 (L2) es multi-versión, soportando memoria transaccional y ejecución
especulativa. La recarga de la cache L2 está controlada por 2 controladores de
memoria DDR3 integrados funcionando 1'33 GHz. El chip tambien integra lógica para
comunicaciones chip-a-chip en una configuración en Toro 5D, con enlaces 2GB/s chip-
a-chip. 16 núcleos se usan para computación, y un 17º para funciones de asistencia al
sistema operativo tales como interrupciones, comunicación asíncrona I/O, estimulación
MPI y RAS. El 18º núcleo se usa como redundante libre en caso de que uno de los
otros se dañe permanentemente, como por ejemplo en manufactura. El redundante
libre se apaga durante el funcionamiento.
Está fabricado con el proceso en cobre de IBM a 45 nm. Produce un pico de
prestaciones de 204'8 GFLOPS a 1'6 GHz, consumiendo unos 55 vatios. El chip mide
19×19 mm (359'5 mm²) y tiene 1470 millones de transistores. El chip se monta en una
tarjeta junto con 16 GB DDR3 DRAM (1 GB para cada núcleo).
· Un nodo tiene 32 tarjetas, cada una refrigerada por agua y conectada en una red
Toro 5D.
· Cada Rack tiene 32 nodos, 16384 núcleos de usuario y 16 TB RAM (16GB x
1024).
· Existen unos cajones separados "drawer" de I/O que están refrigerados por aire y
contienen 8 tarjetas y 8 slots de expansión PCIe para conectar las tarjetas de red
Ethernet de 10 Gigabit o bien las Infiniband.
· Las CPUs funcionan a una velocidad de reloj de 1'6 GHz y están refrigeradas
por agua. Las CPUs están ensambladas sobre una tarjeta que contiene otra
característica significativa: 72 módulos de memoria DDR3, de la marca Micron. De
acuerdo a IBM, el ancho de banda de la CPU es 42 GB/s. El radiador de la CPU se
extiende sobre la memoria en un lado de la tarjeta, proporcionando refrigeración
líquida a la memoria tambien. IBM dice que la máquina está refrigerada por agua en
un 90% y el resto 10% por aire, lo que hace que la máquina sea muy silenciosa, al
contrário que muchos servidores.
Red en Toro 5D
Las redes informáticas tradicionales ya no son suficientes para dar respuesta a las
demandas de los sistemas de supercomputación. Por eso ahora se utilizan redes
tridimensionales:
19
Arquitectura de Computadoras II
Las topologías de red, es decir, los tipos de red, difieren en algunos puntos
críticos: costo de todo el sistema, ancho de banda agregado, latencia y resistencia a
los fallos de los componentes.
El coste global de un sistema de 4096 nodos de red con diferentes
configuraciones se muestra en la siguiente figura:
20
Arquitectura de Computadoras II
Sistemas con un pequeño número de enlaces pero poca media de hops puede
ser más rápido que los sistemas con más enlaces pero mayor longitud media de
trayecto entre el nodo inicial y el destino.
Por ejemplo, un toro de 16×16×16 (3D) podría ser buena topología porque es
relativamente de bajo costo y fácil de ensamblar. Sin embargo, esta topología podría
tener 4096×6/2 = 12288 enlaces, y la distancia media desde un borde a un nodo
deseado podría ser 16/4+16/4+16/4 = 12 hops. Esto podría limitar el ancho de banda
teórico a 1×12288/12= 1024Gb/s, o 128GB/s a lo sumo, lo cual puede ser insuficiente
para cumplir la demanda de 100GB/s de este ejemplo. La siguiente figura muestra el
20
Arquitectura de Computadoras II
número esperado de hops para cada topología de red además de la carga esperada
en cada enlace de red.
Utilidades
20
Arquitectura de Computadoras II
Los distintos racks se colocan en un suelo hueco, o falso suelo, que tiene unas placas
removibles para poder introducir los cables de fibra óptica que interconectan todos los
racks, además de por su puesto, los cables de energía eléctrica.
20
Arquitectura de Computadoras II
Interconexión de Racks
Evidentemente, toda la información procesada por los racks ha de ser
introducida, visualizada y almacenada en otro sitio. En la figura siguiente vemos el
sistema externo de control, almacenamiento y gestión.
20
Arquitectura de Computadoras II
20
Arquitectura de Computadoras II
Innovaciones de Pascal
Las demandas en el GPU para los PC entusiastas nunca han sido tan grandes.
Resoluciones de pantalla que continúan creciendo, con pantallas 4K y 5K que
requieren GPUs extremadamente poderosas (o múltiples GPU) para mantener los FPS
estables y con una calidad de imagen alta. Los equipos de VR ahora piden como
mínimo que entreguen al menos 90FPS, por cada ojo, y con una latencia muy baja
para asegurar una experiencia inmersiva para que se mueva en conjunto con el
usuario. La GeForce GTX 1080 fue diseñada con estas tecnologías en mente. Las
características principales son:
Arquitectura Pascal
La arquitectura Pascal que se encuentra en la GTX 1080 es la mas eficiente
jamas construida. Consiste de 7.2 mil millones de transistores e incluye 2560 núcleos
CUDA single-precisión. Con un foco intenso en la manufactura en el chip y en el
diseño de la placa, el equipo de ingeniería de NVIDIA logro resultados sin precedentes
en frecuencia y eficiencia energética.
16nm FinFET
el GPU GP104 es fabricado en el proceso de 16nm FinFET el cual permite que
el chip sea fabricado con mas transistores para que así se puedan activar nuevas
características, mas desempeño y una mejora en la eficiencia.
Memoria GDDR5X
GDDR5X provee una mejora en el ancho de banda de memoria por sobre
GDDR5, la cual se utilizaba en la generación anterior de GPUs tope de linea de
NVIDIA. Corriendo a una taza de transferencia de datos de 10Gbps, la interfaz de
memoria de la GTX 1080 entrega un 43% mas de ancho de banda que su
predecesora, la GTX 980. Combinado con las mejoras de compresión de memoria, el
ancho de banda total efectivo, cuando se le compara con al GTX980 es de 1.7 veces.
Simultaneous Multi-Projection (SMP)
El campo de la tecnologia de pantallas esta efectuando cambios significativos
desde los dias de una sola pantalla plana. Reconociendo esta moda, los ingenieros de
NVIDIA desarrollaron una tecnologia denominada Simultaneous MultiProjection que
por primera vez permite que el GPU simultáneamente mapee un primitivo en hasta
dieciséis proyecciones diferentes desde el mismo punto de vista. Cada proyección
puede ser mono o estéreo. Esta capacidad permite a la GTX 1080 pueda aproximar
precisamente la proyección curva requerida para pantallas VR, los ángulos de
proyección múltiple requeridos para configuraciones de pantallas surround y otros
usos en el futuro
20
Arquitectura de Computadoras II
20
Arquitectura de Computadoras II
20
Arquitectura de Computadoras II
20
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
un aumento de un 40% en la Frecuencia Boost comparada con una GTX 980, bastante
mas arriba en de lo que el proceso de 16nm FF hubiera alcanzado solo.
Memoria GDDR5X
Desde la introducción de las memorias GDDR5 en 2009, los diseñadores de
memoria de NVIDIA han estudiado las posibilidades para la próxima generación de
tecnologías de memora. GDDR5X es la culminación de ese esfuerzo: GDDR5X es el
estándar de interfaz de memoria mas rápido y avanzado de la historia alcanzando
velocidades de transferencia de hasta 10 Gbps o casi 100 picosegundos (ps) entre bits
de datos. Para poner esa velocidad en contexto de señal, considera que la luz viaja
cerca de una pulgada en 100 ps de tiempo. Un circuito IO GDDR5X tiene menos de la
mitad de ese tiempo disponible para muestrear un bit cuando llegue, o la información
se perderá mientras el bus pasa a un nuevo set de valores.
Para lograr esta operación de alta velocidad, una nueva arquitectura de circuito
IO era necesaria y requirió un proyecto de desarrollo de años incorporando los últimos
avances en la materia. Cada aspecto del nuevo diseño fue cuidadosamente diseñado
para cumplir los estándares exactos de operación de alta frecuencia. Con esto,
también se lograron mejoras de desempeño energético a través de la combinación de
estas ventajas de circuitería, el bajo voltaje de 1.35V como estándar de GDDR5X y un
nuevo proceso tecnológico, resultaron en el mismo consumo eléctrico a un 43% mas
de frecuencia.
Ademas, el “canal” entre el die del GPU y el die de la memoria tuvieron que ser
diseñados con una gran atención al detalle. la velocidad de operación de la interfaces
es determinada solamente por la velocidad de la señal mas débil del bus. Cada señal
entre el GPU y el die de memoria fue cuidadosamente estudiada junto con el camino
completo fuera del GPU, a través del empaque, hacia la placa y sobre el die de la
memoria, con atención a la perdida de canal, crosstalk y discontinuidades que
pudieran degradar la señal.
En total, las mejoras de circuito y canal descritas anteriormente no solamente
permiten que GDDR5X funcione a 10Gbps, si no que también proveen beneficios que
serán útiles para otros productos que utilicen memorias GDDR5X.
Las siguientes imágenes muestran algunos elementos de diseño, incluyendo el
diseño IO del circuito, un modelo extraído de un camino de una señal, en amarillo,
desde el GPU (arriba a la izquierda) hacia los pads de DRAM (abajo a la derecha) en
el nuevo diseño de la placa de la GeForce GTX 1080.
21
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
Computo Asincronico
Actualmente, las cargas de trabajo en la jugabilidad son incrementalmente
complejas, con múltiples-independientes, cargas de trabajo asincronicas, que,
finalmente, trabajan en conjunto para contribuir a la imagen renderizada. Algunos
ejemplos de computo asincronico son:
Procesamiento de audio y físicas basadas en GPU
Postprocesado de cuadros renderizados
Timewarp asincrónico, una técnica usada en VR para regenerar un frame final
basado en la posición de la cabeza justo antes de el scanout de la pantalla,
interrumpiendo el renderizado del siguiente cuadro para hacerlo.
Estas cargas de trabajo asincronicas crean dos nuevos escenarios a considerar
en una arquitectura de GPU.
El primer escenario involucra sobreponer cargas. Ciertos tipos de cargas no
llenan el GPU completamente por si mismas. En estos casos, hay una oportunidad de
rendimiento para correr dos trabajos al mismo tiempo, compartiendo el GPU y
haciendo que funcione mas eficientemente: por ejemplo, una carga de PhysX
corriendo al mismo tiempo con un renderizado gráfico.
Para cargas de trabajo sobrepuestas, Pascal introduce el soporte para
“dynamic load balancing” o “balanceo de carga dinámico”. En Maxwell, las cargas de
trabajo fueron implementadas con un particionado estático del GPU en un subset que
corría gráficas y otro subset que corría computo. Esto es eficiente dado que el balance
de trabajo entre dos cargas sean parecidas al ratio de particion. Sin embargo, si el
computo toma mas que el flujo de carga gráfico, y ambos necesitan ser completados
antes de que otro trabajo pueda ser efectuado y la porción de GPU configurada para
correr gráficas se vaya a reposo. Esto puede causar desempeño reducido que puede
exceder cualquier beneficio de desempeño que pueda haber sido entregado por correr
cargas de trabajo sobrepuestas. El balanceo dinámico de carga por hardware
soluciona este problema al permitir que las cargas de trabajo sean llenadas en el resto
de la maquina si recursos en reposo están disponibles.
21
Arquitectura de Computadoras II
mover las cargas menos criticas fuera del GPU para que se muevan cargas mas
criticas y que puedan ser ejecutadas lo mas rápido posible.
Un solo comando de renderizado de un motor gráfico puede contener
potencialmente cientos de llamadas de dibujo, con cada llamada de dibujo
conteniendo cientos de triángulos, y cada triangulo conteniendo cientos de pixeles que
necesitan ser sombreados y renderizados. Una implementación tradicional de GPU
que implementa anticipación a un alto nivel en el flujo gráfico tendría que completar
todo este trabajo antes de intercambiar tareas, resultando en un potencial retraso
bastante largo.
Para solucionar este problema, Pascal es la primera arquitectura de GPU en
implementar Preempción (Anticipación) de nivel de Pixel. Las unidades gráficas de
Pascal han sido mejoradas para mantenerse al tanto del progreso intermedio de
trabajos de renderizado, para que cuando la anticipación sea solicitada, esas puedan
detenerse donde están, guardar la información de contexto a cerca de donde
comenzar nuevamente después y anticipar rápidamente. La ilustración siguiente
muestra como una petición de anticipación siendo ejecutada.
21
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
21
Arquitectura de Computadoras II
Comenzando con las GPUs de NVIDIA Pascal, las dos interfaces ahora se
encuentran vinculadas para mejorar el ancho de banda entre GPUs. Este nuevo modo
dual-link SLI permite que ambas interfaces SLI puedan ser utilizadas en tándem para
alimentar una pantalla de alta resolución o múltiples pantallas en Surround.
El modo Dual-Link SLI esta soportado con un nuevo puente SLI llamado SLI
HB. Este puente facilita la transferencia de datos de alta velocidad entre GPUs,
conectando ambas interfaces SLI. Esta es la mejor forma para lograr frecuencias
completas SLI con las GPUs GeForce GTX 1080 corriendo en SLI. (Nota: la GeForce
GTX 1080 es compatible con los puentes SLI anteriores, sin embargo, el GPU estará
limitado a la máxima velocidad del puente que se utilice.
Utilizando estos nuevos puentes SLI HB, la interfaz SLI de la GeForce GTX
1080 corre a 650MHz, comparada con los 400MHz que se encuentran en las GPUs
GeForce anteriores que ocupan los antiguos puentes SLI. Sin embargo, los puentes
antiguos funcionarán algo mas rápido cuando se utilicen con GPUs basadas en
Pascal. Específicamente, puentes personalizados que incluyan iluminación LED ahora
funcionaran a 650MHz cuando sean utilizados con una GTX 1080, tomando ventaja de
la velocidad IO de Pascal.
21
Arquitectura de Computadoras II
Tiempos de Cuadros por segundo con una GeForce GTX 1080 corriendo
Shadow of Mordor a 11520×2160 con el nuevo puente SLI HB (en azul) vs el viejo
puente SLI (en negro). Los peaks mas largos del puente viejo indican stuttering.
Nuevos modos Multi GPU
Comparado con APIs anteriores de DirectX, Microsoft ha hecho un gran
numero de cambios que tienen impacto en la funcionalidad de Multi-GPU en DirectX
12. En el nivel mas alto, hay dos opciones básicas para que los desarrolladores
utilicen multiGPU en hardware NVIDIA con DX12:
Multi Display Adapter (MDA)
Linked Display Adapter (LDA)
22
Arquitectura de Computadoras II
El modo LDA tiene dos formas: Implicit LDA Mode, el cual NVIDIA utiliza para
el SLI, y Explicit LDA Mode, donde los desarrolladores de juegos manejaran la
responsabilidad necesaria para que la operación de multiGPU funcione exitosamente.
Los modos MDA y LDA han sido desarrollados para entregarle mas control a los
desarrolladores mas control.
La siguiente tabla resume los tres modos soportados en GPUs NVIDIA:
En modo LDA, cada memoria de los GPUs puede ser vinculada completamente
para ser un gran banco de memoria para el desarrollador (aun que hay algunas
excepciones); sin embargo, hay una penalización de desempeño si la información
necesita ser ubicada en la memoria de otro GPU, dado que la memoria se accede a
través del interior del GPU en comunicación peer-to-peer (como PCIe). En el modo
MDA, cada memoria de cada GPU es utilizada independientemente: cada GPU no
puede acceder directamente a la memoria del otro.
El modo LDA es destinado para el uso de multo-GPU en sistemas que tienen
GPUs similares a si mismas, mientras que el modo MDA tiene menos restricciones –
GPUs discretas pueden ser pareadas con GPUs integradas, o GPUs discretas de
otros fabricantes- pero el modo MDA requiere que el desarrollador tenga mucho mas
cuidado al manejar todas las operaciones necesarias para que los GPUs se
comuniquen entre si.
Por defecto el SLI de GeForce GTX 1080 soporta hasta dos GPUs. Los
Modos 3-Way y 4-Way SLI ya no serán recomendados. Como los juegos han
evolucionado, se ha convertido en algo bastante difícil que estos modos SLI entreguen
un desempeño beneficial de escalado para los usuarios. Por ejemplo, muchos juegos
se quedaban cortos de CPU al generarse un cuello de botella cuando se corrían en los
modos 3-Way o 4-Way SLI, y los juegos están constantemente utilizando técnicas que
hacen muy difícil la extracción de paralelismo cuadro-a-cuadro. Ahora, los sistemas
aun pueden ser construidos con modos Multi-GPU por software incluyendo:
MDA o LDA Explicit
2-Way SLI + un GPU para PhysX.
Llave entusiasta
Si bien NVIDIA no recomienda los modos 3-Way o 4-Way SLI, todos sabemos
que los entusiastas no se quedaran tranquilos… de hecho, algunos juegos seguirán
entregando gran escalabilidad mas allá de dos GPUs. Para esta clase de usuarios, se
ha desarrollado una “Llave Entusiasta” o “Enthusiast Key” la cual puede ser
22
Arquitectura de Computadoras II
descargada desde la pagina de NVIDIA y ser cargado para cada GPU. El proceso
involucra:
1. Correr la app localmente para generar la firma de tu GPU
2. Pedir la Enthusiast Key en el sitio web de entusiastas de NVIDIA
3. Bajar la llave
4. Instalar la llave para desbloquear la función 3-Way y 4-Way SLI.
Los detalles de este proceso estarán disponibles eventualmente en el sitio web
de NVIDIA cuando los GPUs GTX 1080 esten en las manos de los usuarios.
Fast Sync
Fast Sync es una alternativa, consciente a la latencia, al Vertical Sync o V-
SYNC, que elimina el tearing, mientras permite al GPU renderizar sin restricciones
de refresco para reducir latencia.
Cuadros Renderizados – Metodo tradicional
Esta es un gráfico básico de como la renderización de cuadros funciona en
un pipeline de gráficas NVIDIA:
El motor del juego es el responsable de generar los cuadros que son enviados
a DirectX. El motor del juego también calcula el tiempo de animación; la codificación
del cuadro que eventualmente se renderizará. Las llamadas de dibujo e información
son comunicadas, el driver de NVIDIA y el GPU las convierten en renderizado, y luego
se escupe el cuadro renderizado al frame buffer del GPU. El ultimo paso es escanear
el cuadro a la pantalla. Ahora, estamos haciendo las cosas algo diferentes en Pascal.
Juegos de altos FPS (Frames-Per-Second)
Juegos de altos FPS, como Counter-Strike: Global Offensive, se corren a
muchos cuadros por segundo el día de hoy en Pascal. La pregunta es: ¿que de bueno
es esto?. El día de hoy, hay dos opciones para mostrar el juego: con V-SYNC ON o
con V-SYNC OFF.
22
Arquitectura de Computadoras II
Backpressu
Control de Flujo Ninguno Ninguno
re
La experiencia que FAST SYNC entrega, dependiendo del frame rate, es casi
igual a la claridad del V-SYNC on combinado con la baja latencia de V-SYNC OFF.
22
Arquitectura de Computadoras II
Buffers Desacoplados
Una forma para pensar sobre Fast Sync es imaginar que tres áreas en el
mismo frame buffer han sido ubicadas en tres formas diferentes. Los dos buffers
primarios son bastante similares a un VSYNC de doble buffer en las pipelines clásicas
de GPU. El Buffer Frontal (FB) es el buffer escaneado hacia la pantalla. Esta es una
superficie completamente renderizada. El Buffer Trasero, es el que actualmente se
está renderizando y no puede ser escaneado hasta que se complete. Usando el
VSYNC tradicional en juegos de alto renderizado, no es bueno para la latencia, dado
que el juego debe esperar al intervalo de refresco para dar vuelta el buffer trasero para
que se convierta en buffer frontal antes de que otro cuadro pueda ser renderizado en
el buffer trasero. Esto ralentiza todo el proceso y agregar buffers traseros solo agrega
mas latencia, dado que estos podrían llenarse rápidamente por el renderizado de alta
demanda, causando pausas en el motor del juego. Fast Sync introduce un tercer buffer
llamado Ultimo Buffer de Renderizado (Last Rendered Buffer o LRB) el cual se utiliza
para mantener todos los nuevos cuadros renderizados que se completaron en el Buffer
Trasero – en efecto, haber tenido copia mas reciente del buffer trasero – hasta que el
buffer delantero haya terminado de escanearse, al punto de que el Ultimo Buffer
Renderizado es copiado al buffer frontal y el proceso continua. Las copias actuales del
buffer serian ineficientes, así que los buffers son solo renombrados. El buffer que se
esta escaneando a la pantalla es el FB, el buffer que se esta renderizando activamente
es el BB y el buffer almacenando la copia mas reciente es el LRB. La nueva lógica de
cambios en la arquitectura Pascal controla el proceso completo. El proceso típico se
vería de la siguiente forma:
Escanear de FB
Renderizar a BB
Cuando el renderizado se completa
o BB se convierte en LRB
o LRB se convierte en BB y el renderizado continua
Cuando el renderizado se completa
o BB se convierte en LRB
o LRB se convierte en BB y el renderizado continua
Cuando el renderizado se completa
o BB se convierte en LRB
o LRB se convierte en BB y el renderizado continua
22
Arquitectura de Computadoras II
HDR
Los nuevos monitores HDR (High Dynamic Range) proveen uno de las grandes
ventajas en la calidad de pixeles en monitores en los últimos 20 años. El gamut de
color BT.2020 cubre hasta el 75% de los colores visibles (hasta un 33% para sRGB) –
un aumento de dos veces en el rango de colores. En adición, se estima que los
monitores HDR entreguen un peak de brillo mas alto (con paneles LCD sobre los 1000
nits) y una gran relación de contraste (>10:000 a 1).
Con un mayor rango de brillo y colores mas saturados, el contenido HDR imita
de forma mas cercana el mundo real: negros mas intensos, y blancos mas brillantes.
Variaciones adicionales en el color producen imágenes mas vivas que resaltan: los
usuarios finalmente ven el rojo y naranjo en el fuego o una explosión, en vez de verse
todo mezclado. Y por que los monitores HDR soportan relaciones de contraste mas
altas, los usuarios verán mas detalles en las áreas de escenas claras y oscuras
cuando se le compara al SDR que viene en los monitores actuales.
22
Arquitectura de Computadoras II
La GeForce GTX 1080 soporta todas las capacidades HDR que tenia Maxwell.
El controlador de pantalla es capaz de color 12b, color gamut BT.2020 amplio, SMPTE
2084 (Perceptual Quantization), y HDMI 2.0b 10/12b para 4K HDR. En adición, Pascal
introduce nuevas características como:
– 4K@60 10/12b HEVC Decode (para HDR Video)
– 4K@60 10b HEVC Encode (para grabacion HDR o streaming)
– DP1.4-Ready HDR Metadata Transport (para conectar monitores HDR utilizando
DisplayPort)
22
Arquitectura de Computadoras II
NVIDIA está trabajando con los desarrolladores de juegos para traer HDR a los
juegos de PC. NVIDIA le entregará a los desarrolladores APIs y soporte de drivers así
como también las guías necesarias para renderizar adecuadamente imágenes HDR
que sean compatibles con los nuevos monitores HDR. Como un resultado de este
esfuerzo, se vienen próximamente juegos que soportan HDR como Obduction,
The Witness, Lawbreakers, Rise of the Tomb Raider, Paragon, The Talos Principle
y Shadow Warrior 2.
https://www.ozeros.com/2016/05/analisis-a-fondo-arquitectura-gpu-nvidia-pascal-
disenada-para-la-velocidad/
22
Arquitectura de Computadoras II
El paralelismo
https://arquitecturadecomputadora.wordpress.com/2013/06/07/computacion-paralela/
22
Arquitectura de Computadoras II
22