aboutsummaryrefslogtreecommitdiff
path: root/aoc
diff options
context:
space:
mode:
Diffstat (limited to 'aoc')
-rw-r--r--aoc/n.lyx29
-rw-r--r--aoc/n3.lyx316
2 files changed, 328 insertions, 17 deletions
diff --git a/aoc/n.lyx b/aoc/n.lyx
index 2bbdd60..4e6a417 100644
--- a/aoc/n.lyx
+++ b/aoc/n.lyx
@@ -178,7 +178,7 @@ Release consistency
\emph default
,
\emph on
-Hypergraph
+Load-link/store-conditional, Hypergraph
\emph default
.
\end_layout
@@ -203,6 +203,33 @@ ACM SIGARCH Computer Architecture News
234-243.
\end_layout
+\begin_layout Itemize
+
+\lang english
+MIPS Technologies Inc
+\lang spanish
+.
+ (2008).
+
+\emph on
+\lang english
+MIPS32® Instruction Set Quick Reference
+\emph default
+\lang spanish
+ (
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+https://www.cs.duke.edu/courses/fall13/compsci250/MIPS32_QRC.pdf
+\end_layout
+
+\end_inset
+
+).
+\end_layout
+
\begin_layout Chapter
Introducción
\end_layout
diff --git a/aoc/n3.lyx b/aoc/n3.lyx
index 8cd556f..b76f960 100644
--- a/aoc/n3.lyx
+++ b/aoc/n3.lyx
@@ -1292,8 +1292,7 @@ Este es el modelo usado por C, C++ y Java,
status open
\begin_layout Plain Layout
-C, C++ y Rust usan el mismo modelo, que también incluye consistencia débil,
- aunque esta se puede implementar a través de consistencia de liberación.
+C, C++ y Rust usan el mismo modelo, que también incluye consistencia débil.
\end_layout
\end_inset
@@ -1304,7 +1303,7 @@ C, C++ y Rust usan el mismo modelo, que también incluye consistencia débil,
\end_deeper
\begin_layout Standard
Los accesos a memoria marcados especialmente se suelen traducir en ensamblador
- como
+ como barreras de memoria o
\emph on
\lang english
memory fences
@@ -1328,6 +1327,295 @@ fences
\end_layout
\begin_layout Section
+Semáforos
+\end_layout
+
+\begin_layout Standard
+La comunicación y compartición de recursos entre procesos requiere de mecanismos
+ de sincronización, como son:
+\end_layout
+
+\begin_layout Itemize
+Semáforos o cerrojos para la exclusión mutua.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Señales
+\series default
+ para la sincronización punto a punto, en que uno o más hilos esperan a
+ que otro envíe una señal.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Barreras
+\series default
+ para sincronización global, que impiden que los hilos sigan avanzando hasta
+ que todos lleguen a cierto punto de su ejecución.
+\end_layout
+
+\begin_layout Standard
+Las implementaciones de exclusión mutua constan de:
+\end_layout
+
+\begin_layout Enumerate
+Un
+\series bold
+método de adquisición
+\series default
+ para obtener el cerrojo, con poca latencia si no hay más hilos intentando
+ sincronizarse.
+\end_layout
+
+\begin_layout Enumerate
+Un
+\series bold
+algoritmo de espera
+\series default
+ para esperar a que el cerrojo esté disponible cuando no lo esté, y que
+ consuma poco ancho de banda de la red de interconexión.
+\end_layout
+
+\begin_layout Enumerate
+Un
+\series bold
+método de liberación
+\series default
+ para notificar que el cerrojo está disponible, que sea suficientemente
+ imparcial y no provoque inanición.
+\end_layout
+
+\begin_layout Standard
+Es importante que el protocolo sea escalable y requiera poca información
+ para funcionar.
+ Estos protocolos se pueden implementar con consistencia secuencial, pero
+ el resultado es complicado e ineficiente, por lo que es más común ampliar
+ el ISA con instrucciones atómicas de sincronización, que actúan como barreras.
+ Algunas son:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+\emph on
+Test&set
+\series default
+\emph default
+: Carga una posición de memoria en un registro y establece dicha posición
+ a 1.
+ Un cerrojo implementado como un booleano que está a 1 cuando el cerrojo
+ está bloqueado se bloquearía con
+\family typewriter
+lock: t&s t0, MUTEX; bnez t0, lock
+\family default
+ y se desbloquearía con
+\family typewriter
+sw r0, LOCK
+\family default
+.
+ Cuando el cerrojo está ocupado, esto genera invalidaciones continuas, por
+ lo que es preferible usar
+\emph on
+\lang english
+test&test&set
+\emph default
+\lang spanish
+, comprobando con una carga normal si el cerrojo está disponible antes de
+ obtenerlo:
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+lock: lw t0, MUTEX
+\end_layout
+
+\begin_layout Plain Layout
+
+ bnez t0, lock
+\end_layout
+
+\begin_layout Plain Layout
+
+ t&s t0, MUTEX
+\end_layout
+
+\begin_layout Plain Layout
+
+ bnz t0, lock
+\end_layout
+
+\end_inset
+
+Esto aumenta algo la latencia pero reduce el tráfico entre cachés y es más
+ escalable.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+\emph on
+\lang english
+Swap
+\series default
+\emph default
+\lang spanish
+: Intercambia los valores de un registro y una posición de memoria.
+ Se puede usar como
+\family typewriter
+t&s
+\family default
+ estableciendo el registro a 1.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+\emph on
+\lang english
+Fetch&op
+\series default
+\emph default
+\lang spanish
+: Lee una posición de memoria un registro y escribe en memoria el valor
+ obtenido al aplicar una cierta operación.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+\emph on
+\lang english
+Compare&swap
+\series default
+\emph default
+\lang spanish
+: Compara el valor en una posición de memoria con el de un registro y, si
+ coinciden, intercambia el contenido de la posición con el de otro registro.
+\end_layout
+
+\begin_layout Standard
+Estas instrucciones son difíciles de implementar y lentas, y una alternativa
+ es el par
+\lang english
+LL
+\lang spanish
+/
+\lang english
+SC
+\lang spanish
+, formado por las instrucciones:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+\emph on
+\lang english
+Load Linked
+\series default
+\emph default
+\lang spanish
+ (
+\lang english
+LL
+\lang spanish
+): Lee una posición de memoria en un registro.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+\emph on
+\lang english
+Store Conditional
+\series default
+\emph default
+\lang spanish
+ (
+\lang english
+SC
+\lang spanish
+): Si, en el bloque (normalmente de caché) de la posición de memoria indicada,
+ nadie ha escrito desde el último
+\lang english
+LL
+\lang spanish
+, escribe el valor del registro en la posición.
+ Si alguien ha escrito antes, la instrucción falla; ni escribe ni hay invalidaci
+ones.
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+En la práctica esto puede ocurrir cuando hay una interrupción, cambio de
+ contexto, otro LL, una escritura a otro bloque, etc.
+\end_layout
+
+\end_inset
+
+ También establece algún registro para indicar si la instrucción tuvo éxito.
+\end_layout
+
+\begin_layout Standard
+Se ha de ejecutar el mínimo de operaciones posible entre
+\lang english
+LL
+\lang spanish
+ y
+\lang english
+SC
+\lang spanish
+ para favorecer que
+\lang english
+SC
+\lang spanish
+ tenga éxito.
+ Un cerrojo se bloquearía con
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+ li t1, 1
+\end_layout
+
+\begin_layout Plain Layout
+
+lock: ll t0, MUTEX
+\end_layout
+
+\begin_layout Plain Layout
+
+ bnez t0, lock
+\end_layout
+
+\begin_layout Plain Layout
+
+ sc t1, MUTEX
+\end_layout
+
+\begin_layout Plain Layout
+
+ beqz t1, lock
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Esta implementación tiene buen rendimiento, pues la espera activa no genera
+ tráfico ni invalidaciones, pero no es imparcial.
+\end_layout
+
+\begin_layout Section
Redes de interconexión
\end_layout
@@ -1390,12 +1678,15 @@ routers
\begin_layout Standard
La longitud de un cable determina la frecuencia a la que se puede operar
y la potencia que puede haber que disipar.
- Queremos una red con alto ancho de banda (frecuencia por número de hilos)
- y baja latencia, que sea simple (lo que suele llevar a mejor rendimiento),
- fiable (que no produzca fallos y soporte un número limitado de ellos) y
- con bajo coste económico y energético, y queremos estructurarla de forma
- escalable (que el ancho de banda aumente conforme lo haga el número de
- nodos) y fácilmente particionable (que se pueda dividir en subsistemas).
+ Interesa una red con alto ancho de banda (frecuencia por número de hilos)
+ y baja latencia, simple (lo que suele llevar a mejor rendimiento), fiable
+ (que no produzca fallos y soporte un número limitado de ellos) y con bajo
+ coste económico y energético.
+ Además, queremos estructurarla de forma escalable (que el ancho de banda
+ aumente conforme lo haga el número de nodos) y fácilmente particionable
+ (que se pueda dividir en subsistemas), pues al aumentar el número de núcleos,
+ una mala red de interconexión puede consumir buena parte de la energía
+ y dar lugar a cuellos de botella.
\end_layout
\begin_layout Subsection
@@ -1929,13 +2220,6 @@ edge-cube routing
.
\end_layout
-\begin_layout Standard
-\begin_inset Newpage pagebreak
-\end_inset
-
-
-\end_layout
-
\begin_layout Section
Estrategia de conmutación
\end_layout