aboutsummaryrefslogtreecommitdiff
path: root/aoc
diff options
context:
space:
mode:
authorJuan Marín Noguera <juan.marinn@um.es>2020-12-31 13:57:02 +0100
committerJuan Marín Noguera <juan.marinn@um.es>2020-12-31 13:57:02 +0100
commitf3fe382159ae9018ac71bdc3f62e11f84cc11c00 (patch)
tree2eee98bd46a786ddea16fe17e3e5285f34b222e2 /aoc
parenta2537e87de51bbcd2c46c649b18dfd98e6fbb54b (diff)
AOC tema 2
Diffstat (limited to 'aoc')
-rw-r--r--aoc/n2.lyx486
1 files changed, 481 insertions, 5 deletions
diff --git a/aoc/n2.lyx b/aoc/n2.lyx
index 53ee52f..281d772 100644
--- a/aoc/n2.lyx
+++ b/aoc/n2.lyx
@@ -111,7 +111,49 @@ Very Long Instruction Word
\lang spanish
): En cada ciclo se carga una
\series bold
-macro-instrucción
+ma
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+\series bold
+
+\backslash
+-
+\end_layout
+
+\end_inset
+
+cro-ins
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+\series bold
+
+\backslash
+-
+\end_layout
+
+\end_inset
+
+truc
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+\series bold
+
+\backslash
+-
+\end_layout
+
+\end_inset
+
+ción
\series default
, formada por varias instrucciones independientes agrupadas por el compilador.
El
@@ -150,15 +192,28 @@ dinámica
a cambio de necesitar más recursos.
Con planificación dinámica, la ejecución es fuera de orden, y la terminación
puede ser en orden o fuera de orden.
- La predicción de saltos es
+\end_layout
+
+\begin_layout Standard
+Si la ejecución es fuera de orden, distintas instrucciones pueden producir
+ excepciones a la vez, puede pasar bastante tiempo desde que se produce
+ una excepción hasta que se reconoce y una instrucción puede producir una
+ excepción después de que una instrucción posterior se haya ejecutado.
+ Las excepciones son
\series bold
-estática
+precisas
\series default
- si siempre predice el mismo resultado para el mismo salto o
+ si, cuando se reconocen, el contador del programa apunta a una instrucción,
+ dicha instrucción provocó la excepción si esta es generada por el procesador,
+ las instrucciones anteriores se han completado y las posteriores no han
+ modificado el estado visible del procesador, y son
\series bold
-dinámica
+imprecisas
\series default
en otro caso.
+ Hoy en día las excepciones imprecisas son inviables, y la mayoría de procesador
+es implementan excepciones precisas impidiendo que una instrucción cambie
+ el estado si hay instrucciones previas sin terminar.
\end_layout
\begin_layout Standard
@@ -477,5 +532,426 @@ buffer
de almacenamiento, y finalmente borra la entrada del ROB.
\end_layout
+\begin_layout Standard
+Esto se puede combinar con ejecución especulativa, normalmente para instruccione
+s de salto y de memoria, ejecutando las instrucciones especuladas pero solo
+ confirmando los resultados si la predicción fue correcta.
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Se sabe que esto puede permitir ataques
+\emph on
+\lang english
+side-channel
+\emph default
+\lang spanish
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Ejecución especulativa
+\end_layout
+
+\begin_layout Standard
+La predicción de saltos es
+\series bold
+estática
+\series default
+ si siempre predice el mismo resultado para el mismo salto o
+\series bold
+dinámica
+\series default
+ en otro caso.
+ Algunos mecanismos de predicción de saltos dinámicos son la predicción
+ básica de
+\begin_inset Formula $n$
+\end_inset
+
+ bits, la de predicción con correlación y la predicción híbrida o de contienda.
+ También se suele usar un
+\series bold
+\emph on
+\lang english
+buffer
+\emph default
+\lang spanish
+ de destino de saltos
+\series default
+ (
+\series bold
+BTB
+\series default
+,
+\emph on
+\lang english
+Branch Target Predictor
+\emph default
+\lang spanish
+), que almacena la dirección de destino de saltos previos para poder cargar
+ las instrucciones de dichas direcciones directamente.
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Se sabe que esto puede permitir ataques
+\emph on
+\lang english
+side-channel
+\emph default
+\lang spanish
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Si la longitud del
+\emph on
+\lang english
+pipeline
+\emph default
+\lang spanish
+ del procesador aumenta, la penalización por fallo de predicción de saltos
+ aumenta al tardar más ciclos en detectar un fallo de predicción, y si el
+ ancho del procesador aumenta, llegan más instrucciones de salto por ciclo
+ (hay una medida de un salto por cada 8 instrucciones) y una mala predicción
+ afectará a más instrucciones.
+ Por ello, si la predicción de saltos es mala, el rendimiento se ve muy
+ afectado.
+\end_layout
+
+\begin_layout Standard
+Para reducir la latencia de memoria se pueden reordenar las instrucciones
+ que acceden a memoria.
+ Si una carga produce un fallo de caché, se pueden ejecutar cargas posteriores,
+ pero en principio, en cualquier caso, no se puede ejecutar una carga hasta
+ que se haya calculado la dirección de todos los almacenamientos anteriores
+ y ninguno de los que están pendientes de confirmar tiene la misma dirección
+ que la carga.
+\end_layout
+
+\begin_layout Standard
+Para mitigar los riesgos de datos, se suele permitir la ejecución especulativa
+ de las cargas aunque no se haya calculado la dirección de los almacenamientos
+ anteriores.
+ Cuando se sabe la dirección de un almacenamiento, se compara con las direccione
+s de las cargas posteriores y, si hay coincidencia, se descartan los resultados
+ de la carga y las instrucciones posteriores.
+\end_layout
+
+\begin_layout Section
+Procesamiento multihilo
+\end_layout
+
+\begin_layout Standard
+Aprovechar al máximo las unidades funcionales de un núcleo con un solo hilo
+ es difícil, por lo que se usa el
+\series bold
+paralelismo a nivel de hilo
+\series default
+ (
+\series bold
+TLP
+\series default
+,
+\emph on
+\lang english
+Thread-Level Parallelism
+\emph default
+\lang spanish
+) y se permite ejecutar varios hilos en el mismo núcleo.
+\end_layout
+
+\begin_layout Standard
+Tradicionalmente se reparten los ciclos entre los hilos según una
+\series bold
+política de ejecución
+\series default
+:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Entrelazado fijo
+\series default
+: Cada hilo toma un ciclo y ejecuta una instrucción, por turnos.
+ Si un hilo no está listo, se pone una
+\series bold
+burbuja
+\series default
+ en el cauce, un ciclo en que no se hace nada.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Entrelazado controlado por el sistema operativo
+\series default
+: El sistema asigna una cantidad de
+\emph on
+\lang english
+slots
+\emph default
+\lang spanish
+, mayor al número de hilos, y los reparte entre los hilos disponibles en
+ cada momento.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+Entrelazado controlado por
+\emph on
+\lang english
+hardware
+\series default
+\emph default
+\lang spanish
+: El
+\emph on
+\lang english
+hardware
+\emph default
+\lang spanish
+ mantiene una lista de los hilos en ejecución y elige el siguiente hilo
+ a ejecutan según un esquema de prioridades.
+\end_layout
+
+\begin_layout Standard
+El
+\series bold
+multihilo simultáneo
+\series default
+ (
+\series bold
+SMT
+\series default
+,
+\series bold
+\emph on
+\lang english
+Simultaneous Multi-Threading
+\series default
+\emph default
+\lang spanish
+) permite ejecutar varios hilos en el mismo ciclo, usando uno los recursos
+ que no usa el otro, especialmente unidades funcionales.
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Se sabe que esto puede permitir ataques
+\emph on
+\lang english
+side-channel
+\emph default
+\lang spanish
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+El sistema operativo debe manejar más hilos, y hay más conflictos de caché
+ y TLB salvo que se aumente el tamaño.
+ Cada hilo necesita sus propios registros, tanto de propósito general como
+ el contador de programa, el registro para la tabla de páginas y los de
+ manejo de excepciones, por lo que se debe propagar el identificador de
+ hilo por todo el cauce para saber qué registros usar.
+ Se replican las tablas de renombrado de registros, pero se comparten el
+ ROB, las cachés y las tablas de predicción de saltos.
+\end_layout
+
+\begin_layout Standard
+El SMT se puede adaptar para que cuando hay alto TLP el ancho de emisión
+ se comparta entre los hilos y cuando hay poco no se reparta y se dedique
+ al ILP.
+\end_layout
+
+\begin_layout Section
+Vectorización
+\end_layout
+
+\begin_layout Standard
+Las aplicaciones multimedia, como de realidad virtual, comunicaciones, procesami
+ento de imágenes, reconocimiento de voz, etc., así como la compresión y el
+ cifrado, requieren cálculo intensivo, a menudo con restricciones de tiempo
+ real, y es común que apliquen la misma operación a todos los elementos
+ de una lista.
+\end_layout
+
+\begin_layout Standard
+Los procesadores de propósito general no están optimizados para estas aplicacion
+es, por lo que surgen las
+\series bold
+extensiones multimedia
+\series default
+ con instrucciones SIMD para explotar el paralelismo de datos con el coste
+ mínimo de recursos del chip.
+ En la arquitectura IA-32 de Intel y AMD, se crean:
+\end_layout
+
+\begin_layout Enumerate
+
+\series bold
+MMX
+\series default
+ (
+\emph on
+Multi-Media Extensions
+\emph default
+): Operaciones con 8 enteros de 8 bits o 4 de 16 bits.
+\end_layout
+
+\begin_layout Enumerate
+
+\series bold
+SSE
+\series default
+ (
+\emph on
+Streaming SIMD Extensions
+\emph default
+), SSE2 y SSE4.2: 16 enteros de 8 bits, 8 de 16 bits, 4 de 32 bits, 4 números
+ de punto flotante de 32 bits o 2 de 64 bits.
+\end_layout
+
+\begin_layout Enumerate
+
+\series bold
+AVX
+\series default
+ (
+\emph on
+Advanced Vector Extensions
+\emph default
+) y
+\series bold
+AVX2
+\series default
+: 4 números enteros o de punto flotante de 64 bits.
+\end_layout
+
+\begin_layout Enumerate
+
+\series bold
+AVX-512
+\series default
+: 8 números enteros o de punto flotante de 64 bits.
+\end_layout
+
+\begin_layout Standard
+Intel también crea
+\series bold
+IMCI
+\series default
+ (
+\emph on
+Intel Many-Core Instructions
+\emph default
+) para la primera generación de Intel Xeon
+\lang english
+Phi
+\lang spanish
+, con registros de 512 bits.
+ En cualquier caso, los operandos deben estar en posiciones de memoria consecuti
+vas y alineadas al tamaño del registro.
+\end_layout
+
+\begin_layout Standard
+Esto es como lo que hacen los procesadores vectoriales en las GPUs, aunque
+ en general con modos de direccionamiento más sofisticados e instrucciones
+ para mover datos de una parte del registro a otra.
+ Muchas extensiones SIMD soportan instrucciones como
+\family typewriter
+FMA
+\family default
+ (
+\emph on
+\lang english
+Fused Multiply-Add
+\emph default
+\lang spanish
+), que multiplica dos registros y suma otro al resultado elemento a elemento.
+\end_layout
+
+\begin_layout Standard
+Los compiladores suelen intentar usar instrucciones SIMD para los bucles
+ más internos del programa, pero el programador debe elegir el compilador
+ y las opciones adecuados, reordenar el código para hacer más visible lo
+ que ocurre y, si es necesario, usar
+\emph on
+\lang english
+intrinsics
+\emph default
+\lang spanish
+, funciones que el compilador trata de forma especial, o escribir en ensamblador.
+\end_layout
+
+\begin_layout Standard
+
+\series bold
+Vectorizar
+\series default
+ es convertir bucles con instrucciones escalares para que usen instrucciones
+ SIMD, y lo suele hacer el compilador tras asegurarse de que esto no modifica
+ los resultados del cálculo, viendo si una iteración accede a los datos
+ producidos en iteraciones previas.
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Cuando hay un registro de acumulación, por ejemplo al sumar una lista de
+ números, este se suele convertir a un registro vectorial con varios acumuladore
+s a los que luego se les aplica una reducción.
+ Esto no se puede hacer en punto flotante porque las operaciones de punto
+ flotante no son conmutativas ni asociativas, pero muchos compiladores tienen
+ opciones para no respetar el estándar en este caso y tratar las operaciones
+ como conmutativas y asociativas.
+ Ejemplos son
+\family typewriter
+gcc
+\family default
+ (
+\emph on
+\lang english
+GNU C Compiler
+\emph default
+\lang spanish
+) con la orden
+\family typewriter
+-ffast-math
+\family default
+ y el software privativo
+\family typewriter
+icc
+\family default
+ (
+\emph on
+\lang english
+Intel Compiler Collection
+\emph default
+\lang spanish
+), solo para arquitecturas Intel, que nunca respeta el estándar.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
\end_body
\end_document