diff options
Diffstat (limited to 'aoc/n2.lyx')
| -rw-r--r-- | aoc/n2.lyx | 486 |
1 files changed, 481 insertions, 5 deletions
@@ -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 |
