Procesadores paralelos y multinúcleo

Aprende por qué los procesadores adoptaron el paralelismo y cómo los sistemas informáticos actuales reparten el trabajo entre muchas unidades a la vez. Compara el paralelismo a nivel de instrucciones, datos, hilos y solicitudes, clasifica máquinas con la taxonomía de Flynn y calcula los límites de la aceleración con las leyes de Amdahl y Gustafson y el modelo de techo de rendimiento. Descubre cómo las instrucciones SIMD y vectoriales, las GPU, los chips multinúcleo con cachés coherentes, los clústeres y los sistemas informáticos a escala de centro de datos aprovechan el hardware paralelo para ofrecer una capacidad de cálculo más rápida o económica, con ejemplos resueltos que puedes comprobar a mano.

IntermedioUnidad 6 de 6 del curso Curso de Organización y arquitectura de computadores

Lo que aprenderás

  1. Explica por qué los procesadores adoptaron el paralelismo, distingue el paralelismo a nivel de instrucciones, datos, hilos y solicitudes, clasifica máquinas con la taxonomía de Flynn y describe cómo el multihilo por hardware mantiene ocupado un núcleo.
    • Explica por qué los sistemas informáticos adoptaron el paralelismo e identifica sus tipos
      Relaciona el muro de potencia con la transición a los chips multinúcleo y reconoce el paralelismo a nivel de instrucciones, datos, hilos y solicitudes en programas reales.
    • Clasifica el hardware paralelo con la taxonomía de Flynn
      Usa el número de flujos de instrucciones y de datos para clasificar una máquina como SISD, SIMD, MISD o MIMD, y explica el estilo de programación SPMD.
    • Mantén un núcleo ocupado mediante multihilo por hardware
      Explica cómo el multihilo de grano fino, de grano grueso y simultáneo oculta las paradas y en qué se diferencian los hilos de hardware de los núcleos adicionales.
  2. Calcula el factor de aceleración y la eficiencia, aplica las leyes de Amdahl y Gustafson, ten en cuenta el desequilibrio de carga y el sobrecoste, y usa el modelo de techo de rendimiento para determinar si el cálculo o el ancho de banda de memoria limita un programa.
    • Calcula el factor de aceleración y la eficiencia con la ley de Amdahl
      Define el factor de aceleración y la eficiencia, aplica la ley de Amdahl en ambos sentidos y explica por qué la fracción secuencial limita la aceleración de un problema de tamaño fijo.
    • Distingue la escalabilidad fuerte de la débil y ten en cuenta los sobrecostes
      Compara la aceleración con tamaño fijo y con tamaño escalado, aplica la ley de Gustafson y estima el efecto del desequilibrio de carga, la comunicación y la sincronización.
    • Determina los límites del rendimiento con el modelo de techo de rendimiento
      Calcula la intensidad aritmética, lee un gráfico del modelo de techo de rendimiento para decidir si un núcleo de cálculo está limitado por el ancho de banda de memoria o por la capacidad máxima de cálculo y elige las optimizaciones en consecuencia.
  3. Usa instrucciones SIMD y arquitecturas vectoriales para procesar arreglos, explica cómo se organiza una GPU para maximizar la productividad y escribe y analiza un núcleo de cálculo sencillo para GPU.
    • Procesa varios elementos de datos a la vez con instrucciones SIMD
      Calcula cuántos carriles tiene un registro SIMD, vectoriza bucles sencillos y reconoce las disposiciones de datos, los saltos y las dependencias que limitan la aceleración SIMD.
    • Explica cómo las arquitecturas vectoriales ejecutan bucles
      Describe los registros vectoriales, la longitud del vector, la partición de bucles en tramos, los carriles y el acceso con paso constante, usando la extensión vectorial de RISC-V como ejemplo.
    • Describe cómo se organiza una GPU para maximizar la productividad
      Explica los multiprocesadores de flujos, los grupos de hilos y la ejecución SIMT, cómo las GPU ocultan la latencia de memoria, la divergencia de saltos, la coalescencia de accesos a memoria y el coste de transferir datos, y cómo se comparan las GPU con las CPU y los aceleradores de dominio específico.
    • Escribe y analiza un núcleo de cálculo sencillo para GPU
      Usa la jerarquía de malla, bloques e hilos para asignar datos a los hilos, organiza el trabajo del sistema anfitrión y del dispositivo y sincroniza los hilos dentro de un bloque.
  4. Describe los multiprocesadores de memoria compartida y cómo los hilos dividen el trabajo, explica qué garantiza la coherencia de caché, sigue la evolución de los protocolos de espionaje de bus y de directorio, y evita la falsa compartición.
    • Describe los multiprocesadores de memoria compartida y reparte el trabajo entre núcleos
      Explica el espacio de direcciones compartido único, el acceso uniforme y no uniforme a memoria, la disposición de las cachés de un chip multinúcleo y cómo los hilos dividen y combinan el trabajo.
    • Explica el problema de la coherencia de caché y qué garantiza la coherencia
      Muestra cómo las cachés privadas pueden devolver datos desactualizados, enuncia las condiciones de un sistema de memoria coherente y distingue la coherencia de la consistencia y de un código sin condiciones de carrera.
    • Sigue la evolución de un protocolo de espionaje de bus con estados MSI y MESI
      Sigue los estados de los bloques de caché y las transacciones de bus a lo largo de una secuencia de lecturas y escrituras, y explica qué ahorra el estado exclusivo.
    • Explica los protocolos de directorio y evita la falsa compartición
      Describe cómo un directorio registra quién comparte cada bloque, estima su coste de almacenamiento y reconoce, mide y corrige la falsa compartición.
  5. Describe los clústeres con paso de mensajes y compara las redes de interconexión por ancho de banda y coste; después, explica cómo los sistemas informáticos a escala de centro de datos prestan servicios de internet teniendo en cuenta el coste, la energía y los fallos.
    • Describe los clústeres con paso de mensajes y compara las redes de interconexión
      Explica cómo cooperan mediante mensajes los nodos con memorias privadas y compara las topologías de red por ancho de banda total, ancho de banda de bisección y coste.
    • Explica cómo los sistemas informáticos a escala de centro de datos prestan servicios a gran escala
      Describe la organización de un sistema informático a escala de centro de datos y analiza su red, consumo de energía y fallos mediante cálculos sencillos.

Guía de estudio de Procesadores paralelos y multinúcleo

5 capítulos

1

Identifica y clasifica el trabajo paralelo

El hardware paralelo puede trabajar con instrucciones, elementos de arreglos, hilos o solicitudes independientes. La elección útil depende de dónde tenga un programa trabajo que pueda ejecutarse a la vez. Relaciona ese trabajo con los límites de potencia que impulsaron los chips multinúcleo y después clasifica el hardware según sus flujos de instrucciones. El multihilo por hardware añade otra forma de mantener ocupado un núcleo al encontrar instrucciones útiles durante las paradas.

1.1 Por qué los chips reparten ahora el trabajo

Los sistemas informáticos paralelos realizan operaciones al mismo tiempo. Pueden reducir la latencia, el tiempo que tarda una tarea, o aumentar la productividad, el número de tareas terminadas por segundo. Estos objetivos dan lugar a distintas formas de dividir el trabajo.

El muro de potencia

Aumentar la frecuencia de reloj hacía antes que cada generación de procesadores fuera más rápida. La potencia dinámica sigue aproximadamente P≈CV2f: capacitancia por tensión al cuadrado por frecuencia de conmutación. La tensión aparece dos veces en ese producto. Reducir tanto la tensión como la frecuencia un 15 % da 0,852×0,85=0,614125 de la potencia dinámica original, aproximadamente un 61 %.

La tensión no podía seguir bajando lo suficiente para compensar unas frecuencias de reloj más altas. Las fugas y el calor hicieron que seguir aumentando la frecuencia resultara demasiado costoso. Este muro de potencia impulsó a la industria hacia los chips multinúcleo a mediados de la década de 2000. Un chip multinúcleo coloca varios núcleos de procesador en un solo chip; un sistema multiprocesador tiene al menos dos procesadores. Los núcleos más modestos pueden realizar más trabajo total por julio, siempre que haya suficiente trabajo que repartir.

Cuatro formas de encontrar trabajo paralelo
Tipo¿Qué se ejecuta a la vez?Ejemplo
Paralelismo a nivel de instrucciones (ILP)Instrucciones de un mismo flujo de instruccionesUn cauce de segmentación solapa etapas de instrucciones sucesivas.
Paralelismo a nivel de datos (DLP)La misma operación sobre muchos elementosSumar elementos correspondientes de dos arreglos.
Paralelismo a nivel de hilos (TLP)Varias secuencias de instruccionesVarios hilos procesan distintas regiones de una imagen.
Paralelismo a nivel de solicitudesTareas independientesLos servidores responden a consultas de muchos usuarios a la vez.

El hardware y los compiladores detectan principalmente el ILP. La segmentación, la emisión múltiple y la ejecución fuera de orden solapan instrucciones y conservan los resultados requeridos por el programa. Las dependencias y los saltos limitan el solapamiento disponible.

El DLP aparece cuando muchos elementos necesitan el mismo cálculo. Las instrucciones SIMD, los procesadores vectoriales y las GPU aprovechan esta regularidad. El TLP requiere que el código, una biblioteca o un compilador dividan el trabajo en hilos. Un hilo tiene su propio contador de programa, registros y pila; los hilos de un proceso comparten su espacio de direcciones. Los procesos separados tienen espacios de direcciones separados.

El trabajo a nivel de solicitudes necesita poca cooperación entre tareas. Por tanto, añadir servidores puede aumentar la capacidad casi en proporción a los recursos añadidos. Ejecutar varios programas independientes en una computadora portátil también aprovecha núcleos que de otro modo estarían inactivos y aumenta la productividad global incluso cuando ninguno de esos programas está paralelizado internamente.

Tareas concurrentes y ejecución simultánea

Concurrencia significa que las tareas avanzan durante periodos que se solapan. Un núcleo puede hacerlo alternando entre ellas. Paralelismo significa que las operaciones se ejecutan en el mismo instante en hardware separado. Un sistema de un solo núcleo puede mantener varios programas en curso sin ejecutar sus instrucciones simultáneamente.

Un programa con un solo hilo secuencial no se divide entre ocho núcleos por el mero hecho de que existan. Los núcleos adicionales pueden ejecutar otro trabajo, pero acortar este programa requiere que tenga trabajo paralelo. Incluso después de dividir el trabajo, cualquier parte secuencial restante sigue limitando la ganancia.

Puntos clave

  • El hardware paralelo puede reducir la latencia de una tarea o aumentar la productividad total.
  • La potencia dinámica depende de la tensión al cuadrado y de la frecuencia.
  • ILP, DLP, TLP y el paralelismo a nivel de solicitudes permiten aprovechar distintos tipos de trabajo.
  • La concurrencia puede usar tiempo compartido; el paralelismo usa ejecución simultánea.

1.2 Cuenta los flujos de instrucciones y de datos

Un procesador puede contener muchas unidades aritméticas sin seguir muchos flujos de instrucciones independientes. La taxonomía de Flynn clasifica el hardware según sus flujos de instrucciones y de datos, por lo que el primer paso es elegir el nivel de la máquina que se describe.

Las cuatro clases de hardware
ClaseFlujos de instruccionesFlujos de datosSignificado
SISDUnoUnoUn procesador sigue un flujo de instrucciones normal.
SIMDUnoMúltiplesUna instrucción aplica una operación a varios elementos de datos.
MISDMúltiplesUnoDistintos flujos de instrucciones operan sobre un flujo de datos.
MIMDMúltiplesMúltiplesLos procesadores buscan instrucciones y trabajan con datos de forma independiente.

Un procesador convencional de un solo núcleo es SISD incluso cuando su cauce de segmentación solapa varias instrucciones. La emisión superescalar no crea por sí sola contadores de programa independientes ni convierte el núcleo en hardware MIMD.

Una instrucción SIMD podría sumar ocho pares de números de coma flotante de 32 bits en un registro de 256 bits. Tiene ocho carriles aritméticos, pero estos siguen una sola instrucción. Las extensiones SIMD de anchura fija incluyen x86 SSE y AVX y Arm Neon; las arquitecturas vectoriales también encajan en la clase SIMD. Los cálculos regulares sobre arreglos son adecuados porque muchos elementos necesitan la misma operación.

Los procesadores MIMD eligen sus instrucciones de forma independiente. Los chips multinúcleo, los multiprocesadores de memoria compartida y los clústeres encajan en esta clase. Los núcleos pueden ejecutar distintos programas o copias del mismo programa que alcanzan distintas ramas en momentos diferentes.

MISD completa la clasificación de dos por dos. Tiene pocos ejemplos prácticos claros. Algunos sistemas tolerantes a fallos y cauces de procesamiento se describen de esta manera, pero su clasificación depende de cómo se definan sus flujos.

Un programa aún puede tener muchos flujos de instrucciones

SPMD, un programa y múltiples datos, es un estilo de programación. Cada trabajador ejecuta una copia del mismo programa y usa su identificador para seleccionar la parte de los datos que le corresponde. Los trabajadores tienen estados de ejecución independientes, por lo que SPMD suele ejecutarse en hardware MIMD.

Para cuatro núcleos que suman 4000 valores, el núcleo con identificador i procesa los índices desde 1000i hasta 1000i+999. El núcleo 0 procesa 0–999; el núcleo 3 procesa 3000–3999. Cada uno produce una suma parcial y esas cuatro sumas se combinan. El texto compartido del programa no requiere que los cuatro núcleos emitan la misma instrucción en el mismo ciclo.

Clasifica cada nivel por separado

Considera una CPU de ocho núcleos cuyos hilos usan instrucciones AVX. Entre núcleos es MIMD: los núcleos avanzan de forma independiente. Dentro de una operación AVX es SIMD: una instrucción controla varios carriles. Contar juntas todas las unidades aritméticas ocultaría esta estructura.

Un clúster que ejecuta copias de un mismo programa científico también es hardware MIMD que usa software SPMD. Sus nodos se comunican mediante mensajes. Una GPU combina muchos grupos de hilos planificados de forma independiente con ejecución de tipo SIMD dentro de cada grupo; NVIDIA llama SIMT a su estilo de ejecución basado en hilos.

Para clasificar una descripción, pregunta quién elige la siguiente instrucción. Después pregunta si esa instrucción procesa un elemento de datos o varios. El número de archivos fuente, programas instalados o unidades aritméticas por sí solo no puede responder a esas dos preguntas.

Puntos clave

  • La taxonomía de Flynn cuenta los flujos de instrucciones y de datos.
  • La segmentación dentro de un solo flujo de instrucciones sigue siendo SISD.
  • SIMD comparte el control de instrucciones entre carriles; MIMD tiene flujos de instrucciones independientes.
  • SPMD es un estilo de programación que suele ejecutarse en hardware MIMD.
  • Una máquina puede ser MIMD entre núcleos y SIMD dentro de cada núcleo.

1.3 Llena los ciclos inactivos con otro hilo

Un fallo de caché puede dejar un núcleo esperando cientos de ciclos. El multihilo por hardware mantiene los estados de ejecución de varios hilos dentro de un núcleo para que puedan ejecutarse instrucciones útiles de otro hilo durante esa espera.

Qué se duplica y qué se comparte

Cada hilo de hardware tiene su propio contador de programa y estado de registros. Los hilos comparten las unidades de ejecución del núcleo, las cachés y el acceso al ancho de banda de memoria. Mantener el estado en el hardware hace que el cambio sea mucho más rápido que guardar y restaurar un proceso del sistema operativo, lo que puede costar miles de ciclos. El hardware puede cambiar en un ciclo o menos.

El sistema operativo ve cada hilo de hardware como un procesador lógico. Ocho núcleos físicos con dos hilos de hardware por núcleo presentan 16 procesadores lógicos. Esa cifra describe los contextos de hilo disponibles, no 16 núcleos físicos completos.

Tres enfoques de planificación
Enfoque¿Cuándo elige el núcleo otro hilo?Compromiso principal
Grano finoEn cada ciclo, omitiendo los hilos detenidosOculta paradas cortas y largas, pero cada hilo espera entre turnos.
Grano gruesoAnte una parada larga, como un fallo en la caché del último nivelPermite ejecuciones largas de un hilo, pero el cambio y el rellenado del cauce cuestan tiempo.
Multihilo simultáneo (SMT)Varios hilos pueden emitir instrucciones en el mismo cicloLlena posiciones de emisión no usadas mientras comparte los recursos del núcleo.

La planificación de grano fino puede alternar entre hilos preparados incluso cuando el hilo anterior podría continuar. La planificación de grano grueso sigue ejecutando ese hilo hasta que una parada costosa justifica el cambio. SMT usa un núcleo de emisión múltiple con planificación dinámica: las instrucciones de distintos hilos pueden ocupar diferentes posiciones de emisión libres durante un ciclo. El renombrado de registros mantiene separados sus estados. Hyper-Threading de Intel es una implementación de SMT; algunos procesadores IBM POWER admiten ocho hilos de hardware por núcleo.

Resuelve un ejemplo de ocultación de latencia

Supón que un hilo calcula durante 20 ciclos y luego espera 200 ciclos a la memoria. Su ciclo dura 220 ciclos. Por sí solo, el trabajo útil ocupa 20/220≈0,091, es decir, el 9,1 % del tiempo.

Con cuatro hilos, trabajo escalonado libremente y sin coste de cambio ni contención adicional, el trabajo útil puede ocupar 4×20/220≈0,364, es decir, el 36,4 %. El núcleo sigue teniendo intervalos inactivos porque cuatro ráfagas de 20 ciclos no pueden cubrir los periodos de espera.

Once hilos proporcionan en total 220 ciclos de ráfagas de cálculo. Mientras uno espera durante 200 ciclos, los otros diez pueden calcular 20 cada uno. Esta planificación ideal mantiene ocupado el núcleo. El rendimiento real también depende de si esos hilos compiten por los recursos de memoria y ejecución.

Productividad y tiempo de finalización de un hilo

El multihilo aumenta principalmente la productividad. Un hilo concreto puede tardar más porque otros hilos usan ciclos y espacio de caché que de otro modo recibiría. Dos hilos de hardware que comparten una unidad aritmética no pueden obtener ambos la capacidad de un segundo núcleo completo.

Si ambos hilos ya requieren las mismas unidades de ejecución totalmente ocupadas, SMT tiene poca capacidad libre que aprovechar. Si uno se detiene mientras el otro puede ejecutarse, compartir resulta útil. Las GPU aplican la ocultación de latencia a mayor escala manteniendo muchos grupos de hilos preparados para sus planificadores.

Puntos clave

  • Los hilos de hardware duplican el estado de ejecución y comparten los recursos de un núcleo.
  • El cambio de grano fino ocurre en cada ciclo; el de grano grueso responde a paradas largas.
  • SMT puede emitir instrucciones de distintos hilos durante un mismo ciclo.
  • El número de procesadores lógicos incluye los contextos de los hilos de hardware.
  • La ocultación de latencia necesita trabajo preparado y puede verse limitada por la contención.
  • Una mayor productividad no tiene por qué acortar la ejecución de un hilo individual.
2

Estima la aceleración paralela útil

Los procesadores adicionales solo dividen el trabajo que puede ejecutarse en paralelo y generan costes propios. Empieza por el tiempo transcurrido y la fracción secuencial y después distingue entre terminar antes una tarea fija y resolver una tarea mayor en el mismo tiempo. El equilibrio de carga y la coordinación explican otras pérdidas. El modelo de techo de rendimiento añade otro límite: si la memoria puede alimentar las unidades aritméticas disponibles con suficiente rapidez.

2.1 Calcula la ganancia y su límite

Una máquina paralela es útil cuando cambia el tiempo transcurrido. El factor de aceleración compara la mejor ejecución secuencial con la ejecución paralela; la eficiencia compara esa ganancia con el número de procesadores usados.

Empieza por el tiempo medido

Para p procesadores, S(p)=T1/Tp y E(p)=S(p)/p. Una tarea secuencial de 100 s que termina en 16 s con ocho núcleos tiene un factor de aceleración de 100/16=6,25. Su eficiencia es 6,25/8=0,78125, aproximadamente el 78 %. Mide el tiempo transcurrido de reloj en ambas ejecuciones, usando la misma tarea de tamaño fijo.

Divide el tiempo en partes mejoradas y sin cambios

En la ley de Amdahl, f es la fracción del tiempo de ejecución original que acelera una mejora. Es una fracción de tiempo, no una fracción de líneas de código fuente. Si esa parte se vuelve s veces más rápida, entonces

Tnew=Told((1−f)+f/s),S=1(1−f)+f/s.

La parte sin cambios sigue tardando todo su tiempo original. Para una división paralela ideal entre p procesadores, establece s=p. Este modelo excluye los sobrecostes de comunicación, desequilibrio y sincronización; esos costes pueden hacer que el tiempo medido sea mayor.

Con un 90 % de tiempo paralelizable y diez procesadores, el tiempo normalizado es 0,1+0,9/10=0,19. El factor de aceleración es 1/0,19≈5,26 y la eficiencia es de aproximadamente el 53 %. Con 100 procesadores, el tiempo es 0,1+0,009=0,109 y el factor de aceleración es aproximadamente 9,17. Multiplicar por diez el número de procesadores no ha duplicado el factor de aceleración.

Encuentra el límite antes de comprar más procesadores

A medida que crece el número de procesadores, el tiempo paralelo se aproxima a cero. La fracción secuencial permanece y establece el techo Smax=1/(1−f). Una fracción secuencial del 10 % limita el factor de aceleración ideal a 10; una del 5 % lo limita a 20. Un número finito de procesadores se aproxima a estos techos sin alcanzarlos.

La ley de Amdahl también evalúa una clase de instrucciones más rápida. Si la multiplicación ocupa el 30 % de una ejecución y se vuelve cuatro veces más rápida, el tiempo normalizado pasa a ser 0,7+0,3/4=0,775. El programa completo es solo 1/0,775≈1,29 veces más rápido.

Trabaja hacia atrás desde un objetivo

Para obtener un factor de aceleración de 90 con 100 procesadores, escribe 1/90=(1−f)+f/100=1−0,99f. Por tanto, f=(1−1/90)/0,99≈0,99888. Solo aproximadamente el 0,11 % del tiempo original puede permanecer secuencial. Un objetivo cercano al número de procesadores exige una fracción sin cambios muy pequeña.

Un factor de aceleración medido puede superar a veces el número de procesadores. Dividir un conjunto de trabajo grande puede hacer que cada parte quepa en la caché, lo que reduce el coste por operación. Esta aceleración superlineal cambia una premisa del modelo sencillo: el trabajo paralelo ya no es simplemente el trabajo original dividido en partes iguales. Comprueba el algoritmo, el tamaño de los datos y el comportamiento de la caché antes de interpretar una medición así.

Puntos clave

  • El factor de aceleración es el tiempo secuencial dividido por el tiempo paralelo; la eficiencia es el factor de aceleración dividido por el número de procesadores.
  • La fracción de Amdahl se refiere al tiempo de ejecución original.
  • Solo la fracción mejorada se divide por el factor de mejora.
  • La fracción secuencial establece el techo de aceleración para una carga de trabajo fija.
  • Los efectos de la caché pueden cambiar el coste del trabajo y producir una aceleración medida superlineal.

2.2 Escala el problema e incluye los costes

Añadir procesadores puede acortar la misma tarea o permitir que una máquina gestione una tarea mayor. La escalabilidad fuerte y la escalabilidad débil miden estos usos distintos, y ambas dependen de cuánto trabajo útil queda después de los costes de coordinación.

Trabajo fijo y trabajo creciente

La escalabilidad fuerte mantiene fijo el tamaño del problema. La escalabilidad débil aumenta el trabajo en proporción al número de procesadores y mantiene constante el trabajo por procesador. Una escalabilidad débil perfecta mantiene constante el tiempo transcurrido mientras crece el trabajo total.

Considera diez sumas secuenciales seguidas de una suma elemento a elemento de dos matrices. Una matriz de 10 por 10 necesita 100 sumas paralelas. El tiempo total es de 110 unidades con un procesador, 20 con diez y 12 con cincuenta: factores de aceleración de 5,5 y aproximadamente 9,2. Una matriz de 40 por 40 necesita 1600 sumas paralelas. Los tiempos pasan a ser 1610, 170 y 42 unidades: factores de aceleración de aproximadamente 9,5 y 38,3. El problema mayor da más peso al trabajo paralelo útil con respecto a las mismas diez sumas secuenciales.

El punto de referencia diferente de Gustafson

La ley de Gustafson usa la fracción de tiempo secuencial medida en la ejecución paralela. Si llamamos s a esa fracción, el factor de aceleración escalado es SG=s+(1−s)p. Para s=0,05 y 100 procesadores, SG=0,05+0,95(100)=95,05.

La ley de Amdahl con un 5 % de tiempo secuencial en la ejecución original con un procesador da solo aproximadamente 16,8 con 100 procesadores. Estas fracciones usan distintos denominadores y responden a preguntas diferentes. Un factor de aceleración escalado de 95,05 no significa que la tarea original de tamaño fijo terminara 95,05 veces antes.

El trabajador más lento determina el tiempo de finalización

Si 400 unidades de trabajo iguales se reparten entre ocho núcleos, la parte equilibrada es de 50 para cada uno. Supón que uno recibe 120 y los otros siete reciben 40 cada uno. La etapa dura 120 unidades de tiempo, por lo que el factor de aceleración es 400/120≈3,33. Dividir por la carga media no tendría en cuenta la espera al núcleo más ocupado.

La creación y planificación de hilos, los mensajes, las barreras y la contención por el ancho de banda compartido también consumen tiempo. La granularidad es la cantidad de cálculo entre eventos de comunicación o sincronización. Las partes más grandes reducen el coste de coordinación por operación útil, pero un número demasiado pequeño de partes puede dejar inactivos a algunos trabajadores.

Más procesadores pueden aumentar el tiempo

Para una tarea totalmente paralela de 100 s con un sobrecoste de 0,5p segundos, Tp=100/p+0,5p. Diez procesadores tardan 15 s. Catorce tardan aproximadamente 14,14 s, cerca del mínimo en torno a 200 procesadores. Cuarenta tardan 22,5 s porque sus 20 s de sobrecoste superan el ahorro del cálculo útil más corto.

Al presentar un resultado, indica si el trabajo permaneció fijo o aumentó y compáralo con el tiempo del mejor programa secuencial. Usar como referencia una implementación paralela lenta ejecutada en un procesador puede inflar el factor de aceleración comunicado.

Puntos clave

  • La escalabilidad fuerte fija el trabajo total; la débil fija el trabajo por procesador.
  • La fracción secuencial de Gustafson se mide en la ejecución paralela.
  • El trabajador más lento determina el tiempo de finalización de una etapa paralela.
  • La comunicación, la sincronización y la contención pueden aumentar con el número de procesadores.
  • La granularidad implica un compromiso entre el coste de coordinación y el equilibrio de carga.
  • Usa el tiempo transcurrido y el mejor programa secuencial como referencia al presentar el factor de aceleración.

2.3 Identifica el techo de cálculo o de memoria

La tasa aritmética anunciada de un procesador es solo uno de los límites. El modelo de techo de rendimiento también pregunta si la memoria puede proporcionar datos con suficiente rapidez para sostener esa tasa. Ofrece un límite superior que ayuda a identificar una dirección útil para la optimización.

Cuenta las operaciones por byte de DRAM

La intensidad aritmética es el número de operaciones de coma flotante dividido por los bytes transferidos entre la DRAM y el procesador. El trabajo original sobre el modelo de techo de rendimiento llama intensidad operacional a esta medida basada en la DRAM. Cuenta el tráfico en ese límite, incluidas las lecturas y escrituras.

DAXPY calcula yi=axi+yi con números de doble precisión. Cada elemento necesita una multiplicación y una suma: dos FLOP. Leer un valor de 8 bytes de cada arreglo y escribir 8 bytes de vuelta transfiere 24 bytes. La intensidad es I=2/24≈0,0833 FLOP por byte. El coeficiente escalar se reutiliza; en este modelo de tráfico no se carga de nuevo desde la DRAM para cada elemento.

Aplica ambos límites

Si la capacidad máxima de cálculo es P y el ancho de banda máximo de memoria es B, el techo es min⁡(P,BI). El ancho de banda multiplicado por los FLOP por byte tiene unidades de FLOP por segundo. En un gráfico con escala logarítmica en ambos ejes, el límite de ancho de banda asciende y el límite de cálculo es horizontal.

Para 1000 GFLOP/s y 100 GB/s, el punto de cresta es P/B=1000/100=10 FLOP por byte. Por debajo de esta intensidad, el techo de ancho de banda es menor; por encima, lo es el techo de cálculo. DAXPY está limitado a 100(2/24)≈8,33 GFLOP/s, menos del 1 % del máximo de cálculo de la máquina. Un núcleo de cálculo con intensidad 2 está limitado a 200 GFLOP/s.

Un núcleo de cálculo limitado por la memoria aún puede beneficiarse de más núcleos o de SIMD más ancho mientras tenga muy pocas solicitudes en curso para usar el ancho de banda disponible. Una vez saturado ese ancho de banda, la capacidad aritmética adicional no eleva su techo. Sí lo hacen aumentar el ancho de banda o realizar más cálculo útil por byte transferido.

La reutilización cambia la intensidad

Multiplicar dos matrices de doble precisión de 1000 por 1000 realiza aproximadamente 2(1000)3=2×109 FLOP. Si cada elemento de las dos entradas y de la salida cruza una vez el límite de la DRAM, el tráfico total es de 24 MB, lo que da aproximadamente 83 FLOP por byte. Esto está por encima de la cresta de la máquina del ejemplo.

Una implementación ingenua puede volver a leer repetidamente valores de las matrices desde la DRAM. El procesamiento por bloques organiza los bucles en torno a submatrices que caben en la caché, de modo que los valores sirven para muchas operaciones antes de ser reemplazados. El algoritmo sigue siendo una multiplicación de matrices, pero la implementación transfiere menos bytes de DRAM por operación.

Un techo no es un resultado medido

Un núcleo de cálculo puede funcionar por debajo del límite debido a dependencias, sobrecoste de instrucciones, patrones de acceso deficientes o trabajo paralelo insuficiente. Los techos de rendimiento inferiores muestran esas restricciones: la falta de SIMD puede reducir el techo de cálculo, mientras que los patrones de acceso deficientes reducen el ancho de banda utilizable. Un punto por debajo de un techo requiere investigación; el techo por sí solo no predice su tasa de ejecución exacta.

Puntos clave

  • La intensidad cuenta los FLOP por byte en el límite de la DRAM.
  • El techo es el menor valor entre la capacidad máxima de cálculo y el ancho de banda multiplicado por la intensidad.
  • El punto de cresta es la capacidad máxima de cálculo dividida por el ancho de banda máximo.
  • La reutilización puede aumentar la intensidad sin cambiar el algoritmo matemático.
  • El modelo de techo de rendimiento proporciona un límite superior; los techos inferiores explican restricciones adicionales.
3

Procesa arreglos con carriles e hilos de GPU

Los arreglos ofrecen operaciones repetidas sobre elementos independientes, que pueden repartirse entre carriles e hilos. Sigue esa idea desde los registros SIMD de anchura fija hasta los bucles vectoriales de longitud variable y después hasta los grupos de hilos de GPU. Cada diseño necesita una disposición eficaz de los datos y suficiente trabajo para ocupar su hardware. Un pequeño núcleo de cálculo muestra cómo los índices de arreglo se convierten en índices de hilo, mientras que los costes de transferencia determinan si delegar el trabajo ayuda a la tarea completa.

3.1 Ejecuta operaciones sobre arreglos en carriles SIMD

Una extensión SIMD divide un registro ancho en carriles. Una instrucción realiza la misma operación en cada carril, por lo que los bucles regulares sobre elementos independientes son adecuados para ella.

Cuenta carriles e iteraciones

El número de carriles es la anchura del registro dividida por la anchura del elemento. Un registro de 256 bits contiene ocho números de coma flotante de 32 bits, cuatro de doble precisión de 64 bits o 32 elementos de un byte. SSE usa registros XMM de 128 bits; AVX y AVX2 usan registros YMM de 256 bits. En modo de 64 bits hay 16 registros YMM. AVX-512 proporciona 32 registros ZMM de 512 bits, cada uno con capacidad para 16 números de coma flotante. Arm Neon usa registros de 128 bits.

Para c[i] = a[i] + b[i] sobre 1000 números de coma flotante, las instrucciones de ocho carriles procesan el arreglo en 125 iteraciones vectoriales. Cada iteración carga dos vectores, suma sus carriles y almacena un vector. Con 1003 elementos, 125 iteraciones completas dejan tres elementos. Un bucle escalar para el resto o una operación con máscara procesa esa parte final corta sin acceder fuera de los arreglos.

Ocho carriles representan una capacidad aritmética, no una garantía de aceleración del programa por un factor de ocho. La preparación, el tratamiento del resto, el trabajo secuencial y el ancho de banda de memoria siguen consumiendo tiempo.

Elige una disposición que llene un registro

Las cargas vectoriales sencillas funcionan bien con elementos contiguos, con paso de una unidad. Un arreglo de puntos {x, y, z} con valores de 4 bytes sitúa los campos x consecutivos a 12 bytes de distancia. Una estructura de arreglos coloca juntos los valores de x, después los de y y después los de z. Ahora, al procesar solo x, se puede llenar un vector con una carga contigua. Las instrucciones de recopilación y dispersión admiten direcciones dispersas, pero normalmente con un mayor coste de acceso.

Mantén el trabajo condicional dentro de los carriles

Para c[i] = (a[i] > 0) ? a[i] : 0, una comparación crea una máscara por carril. Una mezcla elige entre los resultados candidatos, o las instrucciones con máscara actualizan solo los carriles seleccionados. Los carriles inactivos conservan o reciben valores según el comportamiento de máscara de la instrucción.

Si distintos carriles necesitan ramas largas y diferentes, las instrucciones de esos caminos siguen teniendo que emitirse, con solo los carriles pertinentes activos. El grupo no puede dar a cada carril un flujo de instrucciones separado. Una máscara preserva la corrección, pero no puede hacer desaparecer todas esas instrucciones de los caminos.

Comprueba la independencia de las iteraciones

Los compiladores pueden vectorizar bucles automáticamente; los programadores también pueden usar bibliotecas o funciones intrínsecas como _mm256_add_ps. El compilador debe determinar que las iteraciones simultáneas preservan el resultado. La recurrencia a[i] = a[i-1] + b[i] depende del nuevo valor de la iteración anterior y no puede vectorizarse directamente como elementos independientes. El posible solapamiento de punteros, llamado aliasing, también puede requerir una comprobación de solapamiento en tiempo de ejecución o impedir la vectorización.

Una reducción mantiene varias sumas parciales en un registro y después combina los carriles. Reordenar las sumas de coma flotante puede cambiar los últimos bits porque la suma no es asociativa. Las sumas de enteros coinciden cuando la aritmética elegida no tiene desbordamiento o usa aritmética modular definida.

SIMD y la ejecución multinúcleo pueden combinarse. Ocho núcleos que emiten cada uno una suma de ocho carriles por ciclo pueden realizar hasta 64 sumas de coma flotante por ciclo. Siguen compartiendo límites como el ancho de banda de memoria.

Puntos clave

  • El número de carriles SIMD depende tanto de la anchura del registro como de la anchura del elemento.
  • Los elementos restantes necesitan una parte final escalar o un acceso con máscara correcto.
  • Las disposiciones contiguas ayudan a las cargas vectoriales a usar sus carriles de forma eficiente.
  • Las máscaras gestionan condiciones por elemento mientras comparten la emisión de instrucciones.
  • Las dependencias y el solapamiento de punteros pueden impedir la vectorización directa.
  • Las reducciones de coma flotante pueden cambiar el redondeo cuando se reagrupan las operaciones.

3.2 Deja que la longitud del vector controle cada pasada del bucle

Una arquitectura vectorial expresa una operación sobre una secuencia de elementos y almacena la longitud activa del vector en un registro. El mismo programa puede ejecutarse en implementaciones con distintas capacidades de registro vectorial.

Separa capacidad, longitud y carriles

La versión 1.0 de la extensión vectorial de RISC-V, RVV, se ratificó en 2021. Proporciona 32 registros vectoriales, de v0 a v31. Cada implementación elige la anchura de sus registros, VLEN, como una potencia de dos. La anchura del elemento y la agrupación de registros determinan cuántos elementos caben.

La longitud activa, vl, es el número de elementos que procesan las siguientes instrucciones vectoriales. vsetvli configura la operación vectorial a partir del número de elementos restantes y del formato de elemento deseado, y devuelve la vl seleccionada. El código avanza según ese valor devuelto. Esto importa porque el código portable debe usar la longitud real elegida por la implementación.

Los carriles son los cauces de segmentación paralelos que ejecutan la operación vectorial. Una suma de 32 elementos en cuatro carriles tarda unos ocho ciclos después del inicio del cauce. Un vector de 32 elementos no requiere 32 unidades aritméticas. Los vectores más largos y un mayor número de carriles son decisiones de diseño separadas.

Divide un bucle en tramos

La partición de bucles en tramos divide un bucle largo en partes del tamaño de un vector. Para 100 elementos y un máximo de 32 por operación, una secuencia válida de longitudes es 32, 32, 32 y 4. Cada pasada carga la siguiente parte, la calcula, la almacena y reduce el número restante en su vl.

DAXPY sobre 1000 números de doble precisión puede usar de manera similar 31 pasadas de 32 seguidas de una pasada de ocho, para un total de 32 pasadas. RVV puede elegir otras longitudes válidas cerca del final, por lo que el bucle usa la vl devuelta en lugar de suponer una división final concreta. Establecer la longitud activa permite procesar la parte final corta sin un bucle escalar separado para el resto.

El patrón de control del bucle es:

  1. Solicita una longitud para los elementos restantes.
  2. Carga y calcula esa cantidad de elementos.
  3. Almacena los resultados.
  4. Avanza los punteros y resta la longitud devuelta.

Una instrucción vectorial describe muchas operaciones sobre elementos, lo que reduce el trabajo de búsqueda y decodificación frente a un cuerpo escalar repetido para cada elemento.

Alimenta operaciones dependientes y datos no contiguos

El encadenamiento permite que una operación vectorial consumidora empiece con los primeros resultados antes de que la operación productora haya terminado los elementos posteriores. Para una multiplicación seguida de una suma, el primer producto puede entrar en el cauce de suma mientras los productos posteriores aún se están formando.

Una máscara, habitualmente en el registro v0 de RVV, selecciona qué elementos se actualizan. Una carga con paso constante accede a elementos separados por una distancia fija en bytes. En una matriz de doble precisión de 100 por 100 almacenada por filas, bajar una columna avanza 100 elementos, u 800 bytes. Las cargas y almacenamientos indexados usan direcciones explícitas para datos irregulares.

Tanto las arquitecturas vectoriales como las extensiones de anchura fija son SIMD en la taxonomía de Flynn. Las extensiones de anchura fija codifican anchuras concretas; el código RVV expresa longitudes que se adaptan al hardware disponible. Ambas siguen necesitando un orden de ejecución que respete las dependencias de datos del bucle.

Puntos clave

  • La longitud del vector indica cuántos elementos procesa una operación; los carriles indican cuántos pueden avanzar juntos.
  • El código RVV avanza según la longitud real devuelta por vsetvli.
  • La partición en tramos procesa un arreglo largo en partes del tamaño de un vector.
  • El encadenamiento solapa operaciones vectoriales dependientes elemento a elemento.
  • Las máscaras, los pasos de acceso y los accesos indexados permiten manejar datos menos regulares.

3.3 Mantén una GPU ocupada con muchos grupos de hilos

Una CPU concentra recursos en una baja latencia para unos pocos hilos. Una GPU concentra recursos en una alta productividad entre muchos hilos con paralelismo de datos. Elegir entre ellas requiere examinar toda la tarea, incluido el movimiento de datos.

Los hilos se ejecutan en multiprocesadores de flujos

Una GPU de NVIDIA contiene muchos multiprocesadores de flujos, o SM. Un SM tiene carriles aritméticos, planificadores de grupos de hilos, un banco de registros grande y memoria compartida rápida en el chip. Un «núcleo CUDA» designa un carril aritmético, no un núcleo completo e independiente como el de una CPU. AMD llama unidad de cómputo al grupo de procesamiento correspondiente.

NVIDIA agrupa los hilos en grupos de hilos de 32. Una instrucción emitida opera sobre los hilos activos del grupo, cada uno con sus propios valores de registro y datos. Esto es SIMT, una instrucción y múltiples hilos. AMD usa frentes de onda, con 32 o 64 hilos según la arquitectura.

Un SM mantiene residentes muchos grupos de hilos. Cuando uno espera a la memoria, el planificador selecciona otro que esté preparado. Tener más hilos preparados que carriles oculta la latencia; no reduce la latencia de un acceso individual a la DRAM.

La divergencia deja carriles inactivos

Si los hilos de un grupo toman ramas diferentes, el grupo ejecuta los caminos necesarios con los demás hilos desactivados mediante máscaras. Un if-else dividido por igual, con ramas de igual coste, puede tardar aproximadamente el doble del tiempo de un camino porque ambos deben ejecutarse. Un salto puede no tener coste por divergencia cuando su condición es uniforme dentro de cada grupo, aunque distintos grupos elijan caminos diferentes.

Haz que los accesos a memoria trabajen juntos

Los registros de cada hilo contienen valores privados. La memoria compartida por bloque es almacenamiento en el chip gestionado por el programa. Las cachés L1 y L2 permiten la reutilización automática, mientras que la memoria global es la DRAM de la GPU, como GDDR o HBM.

Cuando 32 hilos leen palabras consecutivas de 4 bytes, su intervalo de 128 bytes puede atenderse con un pequeño número de transacciones anchas. Esta coalescencia de accesos a memoria usa el ancho de banda de forma eficiente. Las direcciones dispersas pueden requerir muchas transacciones para los mismos datos útiles. La reutilización en memoria compartida puede reducir aún más el tráfico repetido de memoria global.

Incluye el tiempo de transferencia

En una GPU discreta, las entradas y los resultados atraviesan un enlace como PCIe o NVLink. Enviar 800 MB y recibir 400 MB a una velocidad efectiva de 20 GB/s transfiere 1,2 GB en 0,06 s, es decir, 60 ms. Añadir un núcleo de cálculo de 10 ms da 70 ms en total. Una CPU que termina en 50 ms gana esta comparación pese al cálculo mucho más rápido de la GPU.

Mantener los datos en la GPU durante varios núcleos de cálculo evita transferencias repetidas. Las tareas grandes y regulares también pueden proporcionar suficiente trabajo aritmético útil para compensar los costes de movimiento y lanzamiento. Las tareas pequeñas, secuenciales y con muchos saltos suelen favorecer a una CPU.

Especializa aún más cuando el trabajo lo permita

Un sistema heterogéneo usa la CPU para ejecutar el programa y el sistema operativo y un acelerador para las partes adecuadas. Los aceleradores de dominio específico, como las TPU y las NPU, dedican hardware a una tarea más concreta, a menudo la multiplicación de matrices con enteros de 8 bits o coma flotante de 16 bits. La especialización puede mejorar el rendimiento por vatio en ese dominio, al tiempo que reduce la variedad de trabajos que el hardware maneja bien.

Puntos clave

  • Un SM planifica grupos de hilos; un núcleo CUDA es un carril aritmético.
  • Los grupos de hilos de NVIDIA contienen 32 hilos con datos separados y emisión de instrucciones compartida.
  • Los grupos de hilos residentes y preparados ocultan las esperas de memoria.
  • La divergencia y los accesos dispersos desperdician tiempo de los carriles y ancho de banda de memoria.
  • Las decisiones de delegar trabajo incluyen las transferencias además del tiempo del núcleo de cálculo.
  • Los aceleradores especializados sacrifican flexibilidad para obtener eficiencia en un dominio más concreto.

3.4 Asigna elementos de arreglos a hilos de GPU

Un núcleo de cálculo de GPU se ejecuta una vez por cada hilo lanzado. El sistema anfitrión lanza una malla de bloques de hilos y cada hilo calcula qué parte de los datos le corresponde. CUDA llama sistema anfitrión a la CPU y dispositivo a la GPU; OpenCL usa los términos relacionados elemento de trabajo y grupo de trabajo.

Calcula un índice único

Para un lanzamiento unidimensional, el índice del elemento es blockIdx.x * blockDim.x + threadIdx.x. Con 256 hilos por bloque, el hilo 5 del bloque 2 procesa el elemento 517: los dos bloques anteriores cubren 512 elementos y el hilo añade un desplazamiento de cinco. Los índices de hilos y bloques empiezan en cero.

Un núcleo de cálculo SAXPY aplica una multiplicación y una suma a cada número de coma flotante:

__global__ void saxpy(int n, float a, float *x, float *y) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) {
        y[i] = a * x[i] + y[i];
    }
}

La malla sustituye al bucle habitual sobre los elementos. Cada hilo activo actualiza su propio y[i]; los hilos vecinos usan direcciones vecinas, lo que facilita la coalescencia.

Redondea hacia arriba el número de bloques

Para 1 000 000 de elementos y 256 hilos por bloque, la malla necesita ⌈1000000/256⌉=3907 bloques. Estos lanzan 1 000 192 hilos. Los últimos 192 tienen índices fuera del arreglo, por lo que la condición i < n impide sus accesos a memoria. Redondear hacia abajo lanzaría muy pocos hilos y dejaría elementos válidos sin procesar.

Un bloque de 256 hilos forma ocho grupos de hilos. Los bloques pueden asignarse a cualquier SM y ejecutarse en cualquier orden. La corrección del programa no debe depender de que el bloque 0 termine antes que el bloque 1.

Organiza el trabajo del sistema anfitrión y del dispositivo

Un sistema anfitrión típico reserva almacenamiento en el dispositivo, copia las entradas, lanza saxpy<<<3907, 256>>>(n, 2.0f, d_x, d_y) y obtiene los resultados. El lanzamiento es asíncrono: la CPU puede continuar mientras se ejecuta el núcleo de cálculo. El sistema anfitrión debe esperar mediante sincronización o una copia bloqueante adecuada de los resultados antes de usar los datos terminados.

Coopera dentro de un bloque

Los hilos de un bloque pueden intercambiar valores mediante memoria compartida y reunirse en __syncthreads(). Todos los hilos que participan en esa barrera de bloque deben alcanzarla. Colocar la barrera dentro de if (i < n) no es seguro cuando solo algunos hilos cumplen la condición.

Para una reducción de 1024 valores en memoria compartida, 512 hilos suman pares, luego 256 combinan los resultados, después 128, y así sucesivamente. Diez etapas de reducción a la mitad dejan una suma. Una barrera entre etapas impide que un hilo consuma un resultado parcial antes de que su productor lo escriba.

Un lanzamiento normal no tiene una barrera para toda la malla. Los bloques separados pueden escribir sumas parciales y un segundo núcleo de cálculo puede combinarlas, o bien operaciones atómicas adecuadas pueden actualizar un resultado global. Una barrera de bloque por sí sola no puede coordinar distintos bloques. Un bucle con paso de malla es otro patrón de asignación: cada hilo procesa varios elementos y avanza según el tamaño total de la malla.

Puntos clave

  • Calcula los índices a partir del tamaño del bloque, el índice del bloque y el índice del hilo.
  • Redondea hacia arriba el número de bloques y protege los accesos fuera de los límites.
  • Los lanzamientos de núcleos de cálculo son asíncronos con respecto al sistema anfitrión.
  • La memoria compartida y __syncthreads() permiten la cooperación dentro de un bloque.
  • Los bloques normales se ejecutan de forma independiente; combinar sus resultados necesita otro mecanismo.
4

Comparte memoria y sigue la propiedad de los bloques de caché

Un espacio de direcciones común permite que los hilos intercambien valores mediante operaciones de memoria normales. Las cachés privadas aceleran esas operaciones, pero crean varias copias que necesitan coordinación. Sigue una reducción desde el trabajo local hasta los resultados compartidos y después sigue los permisos que mantienen coherentes las copias en caché. El almacenamiento del directorio y la falsa compartición relacionan esos mecanismos de corrección con el coste de rendimiento de situar los datos en memoria.

4.1 Comparte un espacio de direcciones y combina resultados parciales

Un multiprocesador de memoria compartida proporciona a sus procesadores un espacio de direcciones físico. Los hilos se comunican con cargas y almacenamientos sobre variables compartidas, al tiempo que mantienen valores privados como las sumas parciales locales.

Las direcciones compartidas pueden tener costes diferentes

En UMA, acceso uniforme a memoria, el tiempo de acceso a memoria es aproximadamente el mismo desde cada procesador. En NUMA, acceso no uniforme a memoria, un zócalo accede a su memoria local más rápido que a la memoria de otro zócalo. El espacio de direcciones es compartido aunque la memoria física esté distribuida.

Con un 70 % de accesos locales a 80 ns y un 30 % de accesos remotos a 140 ns, la media ponderada es 0,7(80)+0,3(140)=98 ns. Mover los datos cerca de su usuario principal reduce la proporción de accesos remotos. Contar todos los accesos como locales subestimaría el tiempo.

Una disposición habitual de caché proporciona a cada núcleo cachés L1 privadas de instrucciones y datos, a menudo una L2 privada y una caché de último nivel compartida. Un anillo o una malla conecta los núcleos y las cachés. La memoria compartida describe el direccionamiento; no requiere que todos los núcleos usen una misma caché común.

Divide, calcula y reduce

Para sumar 64 000 valores en 64 núcleos, cada núcleo procesa 1000 valores. Las 64 sumas parciales pueden combinarse en un árbol de reducción. El número de sumadores activos se reduce a la mitad en cada etapa: 32, 16, 8, 4, 2 y 1. Seis etapas combinan los resultados parciales.

Usar aproximadamente 1000 pasos de suma local más seis pasos de combinación da unos 1006 pasos en el camino más largo, antes del sobrecoste. El árbol evita que cada entrada actualice un contador compartido. Cada etapa depende de los valores completados de la etapa anterior, por lo que los trabajadores se reúnen en barreras entre etapas.

OpenMP puede expresar esto con #pragma omp parallel for reduction(+:sum). Divide las iteraciones, da a los hilos sumas parciales privadas y las combina. Los hilos POSIX ofrecen un control más explícito sobre la gestión de hilos.

Haz que una actualización sea indivisible

Una operación de lectura, modificación y escritura atómicas hace que una actualización sea indivisible desde el punto de vista de los demás procesadores. El intercambio atómico y la lectura y suma atómicas son ejemplos. Una carga seguida de un almacenamiento normal son dos operaciones separadas, por lo que otro hilo puede intervenir.

RISC-V proporciona lr.w y sc.w. La carga con reserva lee una palabra y establece una reserva. El almacenamiento condicional intenta la escritura e informa de si tuvo éxito o falló. Una escritura intermedia en la posición reservada hace que el intento falle; el software vuelve a intentarlo. La reserva no bloquea a otros procesadores y el fallo también puede ocurrir por otras razones permitidas. Estas primitivas permiten construir mecanismos de sincronización.

Vigila los cuellos de botella compartidos

Si cada núcleo puede procesar un flujo de 15 GB/s pero el zócalo proporciona 60 GB/s, unos cuatro flujos de este tipo saturan el ancho de banda. Más núcleos no pueden aumentar la tasa de datos del zócalo. La comunicación mediante cachés también requiere trabajo: quien escribe sin permiso de escritura debe obtener la propiedad e invalidar las demás copias. Quien ya tiene un bloque en estado modificado puede seguir escribiendo localmente; los lectores posteriores pueden necesitar buscar una copia nueva.

Puntos clave

  • La memoria compartida significa un espacio de direcciones, aunque sigan siendo posibles los datos y las cachés privadas.
  • NUMA hace que la ubicación de los datos influya en el rendimiento.
  • Las sumas parciales locales y un árbol de reducción limitan la contención.
  • Las barreras separan fases de trabajo dependientes.
  • Las operaciones atómicas protegen las actualizaciones indivisibles; LR/SC vuelve a intentarlas tras los intentos fallidos.
  • Los núcleos comparten el ancho de banda de memoria y asumen el coste de las transferencias de propiedad.

4.2 Mantén coherentes las copias de una posición

Las cachés privadas mejoran la latencia, pero pueden contener varias copias de una misma posición de memoria. La coherencia de caché evita que esas copias presenten historiales contradictorios de las escrituras en esa posición.

Por qué actualizar la memoria no basta

Empieza con X = 0 en memoria. El núcleo A lee y guarda cero en caché; el núcleo B hace lo mismo. A escribe uno en su caché de escritura diferida. Sin un protocolo de coherencia, B puede acertar en su propia caché y seguir leyendo cero. Escribir directamente en memoria no corregiría la copia que B ya tiene en caché.

La coherencia funciona con granularidad de bloque de caché, normalmente de 64 bytes. Un controlador registra el estado de cada bloque y sigue las reglas del protocolo cuando los procesadores lo leen o escriben. La migración mueve datos útiles a la caché de su usuario actual. La replicación permite que varios lectores tengan copias limpias. La coherencia debe preservar ambos beneficios mientras controla las escrituras.

Tres propiedades requeridas
PropiedadQué requiere
Orden del programa para una posiciónUn procesador lee su propia escritura anterior si ninguna escritura intermedia la sustituye.
Propagación de escriturasUna escritura acaba siendo visible para los demás procesadores.
Serialización de escriturasTodos los procesadores coinciden en el orden de las escrituras en esa posición.

Si una posición recibe una escritura de uno seguida de una escritura de dos, los lectores no pueden discrepar sobre cuál ocurrió después. Observar la escritura posterior y luego la anterior invertiría ese historial. Por supuesto, una nueva escritura posterior podría almacenar de nuevo el valor uno; la serialización se refiere a eventos de escritura, no a si un valor numérico puede volver a aparecer.

Controla la propiedad y las copias

En un protocolo de invalidación en escritura, quien escribe obtiene permiso exclusivo de escritura e invalida las demás copias en caché. Una lectura posterior de un bloque invalidado falla y busca los datos actuales. Este es un fallo de coherencia, además de los fallos obligatorios, de capacidad y de conflicto.

Un protocolo de actualización en escritura envía los valores nuevos a las copias existentes. Las escrituras repetidas pueden hacer que esto resulte costoso. El espionaje de bus difunde solicitudes de coherencia para que las cachés puedan reaccionar. Un directorio registra qué cachés comparten el bloque y dirige los mensajes a las pertinentes.

Coherencia, orden y atomicidad

La coherencia se refiere a una posición. Un modelo de consistencia de memoria define las ordenaciones y los resultados observables permitidos de lecturas y escrituras, incluidas las operaciones sobre posiciones diferentes. La consistencia secuencial exige un resultado que coincida con una intercalación que conserve el orden de programa de cada procesador. Los modelos relajados permiten más reordenaciones; las instrucciones de barrera de memoria imponen el orden requerido cuando es necesario.

Ni las copias coherentes ni un orden consistente hacen atómico un incremento de varias instrucciones. Supón que dos hilos incrementan un contador compartido inicialmente igual a cinco. Una secuencia posible es: A lee cinco, B lee cinco, A escribe seis, B escribe seis. Cada lectura y escritura puede ser coherente y, aun así, el contador final es seis en lugar de siete. El programa necesita una actualización atómica o una sincronización adecuada para conservar ambos incrementos.

Puntos clave

  • La coherencia es necesaria incluso cuando las cachés escriben directamente en memoria.
  • Los sistemas coherentes preservan el orden de programa para una misma posición, propagan las escrituras y las serializan.
  • La invalidación en escritura elimina las demás copias utilizables antes de que escriba un nuevo propietario.
  • Los datos invalidados pueden causar fallos de coherencia.
  • Los modelos de consistencia tratan el orden entre distintas posiciones.
  • Una lectura coherente y una escritura coherente siguen siendo dos operaciones separadas.

4.3 Sigue los cambios de propiedad en MSI y MESI

Un controlador de caché con espionaje observa las solicitudes de coherencia en una interconexión de difusión. Para seguir un protocolo, mantén un estado para la copia de un bloque de cada núcleo y actualiza todas las copias afectadas después de cada acceso.

Interpreta los estados como permisos
Estado¿Copia utilizable?¿Quién más puede tenerla?¿Está actualizada la memoria?
Modificado (M)Sí, lecturas y escriturasNinguna otra copia válidaNo
Compartido (S)Sí, lecturasOtros lectores pueden tener copiasSí
Inválido (I)NoOtras cachés pueden tener copiasDepende de su estado
Exclusivo (E), solo MESISí, lecturas y transición silenciosa a escrituraNinguna otra copia válidaSí

En MSI básico, un fallo de lectura envía una lectura por el bus y carga el bloque en S. Escribir un bloque en S requiere una promoción para invalidar las demás copias. Escribir desde I necesita una solicitud de lectura exclusiva para buscar los datos y obtener la propiedad. Quien escribe termina en M. Un acierto en M no requiere ninguna transacción de coherencia.

Sigue cinco accesos

Empieza con X = 0 en memoria y tanto A como B en estado inválido.

  1. A lee X. Una lectura por el bus proporciona cero. Estados: A = S, B = I.
  2. B lee X. Otra lectura por el bus proporciona cero. Estados: A = S, B = S.
  3. A escribe uno. Su promoción invalida B. Estados: A = M, B = I.
  4. B lee X. B falla; A proporciona uno y pasa a S. En MSI básico, la memoria también se actualiza. Estados: A = S, B = S.
  5. B escribe dos. Su promoción invalida A. Estados: A = I, B = M.

Cada acceso de esta traza requiere una transacción de bus. El cuarto acceso es la comprobación de propiedad importante: la memoria por sí sola aún tenía el valor antiguo antes de que A proporcionara sus datos modificados.

Qué ahorra el estado exclusivo

MESI añade E para una única copia limpia en caché. Si A lee un bloque que no está en caché y ninguna otra caché lo tiene, A recibe E. Una escritura posterior cambia E a M silenciosamente, porque no hay otras copias que invalidar. MSI cargaría primero S y después enviaría una promoción para esa escritura.

Si otro núcleo lee mientras A tiene E, ambos pasan a S. Tanto M como E tienen un solo propietario válido, pero solo M contiene datos más recientes que la memoria.

Escrituras repetidas y escala

Quien escribe y ha obtenido M puede actualizar el bloque diez veces sin diez invalidaciones nuevas. Un sistema de actualización en escritura enviaría los valores modificados a quienes comparten el bloque.

El espionaje por difusión se vuelve costoso a medida que más núcleos observan cada solicitud. Las estructuras de directorio reducen esa distribución. Protocolos más elaborados añaden estados útiles: el estado propietario de MOESI permite una copia modificada compartida, y MESIF designa a un participante con estado de reenvío para responder a las solicitudes.

Puntos clave

  • MSI registra las copias en estado modificado, compartido e inválido.
  • Quien escribe necesita propiedad exclusiva; los aciertos en estado modificado permanecen locales.
  • Una lectura remota hace que un propietario en estado modificado proporcione los datos actuales y pase a un estado inferior en MSI básico.
  • El estado exclusivo de MESI permite que un único lector con una copia limpia escriba sin una transacción de promoción.
  • Tanto exclusivo como modificado tienen un propietario, pero solo modificado contiene datos modificados.

4.4 Registra las copias compartidas y separa los datos independientes

Difundir cada solicitud de coherencia resulta costoso en máquinas grandes. Un directorio registra qué cachés podrían tener cada bloque para que las solicitudes puedan dirigirse a ellas. Ese mismo seguimiento por bloques también explica un problema de rendimiento habitual: la falsa compartición.

Consulta el nodo de origen de un bloque

Cada bloque tiene una entrada de directorio en su nodo de origen que registra si no está en caché, está compartido o está modificado, y qué cachés lo tienen. Los nodos de origen se distribuyen entre nodos o partes del directorio, repartiendo el almacenamiento y la gestión de solicitudes.

Un fallo de lectura se dirige al nodo de origen. Si la memoria tiene los datos actuales, puede proporcionarlos y el directorio registra la nueva caché que comparte el bloque. Si otra caché posee una copia en estado modificado, el nodo de origen le reenvía la solicitud para que pueda proporcionar los datos actuales. En un protocolo de directorio básico, esto también vuelve a actualizar la memoria.

Para escribir sin tener ya la propiedad en estado modificado, un núcleo pide permiso al nodo de origen. El directorio envía invalidaciones a las cachés registradas, espera las confirmaciones y concede la propiedad exclusiva. Los aciertos de escritura repetidos en M ya no necesitan más mensajes de coherencia. La intermediación del directorio añade latencia, pero el tráfico punto a punto evita consultar a todas las cachés sobre cada bloque. Los filtros de espionaje en el chip cumplen una función relacionada al limitar las solicitudes a los posibles poseedores.

Estima el almacenamiento del directorio

Un vector de presencia completo tiene un bit por núcleo y por bloque. Para 64 núcleos, son 64 bits, u ocho bytes. Con respecto a un bloque de datos de 64 bytes, solo los bits de presencia cuestan 8/64=0,125, es decir, un 12,5 %. Con 256 núcleos, el vector de 32 bytes cuesta un 50 %. Los bits de estado añaden más. Las listas limitadas de participantes, los vectores más generales y el seguimiento de solo los bloques almacenados en caché reducen esta carga de almacenamiento.

Reconoce la falsa compartición

La compartición verdadera ocurre cuando los núcleos intercambian datos mediante la misma palabra. La falsa compartición ocurre cuando acceden a distintas variables dentro de un bloque de caché y al menos uno escribe. Las variables son independientes en el programa, pero la unidad de coherencia es mayor que cualquiera de ellas.

Dos hilos incrementan contadores separados de 8 bytes en 0x1000 y 0x1008. Con bloques de 64 bytes, sus números de bloque son ⌊4096/64⌋=64 y ⌊4104/64⌋=64. Cada cambio de propiedad transfiere el permiso para ambos contadores a la vez. Las escrituras alternas frecuentes pueden hacer que el bloque vaya de una caché a otra aunque ningún hilo necesite el valor del otro.

Mover el segundo contador a 0x1040 lo sitúa en el bloque 65. El relleno o la alineación pueden separar los datos de cada hilo; agrupar los valores según quien los escribe también ayuda. Un acumulador local que se escribe una sola vez reduce el tráfico de propiedad sin añadir relleno a cada valor.

Quien escribe y quien lee una variable vecina también pueden sufrir falsa compartición: la escritura invalida el bloque del lector, que de otro modo sería útil. Dos lectores por sí solos no la causan. La falsa compartición añade tráfico y demora; por sí misma no hace que las actualizaciones de variables separadas produzcan valores incorrectos. Mide los patrones de acceso y la ubicación de las líneas de caché antes de cambiar una disposición de datos.

Puntos clave

  • Los directorios envían mensajes de coherencia a las cachés registradas mediante el nodo de origen de un bloque.
  • El almacenamiento de los vectores de presencia crece tanto con el número de núcleos como con el número de bloques.
  • La falsa compartición implica distintas variables en un mismo bloque y al menos un núcleo que escribe.
  • Separa la propiedad mediante relleno, ubicación o menos escrituras compartidas.
5

Conecta nodos y trabaja a escala de centro de datos

Más allá de una sola máquina de memoria compartida, los nodos intercambian mensajes a través de una red. Un clúster debe ubicar los datos y organizar la comunicación con tanto cuidado como divide los cálculos. A escala de centro de datos, esa misma red convive con la alimentación, la refrigeración y los fallos habituales de hardware. Compara la capacidad de red mediante un corte crítico y después usa cálculos de energía y latencia para evaluar cómo un gran conjunto de servidores presta un servicio fiable.

5.1 Compara nodos de memoria privada y sus redes

Un clúster conecta sistemas informáticos completos, cada uno con su propia memoria y sistema operativo. Los nodos cooperan mediante mensajes explícitos. Por ello, la ubicación de los datos y el coste de comunicación pasan a formar parte del modelo de rendimiento del programa.

Reparte los datos y combina los resultados

MPI, la interfaz de paso de mensajes, asigna a cada proceso un rango y proporciona operaciones como envío, recepción, difusión y reducción. Un programa SPMD puede usar los rangos para seleccionar los datos de cada proceso. Un puntero en el espacio de direcciones privado de un nodo no es una referencia normal de memoria compartida a los datos de otro nodo.

Si un millón de valores ya están distribuidos entre 100 nodos, cada nodo suma 10 000 localmente. Una reducción en árbol combina las sumas parciales en siete rondas porque ⌈log⁡2100⌉=7. Esas rondas implican mensajes de red, no solo sumas locales. Mantener los datos cerca del trabajo que los usa reduce las transferencias.

Los clústeres escalan con componentes estándar y el hardware averiado puede sustituirse. Una aplicación aún puede necesitar recuperarse o reiniciarse después de que falle un nodo; el mero hecho de poder sustituir nodos no conserva el progreso de una tarea interrumpida.

Mide más que la velocidad del enlace

La latencia es el tiempo que tarda en llegar un mensaje. El ancho de banda del enlace es la tasa de datos de un enlace. El ancho de banda total de la red suma la capacidad de los enlaces y describe un agregado ideal con todos los enlaces ocupados. El ancho de banda de bisección suma la capacidad que cruza el corte de menor capacidad que divide los nodos en mitades iguales.

Para enlaces de igual capacidad con ancho de banda B, compara redes de 64 nodos usando una misma convención de recuento de enlaces:

TopologíaEnlacesCapacidad totalCapacidad de bisección
Anillo6464B2B
Malla de 8 por 8112112B8B
Red toroidal de 8 por 8128128B16B
Hipercubo de 6 dimensiones192192B32B
Completamente conectada20162016B1024B

La malla tiene ocho filas de siete enlaces horizontales y ocho columnas de siete enlaces verticales, lo que da 112. Conectar los bordes en ambas dimensiones produce los 128 de la red toroidal. Cada nodo del hipercubo tiene seis vecinos, lo que da 64(6)/2=192 enlaces porque cada enlace se cuenta en sus dos extremos.

Sigue el corte y después considera el coste

Un corte que divide un anillo en dos mitades atraviesa solo dos enlaces. Por tanto, muchos mensajes pueden competir en ese límite pese a los 64 enlaces totales del anillo. Una red completamente conectada tiene 32(32)=1024 enlaces entre sus dos mitades, pero necesita 64(63)/2=2016 enlaces en total.

Más enlaces pueden mejorar el ancho de banda y reducir los saltos, al tiempo que aumentan los puertos de conmutador, los cables y la potencia. Los buses compartidos tienen un único recurso de comunicación compartido; las mallas y las redes toroidales distribuyen los enlaces por el espacio. Los grandes clústeres suelen usar redes conmutadas de varias etapas, como los árboles gruesos. Su utilidad depende del patrón de tráfico y de su capacidad agregada. Para la comunicación entre las mitades de una máquina, la bisección revela un límite que el total oculta.

Puntos clave

  • Los nodos de un clúster usan espacios de direcciones privados y comunicación explícita.
  • Los rangos de MPI identifican procesos; las operaciones colectivas combinan trabajo distribuido.
  • Las rondas de mensajes añaden coste además de los cálculos locales.
  • El ancho de banda total mide la capacidad agregada de los enlaces; el de bisección mide un corte crítico de la máquina.
  • La capacidad de red implica un compromiso con los puertos, cables, potencia y saltos.

5.2 Mide un centro de datos como una sola computadora

Un sistema informático a escala de centro de datos combina decenas de miles de servidores con alimentación, refrigeración y una red para prestar servicios de internet. Las solicitudes independientes proporcionan trabajo paralelo, mientras que los entornos de procesamiento por lotes como MapReduce dividen grandes tareas de procesamiento de datos entre máquinas.

Adapta el diseño al servicio

Los sistemas a escala de centro de datos dan prioridad al coste por solicitud, la eficiencia energética y la disponibilidad. El software vuelve a intentar el trabajo, replica datos y dirige las solicitudes por rutas que evitan las máquinas averiadas. Un supercomputador suele dar más prioridad a un programa científico fuertemente acoplado y a una interconexión rápida.

Los servidores se conectan a conmutadores situados en la parte superior de los bastidores, que se conectan a través de niveles superiores de conmutación. Los niveles adicionales añaden latencia de comunicación. Los enlaces ascendentes suelen estar sobresuscritos, lo que significa que su capacidad es menor que la capacidad agregada de los enlaces de los servidores. Algunas redes no bloqueantes de estilo Clos proporcionan suficiente capacidad superior para evitar esta restricción.

Cuarenta servidores con enlaces de 10 Gbit/s ofrecen 400 Gbit/s a un conmutador de bastidor. Cuatro enlaces ascendentes de 25 Gbit/s proporcionan 100 Gbit/s, por lo que la proporción es 4:1. Si todos los servidores envían datos fuera del bastidor a la vez y comparten la capacidad por igual, cada uno alcanza una media de 2,5 Gbit/s. Un servidor con poca carga puede usar más cuando los demás están inactivos.

Separa el sobrecoste de la instalación del cálculo útil

La eficacia en el uso de la energía, PUE, es la energía total de la instalación dividida por la energía de los equipos informáticos durante el mismo periodo. Una carga informática constante de diez MW más 1,5 MW de sobrecoste de refrigeración y distribución da PUE=11,5/10=1,15. El valor ideal es 1,0. Google informó de una PUE anual de 1,09 para el conjunto de sus centros en 2025.

La PUE mide el sobrecoste de la instalación, no los cálculos útiles por julio. Los servidores inactivos o ineficientes pueden desperdiciar energía dentro de los equipos informáticos incluso cuando la instalación tiene una PUE excelente.

Para 50 000 servidores con una media de 300 W, la potencia informática es de 15 MW. Con una PUE de 1,2, la potencia de la instalación es de 18 MW. Mantenida durante 8760 horas, consume 157 680 MWh; solo el sobrecoste consume 26 280 MWh. Los equipos de alimentación, la refrigeración, la electricidad, los servidores y los edificios contribuyen al coste de propiedad.

Una carga baja aún puede consumir mucha potencia

La proporcionalidad energética significa que la potencia debería aumentar en proporción a la carga. Un servidor con 150 W de potencia en reposo y 300 W de potencia máxima, cuyo consumo aumenta linealmente, consume 150+0,3(150)=195 W al 30 % de carga. Usa el 65 % de la potencia máxima para el 30 % del trabajo máximo. Mediciones históricas a escala de centro de datos encontraron muchos servidores que funcionaban con una utilización de entre aproximadamente el 10 % y el 50 %, lo que hace importante la potencia en reposo.

Planifica para fallos y respuestas lentas

Si cada uno de 50 000 servidores registra de media un fallo cada diez años, se esperan 5000 fallos al año en el conjunto, unos 14 al día. Esa expectativa justifica la redundancia y los reintentos; no implica exactamente 14 fallos cada día.

Una solicitud que necesita respuestas de muchos servidores espera la respuesta requerida más lenta. Si cada uno de 100 servidores tiene de forma independiente una probabilidad del 1 % de ser lento, la probabilidad de que ninguno lo sea es 0,99100. Por tanto, la probabilidad de que al menos uno sea lento es 1−0,99100≈0,634. La latencia de cola de la distribución de un servidor se convierte en una demora habitual de la solicitud cuando esta se distribuye entre muchos servidores.

Puntos clave

  • El diseño a escala de centro de datos equilibra la productividad del servicio, la energía, el coste y la disponibilidad.
  • Los enlaces ascendentes sobresuscritos limitan el tráfico simultáneo fuera del bastidor.
  • La PUE mide el sobrecoste de la instalación, mientras que la eficiencia de los servidores mide el trabajo útil de los equipos informáticos.
  • La potencia en reposo hace que una baja utilización resulte costosa.
  • Los grandes conjuntos de servidores sufren fallos habituales, y la distribución de solicitudes entre servidores amplifica la latencia de cola.

Ejemplos de Procesadores paralelos y multinúcleo

5 Lecciones Interactivas

1

Elige una fuente útil de trabajo paralelo

15 pasos
Sigue una carga de trabajo desde los límites de potencia hasta los flujos de instrucciones y después usa hilos preparados para cubrir las esperas de memoria.
  1. 1
    IntroducciónMás trabajo sin aumentar el calor del reloj

    Un servicio debe gestionar más tareas, pero aumentar la frecuencia de reloj de su CPU superaría su presupuesto de potencia. El hardware paralelo logra hacer más dentro de un presupuesto de potencia fijo. Los diseñadores pueden añadir núcleos (MIMD), ampliar las operaciones sobre datos (SIMD) o mantener preparados más hilos (multihilo). Cada opción necesita una fuente de trabajo adecuada. Empieza por identificar qué puede ejecutarse a la vez y después pregunta cómo llega ese trabajo al hardware y si el beneficio es un menor tiempo de respuesta o una mayor capacidad de servicio (throughput).

  2. 2
    ExplicaciónLa tensión tiene un efecto cuadrático

    La potencia dinámica sigue aproximadamente P≈CV2f. Sin cambiar la capacitancia, reducir la tensión y la frecuencia al 85 % multiplica la potencia por 0,85×0,85×0,85=0,614125. Esa gran reducción ayuda a explicar por qué varios núcleos modestos pueden ser atractivos. El muro de potencia surgió cuando las reducciones de tensión ya no podían compensar el coste en calor y potencia de aumentar las frecuencias de reloj.

  3. 3
    EjemploSepara una solicitud de muchas solicitudes

    Si cuatro descargas independientes se ejecutan en cuatro núcleos, la máquina puede completar más descargas por segundo aunque cada una tarde lo mismo. Esa es una ganancia de productividad debida al trabajo a nivel de solicitudes. Si una imagen se divide en regiones independientes y cuatro hilos las procesan, esa imagen puede terminarse antes. El hardware paralelo sirve a ambos objetivos, pero el programa debe ofrecer el trabajo adecuado.

  4. 4
    ExplicaciónEncuentra trabajo dentro de un programa

    Un cauce de segmentación solapa instrucciones de un flujo: ILP. Una operación sobre un arreglo se repite entre elementos: DLP. Los hilos separados proporcionan TLP, con su propio estado de ejecución y un espacio de direcciones de proceso compartido. Estas formas pueden coexistir. Un programa con hilos que procesa un arreglo puede dividir las regiones entre núcleos, usar SIMD dentro de cada región y ejecutar esas instrucciones mediante el cauce de cada núcleo.

  5. 5
    Desafío¿Cuenta trabajar por turnos?

    Un núcleo alterna entre dos tareas. Ambas están en curso durante un segundo, pero sus instrucciones nunca se ejecutan en el mismo instante. ¿Es esto ejecución paralela?

    ---reveal---

    Es ejecución concurrente mediante tiempo compartido. El paralelismo requiere operaciones simultáneas en recursos de hardware separados. Otro núcleo podría proporcionar esa simultaneidad, pero seguiría necesitando trabajo preparado para ejecutarse.

  6. 6
    ExplicaciónPregunta quién elige la siguiente instrucción

    La taxonomía de Flynn parte de los flujos de instrucciones y de datos. Un núcleo escalar convencional es SISD. Una operación ancha que aplica una instrucción a varios elementos es SIMD. Los procesadores controlados de forma independiente que procesan sus datos son MIMD. MISD combina múltiples flujos de instrucciones con un flujo de datos y tiene pocos ejemplos prácticos inequívocos. Cuenta los flujos en un nivel de hardware elegido.

  7. 7
    EjemploUn programa, avances separados

    Cuatro trabajadores usan sus identificadores para dividir un arreglo de 4000 elementos en cuatro regiones de 1000 elementos. Ejecutan el mismo programa, pero uno puede alcanzar su suma final mientras otro aún carga valores. Esto es software SPMD en hardware MIMD. Compartir el texto del programa no requiere emitir instrucciones al mismo ritmo. Una instrucción SIMD dentro de cualquier trabajador añadiría otro nivel de ejecución paralela.

  8. 8
    DesafíoClasifica el nivel elegido

    Una CPU multinúcleo con control independiente usa sumas vectoriales dentro de cada núcleo. ¿Cuáles son las clases entre núcleos y dentro de una suma vectorial?

    ---reveal---

    Los núcleos forman hardware MIMD porque eligen instrucciones de forma independiente. Cada suma vectorial es SIMD porque una instrucción opera sobre varios elementos de datos. Una sola máquina puede tener ambas descripciones cuando se refieren a distintos niveles.

  9. 9
    ExplicaciónMantén preparado el estado de ejecución

    Un contexto de hilo de hardware almacena un contador de programa y registros. Varios contextos pueden compartir las unidades aritméticas y las cachés de un núcleo. Cuando una solicitud de memoria detiene un hilo, otro hilo preparado puede llenar la capacidad de ejecución inactiva. El sistema operativo ve cada contexto como un procesador lógico. Dos contextos en un núcleo siguen compartiendo los recursos físicos de ejecución de ese núcleo.

  10. 10
    ExplicaciónElige cuándo comparten el núcleo los hilos

    El multihilo de grano fino selecciona un hilo preparado en cada ciclo. El multihilo de grano grueso cambia después de una parada larga y asume los costes del cambio y del rellenado del cauce de segmentación. SMT va más allá en un núcleo de emisión múltiple: las instrucciones de distintos hilos pueden emitirse durante el mismo ciclo. Los tres dependen de que haya trabajo útil preparado; ninguno proporciona capacidad aritmética adicional ilimitada.

  11. 11
    EjemploPrimero mide el intervalo inactivo

    Un hilo calcula durante 20 ciclos y después espera 200. Su periodo es de 220 ciclos, por lo que el tiempo activo es 20/220≈9,1%. Una espera larga deja la mayoría de los ciclos sin usar cuando no hay otro hilo disponible. Mantén el periodo completo de cálculo más espera en el denominador. Dividir solo por la espera describiría una proporción distinta, no la fracción de ciclos transcurridos que realizan trabajo útil.

  12. 12
    EjemploLlena el intervalo con ráfagas preparadas

    Con cuatro hilos escalonados libremente, cada uno aportando 20 ciclos de cálculo por periodo de 220 ciclos, la utilización ideal es 80/220≈36,4%. Once hilos pueden llenar el periodo: mientras uno espera 200 ciclos, los otros diez aportan 200 ciclos de cálculo. Este modelo ideal tiene cambios sin coste y ninguna contención adicional; la competencia real por el ancho de banda y la caché puede dejar menos trabajo útil preparado.

  13. 13
    Desafío¿Lo resolvería otro contexto?

    Las unidades aritméticas de un núcleo ya están totalmente ocupadas y sus dos hilos necesitan esas mismas unidades. ¿Proporcionaría añadir otro hilo de hardware la capacidad de otro núcleo? Explícalo usando el recurso que comparten.

    ---reveal---

    No. Un nuevo contexto proporciona otro flujo de instrucciones, pero sigue compartiendo las unidades de ejecución ocupadas. Otro núcleo completo añade hardware de ejecución. El multihilo resulta más útil cuando llena la capacidad que las paradas o la escasez de instrucciones preparadas dejan sin usar.

  14. 14
    ConexiónRelaciona la mejora del servicio con su causa

    El servicio añade contextos de hardware y ahora completa más solicitudes independientes por segundo, mientras que el trabajo de CPU de cada solicitud tarda un poco más. Ese resultado es coherente con una mejora de la productividad: las solicitudes preparadas llenan posiciones inactivas mientras comparten recursos. Sería engañoso llamarlo una mejora de la latencia de una sola solicitud. Elige una medida de rendimiento que corresponda al trabajo que los usuarios necesitan completar.

  15. 15
    RepasoToma la primera decisión de hardware

    Para una nueva carga de trabajo, identifica primero instrucciones, elementos de datos, hilos o solicitudes independientes. Después localiza el nivel de hardware que controla sus flujos de instrucciones. Si la ganancia propuesta proviene de contextos adicionales, examina qué paradas dejan capacidad disponible y qué recursos comparten los contextos. Esto proporciona una base concreta para elegir más núcleos, operaciones más anchas o más hilos preparados antes de medir el resultado.

2

Encuentra el límite antes de añadir procesadores

16 pasos
Resuelve ejemplos de aceleración con tamaño fijo, cargas de trabajo escaladas y un núcleo de cálculo limitado por el ancho de banda.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónTres razones por las que el hardware adicional puede decepcionar
  2. 2
    ExplicaciónElige el tiempo de referencia
  3. 3
    EjemploDivide solo la parte paralelizable
  4. 4
    Idea claveLa parte fija se convierte en el límite global
  5. 5
    Desafío¿Es posible alcanzar el objetivo de aceleración?
  6. 6
    ExplicaciónMantén clara la pregunta sobre la carga de trabajo
  7. 7
    EjemploUsa la fracción de la ejecución paralela
  8. 8
    EjemploEspera al trabajador más ocupado
  9. 9
    Desafío¿Cuándo aumenta el tiempo al añadir núcleos?
  10. 10
    ExplicaciónCuenta los bytes que salen de la memoria
  11. 11
    EjemploConstruye los dos techos
  12. 12
    ExplicaciónLa reutilización desplaza el núcleo de cálculo hacia la derecha
  13. 13
    Desafío¿Qué mejora eleva el límite actual?
  14. 14
    DesafíoUn núcleo de cálculo rápido dentro de un programa lento
  15. 15
    ConsejoHaz reproducible la ganancia comunicada
  16. 16
    RepasoElige la siguiente medición
3

Convierte un bucle sobre un arreglo en trabajo para GPU

22 pasos
Cuenta elementos SIMD, divide un bucle vectorial en tramos y construye una asignación a GPU con comprobación de límites y cooperación correcta.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónEmpieza con elementos independientes de un arreglo
  2. 2
    EjemploCuenta los elementos antes que las instrucciones
  3. 3
    ExplicaciónColoca los valores unos junto a otros
  4. 4
    ExplicaciónSelecciona elementos con una máscara
  5. 5
    Desafío¿Pueden empezar juntas todas las iteraciones?
  6. 6
    ExplicaciónDeja que la longitud activa describa la pasada
  7. 7
    EjemploDivide un vector largo en pasadas
  8. 8
    ConexiónAlimenta una operación vectorial con otra
  9. 9
    DesafíoAvanza según lo que realmente se ejecutó
  10. 10
    ExplicaciónPlanifica un grupo de hilos mientras otro espera
  11. 11
    EjemploLos caminos diferentes desperdician carriles activos
  12. 12
    ExplicaciónHaz que una transacción sirva a muchos hilos
  13. 13
    DesafíoIncluye el traslado al dispositivo
  14. 14
    ConexiónEspecializa para una carga de trabajo más concreta
  15. 15
    EjemploEncuentra el elemento del arreglo de un hilo
  16. 16
    EjemploCubre el bloque parcial final
  17. 17
    ExplicaciónEspera antes de que el sistema anfitrión use los resultados
  18. 18
    EjemploReduce dentro de un bloque
  19. 19
    Desafío¿Puede un bloque esperar a todos los demás?
  20. 20
    Idea claveUna reducción cambia el orden aritmético
  21. 21
    DesafíoCombina una asignación segura con un acceso eficiente
  22. 22
    RepasoComprueba el recorrido completo del arreglo
4

Sigue un bloque compartido desde el lector hasta quien escribe

19 pasos
Divide una suma, sigue los permisos de caché y diagnostica la interferencia entre contadores independientes.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónLas variables compartidas siguen necesitando coordinación
  2. 2
    ExplicaciónUn espacio de direcciones, distintas rutas de acceso
  3. 3
    EjemploTermina el trabajo local antes de combinar
  4. 4
    Desafío¿Qué ocurre ante una escritura intermedia?
  5. 5
    EjemploEncuentra el acierto de caché con datos desactualizados
  6. 6
    ExplicaciónCoincide en el historial de una posición
  7. 7
    Desafío¿Puede la coherencia conservar ambos incrementos?
  8. 8
    ConexiónMantén el orden separado de la propiedad
  9. 9
    ExplicaciónInterpreta los permisos de MSI
  10. 10
    EjemploDa primero copias limpias a ambos núcleos
  11. 11
    EjemploTransfiere la propiedad a quien escribe
  12. 12
    Idea claveEl estado exclusivo elimina una solicitud para datos privados
  13. 13
    DesafíoSigue una lectura y dos escrituras
  14. 14
    ExplicaciónEnvía la solicitud a través del nodo de origen
  15. 15
    EjemploConvierte los bits antes de medir el sobrecoste
  16. 16
    EjemploEncuentra qué bytes comparten la propiedad
  17. 17
    Desafío¿Necesita escribir quien lee la variable vecina?
  18. 18
    DesafíoReduce la contención de una suma correcta
  19. 19
    RepasoExamina tanto el programa como el bloque
5

Sigue los datos, la energía y las respuestas lentas en un conjunto de servidores

14 pasos
Compara cortes de red, calcula la energía de la instalación y descubre por qué los grandes servicios planifican para eventos poco frecuentes.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónAhora un nodo es una computadora completa
  2. 2
    ExplicaciónSitúa el trabajo cerca de su entrada
  3. 3
    EjemploCombina sumas parciales en rondas de mensajes
  4. 4
    ExplicaciónCuenta el corte estrecho
  5. 5
    DesafíoAsume el coste de una red más amplia
  6. 6
    ExplicaciónComparte los enlaces ascendentes
  7. 7
    EjemploIncluye la refrigeración y la distribución
  8. 8
    EjemploConvierte la potencia constante en energía anual
  9. 9
    Desafío¿Qué eficiencia mejoró el cambio?
  10. 10
    EjemploUna carga baja sigue consumiendo potencia
  11. 11
    ExplicaciónLas pequeñas tasas de fallo se suman en todo el conjunto
  12. 12
    EjemploUna respuesta lenta puede retrasar la solicitud
  13. 13
    Desafío¿Acortarán más servidores todas las solicitudes?
  14. 14
    RepasoElige una métrica del conjunto de servidores con un propósito

Ejercicios de Procesadores paralelos y multinúcleo

50 Preguntas de Práctica en 5 sets

Set 1: Reconoce el trabajo paralelo y sus costes10 Preguntas de Práctica

Pregunta 1 de 10

Un servicio web asigna solicitudes independientes de descarga de imágenes a distintos servidores. ¿Qué tipo de paralelismo se utiliza?
  1. Paralelismo a nivel de instrucciones
  2. Paralelismo a nivel de solicitudes
  3. Paralelismo a nivel de datos
  4. Multihilo de grano fino
Mostrar respuestaOcultar respuesta
Respuesta: B
Cada servidor atiende una solicitud distinta, por lo que el trabajo paralelo proviene de tareas independientes. El paralelismo a nivel de datos aplicaría la misma operación a muchos elementos dentro de un cálculo; atender solicitudes diferentes no requiere que avancen mediante una misma instrucción compartida.

Pregunta 2 de 10

Todos los procesadores coinciden en el orden de las escrituras en una posición de memoria. ¿Qué propiedad de coherencia es esta?
  1. Propagación de escrituras
  2. Consistencia secuencial
  3. Lectura, modificación y escritura atómicas
  4. Serialización de escrituras
Mostrar respuestaOcultar respuesta
Respuesta: D
La serialización de escrituras da a todos los procesadores el mismo orden para las escrituras en una posición. La consistencia secuencial restringe además la intercalación global de operaciones entre distintas posiciones y conserva el orden de programa de cada procesador. Coincidir solo en el historial de escrituras de una posición es una propiedad más limitada.

Pregunta 3 de 10

Una tarea tarda 144 s con la mejor implementación secuencial y 24 s con ocho procesadores. ¿Cuál es su eficiencia paralela?
  1. 75%
  2. 16,7 %
  3. 60%
  4. 80%
Mostrar respuestaOcultar respuesta
Respuesta: A
El factor de aceleración es la relación de tiempos, 144/24 = 6. La eficiencia divide esa ganancia entre los ocho procesadores, lo que da 6/8=0,75, es decir, el 75 %. El 16,7 % se obtiene al dividir el tiempo paralelo por el secuencial, lo que mide la fracción de tiempo restante en lugar de la eficiencia.

Pregunta 4 de 10

Un núcleo de cálculo tiene una intensidad de 3 FLOP por byte en hardware con una capacidad máxima de cálculo de 720 GFLOP/s y un ancho de banda de DRAM de 80 GB/s. ¿Qué límite del modelo de techo de rendimiento se aplica?
  1. 720 GFLOP/s
  2. 960 GFLOP/s
  3. 240 GFLOP/s
  4. 26,7 GFLOP/s
Mostrar respuestaOcultar respuesta
Respuesta: C
El techo de ancho de banda es 80×3=240 GFLOP/s, por debajo del techo de cálculo de 720 GFLOP/s. El techo inferior establece el límite. Elegir solo la capacidad máxima de cálculo supone que los datos pueden llegar con suficiente rapidez para sostenerla, pero este núcleo de cálculo necesitaría muchos más bytes por segundo de los que proporciona la memoria.

Pregunta 5 de 10

¿Cuántos elementos de 64 bits caben en un registro SIMD de 512 bits?
  1. 4 elementos
  2. 16 elementos
  3. 8 elementos
  4. 64 elementos
Mostrar respuestaOcultar respuesta
Respuesta: C
Divide la anchura del registro por la anchura de un elemento: 512/64 = 8. El número de carriles depende tanto del tamaño del elemento como del tamaño del registro. Dieciséis carriles alojarían valores de 32 bits, por lo que usar esa cantidad para valores de 64 bits asignaría solo la mitad del espacio necesario por elemento.

Pregunta 6 de 10

Dos grupos de hilos de una GPU toman caminos opuestos en un if-else. Dentro de cada grupo, todos los hilos coinciden en el camino. ¿Qué ocurre con la divergencia de saltos?
  1. Ambos grupos ejecutan todas las ramas.
  2. Ninguno de los grupos diverge internamente.
  3. La mitad de cada grupo queda inactiva.
  4. Cada grupo se divide en dos grupos.
Mostrar respuestaOcultar respuesta
Respuesta: B
La divergencia se determina dentro de un grupo de hilos, donde se comparte la emisión de instrucciones. Cada grupo descrito tiene una condición uniforme y puede ejecutar solo su propio camino. Distintos grupos pueden seguir caminos diferentes sin obligar a ninguno a ejecutar ambas ramas con la mitad de sus carriles desactivados mediante máscaras.

Pregunta 7 de 10

Una carga de trabajo NUMA realiza el 60 % de sus accesos en 75 ns y el resto en 135 ns. ¿Cuál es la latencia media de acceso?
  1. 99 ns
  2. 105 ns
  3. 81 ns
  4. 135 ns
Mostrar respuestaOcultar respuesta
Respuesta: A
Pondera cada latencia según su proporción de accesos: 0,6×75+0,4×135=45+54=99 ns. Una media sin ponderar da 105 ns, pero eso requeriría el mismo número de accesos locales y remotos. Aquí los accesos locales más rápidos ocurren con mayor frecuencia.

Pregunta 8 de 10

Dos hilos leen ambos el valor 9 de un contador coherente y después almacenan ambos 10 tras un incremento normal. ¿Qué propiedad le falta al incremento?
  1. Propagación de escrituras
  2. Serialización de escrituras
  3. Replicación de caché
  4. Atomicidad
Mostrar respuestaOcultar respuesta
Respuesta: D
El incremento consta de una lectura y una escritura separada, por lo que ambos hilos pueden leer nueve antes de que cualquiera almacene diez. La coherencia puede serializar correctamente ambas escrituras de diez y aun así perder un incremento. Una operación atómica de lectura, modificación y escritura hace que cada actualización completa sea indivisible para el otro hilo.

Pregunta 9 de 10

En MSI básico, A y B empiezan en estado inválido para un bloque que contiene 4. A lee, A escribe 7 y después B lee. ¿Cuáles son los estados finales de A/B y el valor que lee B?
  1. M/S, con B leyendo 7
  2. S/S, con B leyendo 7
  3. I/S, con B leyendo 4
  4. S/S, con B leyendo 4
Mostrar respuestaOcultar respuesta
Respuesta: B
A carga primero el bloque en estado compartido y después adquiere la propiedad en estado modificado para escribir siete. La lectura posterior de B hace que A proporcione el valor modificado y pase a compartido; B también recibe el estado compartido. Dejar A en modificado entraría en conflicto con la regla de MSI básico según la cual un bloque modificado no tiene ninguna otra copia válida en caché.

Pregunta 10 de 10

Un anillo de 20 nodos tiene enlaces con un ancho de banda igual de 5 Gbit/s. Usando un valor de capacidad por enlace, ¿cuál es su ancho de banda de bisección?
  1. 10 Gbit/s
  2. 100 Gbit/s
  3. 50 Gbit/s
  4. 5 Gbit/s
Mostrar respuestaOcultar respuesta
Respuesta: A
El corte mínimo en mitades iguales de un anillo atraviesa dos enlaces, por lo que su capacidad es 2×5=10 Gbit/s. El total de 100 Gbit/s cuenta los veinte enlaces y describe la capacidad agregada. No puede transportar todo ese tráfico a través de los dos enlaces que separan las mitades.
Set 2: Aplica reglas de escalabilidad, indexación y coherencia10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Un núcleo emite instrucciones de dos hilos distintos durante el mismo ciclo. ¿Qué técnica de hardware describe esto?
  1. Multihilo de grano grueso
  2. Multihilo de grano fino
  3. Multihilo simultáneo
  4. Tiempo compartido del sistema operativo
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una tarea de tamaño fijo dedica el 20 % de su tiempo secuencial a trabajo que no puede paralelizarse. Si el resto se divide idealmente entre cuatro procesadores, ¿qué factor de aceleración resulta?
  1. 2,5
  2. 3,2
  3. 4,0
  4. 5,0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una simulación aumenta de dos millones de celdas en cuatro procesadores a cuatro millones de celdas en ocho procesadores, manteniendo fijo el trabajo por celda. ¿Qué experimento de escalabilidad es este?
  1. Escalabilidad fuerte
  2. Escalabilidad superlineal
  3. Escalabilidad con carga de trabajo fija
  4. Escalabilidad débil
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

A un bucle RVV le quedan 90 elementos. Su implementación elige longitudes activas sucesivas de 32, 32 y 26. ¿Cuántos elementos debe avanzar el código después de su segunda pasada?
  1. 26 elementos
  2. 32 elementos
  3. 64 elementos
  4. 90 elementos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un arreglo tiene 4103 elementos. Un núcleo de cálculo procesa un elemento por hilo y usa 128 hilos por bloque. ¿Cuántos bloques se necesitan?
  1. 33 bloques
  2. 32 bloques
  3. 34 bloques
  4. 129 bloques
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Seis núcleos ejecutan cada uno una copia de un programa. Eligen instrucciones de forma independiente y procesan distintas regiones de un arreglo. ¿Cuál es la clase del hardware?
  1. SIMD
  2. SISD
  3. MISD
  4. MIMD
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

En MESI, A lee un bloque que no está en caché, escribe en él, vuelve a escribir y después B lo lee. Ambas copias empiezan en estado inválido. ¿Cuántas solicitudes de coherencia por el bus ocurren en esta secuencia?
  1. 1 solicitud
  2. 3 solicitudes
  3. 2 solicitudes
  4. 4 solicitudes
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un directorio completo usa un bit de presencia por núcleo para cada bloque de datos de 128 bytes. Con 128 núcleos, ¿cuál es el sobrecoste de almacenamiento del vector de presencia por sí solo?
  1. 1,56 %
  2. 12,5 %
  3. 16%
  4. 100%
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Cuarenta y ocho nodos de un clúster ya tienen partes iguales de 960 000 valores. Un árbol binario combina una suma local por nodo. ¿Cuántos valores hay por nodo y cuántas rondas de combinación se necesitan?
  1. 20 000 valores y 48 rondas
  2. 46 080 000 valores y 6 rondas
  3. 20 000 valores y 5 rondas
  4. 20 000 valores y 6 rondas
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un bastidor tiene 24 servidores con enlaces de 25 Gbit/s y seis enlaces ascendentes de 50 Gbit/s. Con un reparto equitativo cuando todos los servidores envían datos fuera del bastidor a la vez, ¿cuáles son la proporción de sobresuscripción y la tasa por servidor?
  1. 2:1 y 25 Gbit/s
  2. 4:1 y 6,25 Gbit/s
  3. 2:1 y 12,5 Gbit/s
  4. 1:2 y 50 Gbit/s
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 3: Diagnostica los límites de rendimiento en todo el sistema10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

La capacitancia permanece fija mientras la tensión baja al 90 % y la frecuencia al 80 % de sus valores originales. ¿Qué fracción de la potencia dinámica original queda?
  1. 0,720
  2. 0,810
  3. 0,5832
  4. 0,648
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un solo núcleo superescalar sigue un flujo de instrucciones y solapa instrucciones escalares independientes. ¿Cómo se clasifica en la taxonomía de Flynn?
  1. SIMD
  2. SISD
  3. MIMD
  4. MISD
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Seis núcleos reciben inicialmente 35, 35, 35, 35, 35 y 65 tareas de igual coste, respectivamente. Un planificador traslada diez tareas del núcleo más ocupado a cada uno de los otros cinco. Sin sobrecoste y con una tarea por unidad de tiempo por núcleo, ¿cómo cambia el factor de aceleración respecto a la ejecución secuencial?
  1. De aproximadamente 3,69 a 5,33
  2. De aproximadamente 3,69 a 6,00
  3. De exactamente 6,00 a 5,33
  4. De exactamente 4,00 a 5,33
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una máquina alcanza un máximo de 960 GFLOP/s y 120 GB/s. Un núcleo de cálculo realiza 12 GFLOP y transfiere 3 GB desde la DRAM. El procesamiento por bloques reduce el tráfico a la mitad sin cambiar el trabajo. ¿Qué ocurre con el límite del modelo de techo de rendimiento?
  1. Aumenta de 480 a 1920 GFLOP/s.
  2. Permanece fijo en 480 GFLOP/s.
  3. Aumenta de 480 a 960 GFLOP/s.
  4. Aumenta de 240 a 480 GFLOP/s.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un bucle calcula a[i] = a[i-1] + b[i] de izquierda a derecha. ¿Por qué el compilador no puede sustituir directamente iteraciones consecutivas por carriles SIMD independientes?
  1. Cada iteración lee valores de dos arreglos diferentes.
  2. Cada iteración necesita el nuevo resultado de la iteración anterior.
  3. Cada iteración contiene más de una entrada aritmética.
  4. Cada iteración almacena su resultado en un arreglo contiguo.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

A un bucle RVV le quedan 50 números de doble precisión y tiene capacidad para 32. La implementación devuelve vl = 28. El programador avanza ambos punteros 32 elementos y resta 32 del número restante. ¿Cuál es el primer intervalo de datos perdidos?
  1. Índices originales del 0 al 27
  2. Índices originales del 32 al 49
  3. Índices originales del 24 al 27
  4. Índices originales del 28 al 31
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

En un sistema NUMA, ¿por qué dos accesos a una misma dirección compartida pueden tener distinta latencia desde diferentes zócalos?
  1. La dirección puede ser local para un zócalo y remota para otro.
  2. Cada zócalo debe asignar un valor numérico distinto a la dirección.
  3. Cada zócalo debe usar un espacio de direcciones de aplicación separado.
  4. La dirección debe evitar todas las cachés privadas de la máquina.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Con bloques de 64 bytes, A escribe repetidamente un contador de 8 bytes en 0x2040; B lee repetidamente un valor de estado independiente de 8 bytes en 0x2078. ¿Por qué puede B sufrir fallos de coherencia?
  1. Las variables ocupan bloques adyacentes, así que cada lectura busca ambos bloques.
  2. Ambos hilos escriben el mismo contador, así que se pierde un incremento.
  3. Ambas variables ocupan el bloque 129 y las escrituras de A invalidan la copia de B.
  4. El lector necesita la propiedad en estado modificado antes de leer el estado.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una suma vectorial de 72 elementos se ejecuta en seis carriles. Sin contar el inicio, ¿cuántos ciclos se necesitan para las operaciones sobre los elementos?
  1. 6 ciclos
  2. 72 ciclos
  3. 12 ciclos
  4. 432 ciclos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Los equipos informáticos consumen una potencia constante de 8 MW y el sobrecoste de la instalación añade 2 MW. ¿Cuál es la PUE?
  1. 1,25
  2. 0,25
  3. 0,80
  4. 4,00
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 4: Combina el comportamiento del hardware con modelos de rendimiento10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Una máquina tiene 12 núcleos y dos hilos de hardware por núcleo. ¿Cuántos procesadores lógicos son visibles y cuántos núcleos físicos hay?
  1. 24 procesadores lógicos y 12 núcleos
  2. 24 procesadores lógicos y 24 núcleos
  3. 12 procesadores lógicos y 24 núcleos
  4. 12 procesadores lógicos y 12 núcleos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un sistema de un solo núcleo alterna entre dos tareas de larga duración sin ejecutar nunca sus instrucciones en el mismo instante. ¿Cómo debe describirse su ejecución?
  1. Paralela pero no concurrente
  2. Paralela y concurrente
  3. Concurrente pero no paralela
  4. Ni paralela ni concurrente
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Un núcleo de cálculo de baja intensidad ya satura el ancho de banda de DRAM y se ejecuta en su límite del modelo de techo de rendimiento. La anchura SIMD se duplica mientras el ancho de banda y la intensidad permanecen fijos. ¿Cómo cambia su límite?
  1. Se duplica.
  2. Se reduce a la mitad.
  3. Aumenta según la intensidad original.
  4. Permanece igual.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un núcleo de cálculo de reducción usa if (i < n) { load_into_shared(); __syncthreads(); combine(); }. En su último bloque solo algunos hilos cumplen la condición. ¿Qué corrección estructural hace segura la barrera del bloque?
  1. Eliminar la comprobación de límites para que todos los hilos del bloque carguen un elemento del arreglo.
  2. Permitir que todos los hilos del bloque lleguen a la barrera, con valores neutros para las entradas inactivas.
  3. Sustituir la barrera del bloque por una espera del sistema anfitrión después del lanzamiento.
  4. Colocar una segunda barrera idéntica dentro de la misma rama condicional.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una CPU tarda 36 ms por lote. Una GPU discreta necesita una transferencia de subida de 500 MB, después tres núcleos de cálculo de 4 ms y luego una transferencia de bajada de 100 MB. Las transferencias alcanzan 15 GB/s, no pueden solaparse con el cálculo y el coste de lanzamiento es insignificante. ¿Qué opción es más rápida y por cuánto?
  1. La GPU es más rápida por 24 ms.
  2. La CPU es más rápida por 16 ms.
  3. La CPU es más rápida por 4 ms.
  4. La GPU es más rápida por 16 ms.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Treinta y dos núcleos se reparten 32 000 valores por igual. Cada hilo empieza en cero y suma los valores asignados; después, un árbol binario combina las sumas parciales. Cada suma cuesta una unidad de tiempo y cada etapa del árbol también tiene una barrera de dos unidades. Sin otros costes, ¿qué factor de aceleración resulta con respecto a una suma secuencial que empieza en cero?
  1. Aproximadamente 31,53
  2. Aproximadamente 31,84
  3. Aproximadamente 31,69
  4. Exactamente 32,00
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un núcleo usa una caché de escritura directa. Otro núcleo ya tiene una copia limpia en caché de la misma dirección. ¿Por qué sigue siendo necesario un mecanismo de coherencia después de que el primer núcleo escriba?
  1. La escritura directa impide que el primer núcleo actualice la memoria.
  2. Una copia limpia en caché nunca puede volverse inválida.
  3. El segundo núcleo debe descartar todos los bloques de caché en cada lectura.
  4. Actualizar solo la memoria deja desactualizada la otra copia en caché.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

En MESI, A lee un bloque que no está en caché, B lo lee, A escribe 3, A escribe 6 y B vuelve a leer. ¿Cuántas solicitudes de bus ocurren y qué valor obtiene la lectura final de B?
  1. 3 solicitudes, que devuelven 6
  2. 5 solicitudes, que devuelven 6
  3. 4 solicitudes, que devuelven 6
  4. 4 solicitudes, que devuelven 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Dos instalaciones tienen la misma PUE. Una tiene servidores mayormente inactivos; la otra completa mucho más trabajo con su energía informática. ¿Qué establece que tengan la misma PUE?
  1. Que coinciden sus cálculos útiles por julio.
  2. Que coinciden sus cantidades totales de energía de la instalación.
  3. Que coinciden sus porcentajes de utilización de servidores.
  4. Que coinciden sus relaciones entre energía de la instalación e informática.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Ocho núcleos de CPU controlados independientemente ejecutan cada uno una suma SIMD de ocho carriles en un ciclo. ¿Cómo deben describirse los dos niveles?
  1. SIMD entre núcleos y SISD dentro de cada suma
  2. SISD entre núcleos y MIMD dentro de cada suma
  3. MIMD entre núcleos y SIMD dentro de cada suma
  4. MISD entre núcleos y SIMD dentro de cada suma
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 5: Aplica los modelos a nuevas decisiones de diseño10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Una ejecución ideal con carga de trabajo fija alcanza un factor de aceleración de 4 con ocho procesadores. Después, su trabajo secuencial se hace dos veces más rápido y el trabajo paralelo permanece sin cambios. ¿Qué factor de aceleración alcanza la nueva ejecución con ocho procesadores respecto a la referencia secuencial original?
  1. 4,0
  2. 5,6
  3. 4,67
  4. 8,0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

El diseño A tiene cuatro núcleos con dos contextos de hardware cada uno; el diseño B tiene dos núcleos con ocho contextos cada uno. Cada hilo repite 15 ciclos de cálculo seguidos de 105 ciclos de espera. Cada núcleo puede realizar un paso de cálculo por ciclo. Con escalonamiento ideal, cambios sin coste y sin contención de memoria, ¿cómo se comparan sus productividades de cálculo en régimen estable?
  1. A ofrece el doble de productividad que B.
  2. Ambos ofrecen la misma productividad.
  3. B ofrece el doble de productividad que A.
  4. B ofrece cuatro veces la productividad de A.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una carga de trabajo fija debe alcanzar un factor de aceleración de al menos 12 con dieciséis procesadores bajo la escalabilidad ideal de Amdahl. ¿Cuál es la mayor fracción secuencial permitida de su tiempo original?
  1. 1/45, aproximadamente el 2,22 %
  2. 1/12, aproximadamente el 8,33 %
  3. 1/16, aproximadamente el 6,25 %
  4. 1/15, aproximadamente el 6,67 %
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una tarea totalmente divisible tiene el modelo de tiempo medido Tp=288/p+2p segundos. Puedes usar 8, 12, 16 o 24 procesadores. ¿Qué asignación termina antes?
  1. 8 procesadores
  2. 16 procesadores
  3. 24 procesadores
  4. 12 procesadores
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un bucle suma dos arreglos de 1237 números de coma flotante usando instrucciones SIMD de 256 bits. Primero se procesan los vectores completos y después una parte final escalar. ¿Cuántas iteraciones completas y elementos escalares se necesitan?
  1. 155 iteraciones vectoriales y 3 elementos escalares
  2. 154 iteraciones vectoriales y 8 elementos escalares
  3. 153 iteraciones vectoriales y 5 elementos escalares
  4. 154 iteraciones vectoriales y 5 elementos escalares
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un anillo de 16 nodos y una red completamente conectada de 16 nodos usan ambos enlaces de 10 Gbit/s. Con un valor de capacidad por enlace, ¿qué ganancia de capacidad de bisección proporciona la conexión completa y cuántos enlaces adicionales necesita?
  1. 32 veces la capacidad, con 120 enlaces adicionales
  2. 32 veces la capacidad, con 104 enlaces adicionales
  3. 8 veces la capacidad, con 104 enlaces adicionales
  4. 7,5 veces la capacidad, con 104 enlaces adicionales
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Qué grupo de hardware contiene 32 hilos que comparten la emisión de instrucciones en el modelo de ejecución SIMT de NVIDIA?
  1. Un bloque de hilos
  2. Un multiprocesador de flujos
  3. Un grupo de hilos
  4. Un núcleo CUDA
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un núcleo de cálculo con comprobación de límites que procesa un elemento por hilo lanza 37 bloques de 64 hilos para un arreglo de 2350 elementos. ¿Cuántos hilos del último bloque acceden a elementos válidos y cuál es su último índice de hilo válido dentro de ese bloque?
  1. 46 hilos; último índice local 45
  2. 46 hilos; último índice local 46
  3. 18 hilos; último índice local 17
  4. 47 hilos; último índice local 46
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una caché tiene un bloque en estado exclusivo según MESI. Su procesador escribe en el bloque mientras ningún otro núcleo accede a él. ¿Qué estado y solicitud de coherencia resultan?
  1. Modificado, sin solicitud de bus
  2. Compartido, con una lectura por el bus
  3. Modificado, con una solicitud de promoción
  4. Exclusivo, con una solicitud de actualización en escritura
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Dos contadores independientes de 8 bytes ocupan 0x3000 y 0x3038 con bloques de caché de 64 bytes. Cada uno tiene su propio hilo que escribe. ¿Qué desplazamiento los separa en distintos bloques?
  1. Mover el segundo contador a 0x3020.
  2. Mover el segundo contador a 0x3040.
  3. Mover el primer contador a 0x3008.
  4. Mover el segundo contador a 0x3010.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

100 Términos Clave, cada uno con su definición

A

Acceso con paso constante
Un acceso con paso constante visita elementos sucesivos con una separación fija entre direcciones, como la distancia entre entradas de una columna de matriz.
Un acceso con paso constante que baja por una matriz de doble precisión de 100 columnas avanza 800 bytes entre entradas vecinas de la columna.
Acceso indexado
Un acceso indexado obtiene las direcciones de los elementos a partir de índices, lo que permite recopilaciones y dispersiones vectoriales irregulares más allá de los pasos fijos.
Un acceso indexado puede buscar las entradas seleccionadas de un arreglo indicadas por una lista irregular de posiciones.
Acceso no uniforme a memoria (NUMA)
NUMA es una organización de memoria compartida en la que el coste de acceso a memoria depende de la ubicación del procesador con respecto a los datos.
Una carga de trabajo NUMA puede reducir la latencia media al situar las páginas usadas con frecuencia cerca de los hilos que acceden a ellas.
Acceso uniforme a memoria (UMA)
UMA es una organización de memoria compartida con un tiempo de acceso aproximadamente uniforme desde sus procesadores a las posiciones de memoria.
Una máquina UMA pequeña presenta rutas de acceso a memoria similares sin una distinción entre zócalo local y remoto.
Aceleración superlineal
La aceleración superlineal es un factor de aceleración medido que supera el número de procesadores, posible cuando la partición paralela también reduce el coste del trabajo.
Que los datos quepan mejor en caché puede producir una aceleración superlineal cuando cada partición evita los fallos de DRAM de la ejecución secuencial.
Acelerador de dominio específico
Un acelerador de dominio específico especializa el hardware para una carga de trabajo restringida y sacrifica flexibilidad a cambio de un alto rendimiento por vatio en ese dominio.
Un acelerador de dominio específico orientado a matrices puede favorecer la multiplicación de baja precisión para el trabajo con redes neuronales.
Ancho de banda de bisección
El ancho de banda de bisección es la menor capacidad total de los enlaces a través de un corte que divide los nodos de una red en dos grupos de igual tamaño.
Un anillo tiene solo dos enlaces a través de un corte mínimo, por lo que su ancho de banda de bisección puede limitar el tráfico entre mitades.
Ancho de banda del enlace
El ancho de banda del enlace es la tasa de datos disponible en un enlace de red, medida según una convención coherente de capacidad por dirección.
Una topología con más enlaces puede tener una mayor capacidad total incluso cuando el ancho de banda de cada enlace permanece sin cambios.
Anchura del registro vectorial (VLEN)
VLEN es la anchura en bits de los registros vectoriales de una implementación RVV, distinta del número de elementos activos y del número de carriles de ejecución paralelos.
Una VLEN mayor puede contener más elementos, mientras que el programa sigue avanzando según la longitud activa que recibe.

Á

Árbol de reducción
Un árbol de reducción combina resultados parciales en etapas paralelas sucesivas y reduce muchos valores a uno mediante un camino dependiente corto.
Un árbol de reducción combina 32 sumas parciales en cinco etapas de emparejamiento en lugar de 31 sumas consecutivas.

B

Barrera de sincronización
Una barrera de sincronización es un punto al que deben llegar todos los hilos participantes antes de que cualquiera continúe a la siguiente fase.
Una barrera entre etapas de reducción impide que un trabajador lea una suma parcial antes de que se escriba.
Bloque de hilos
Un bloque de hilos es un grupo de hilos de GPU que pueden cooperar mediante memoria compartida y sincronizarse con una barrera de todo el bloque.
Un bloque de hilos puede combinar sus sumas parciales, mientras que un núcleo de cálculo posterior combina los resultados de bloques separados.

C

Carril SIMD
Un carril SIMD es una posición de elemento y el trabajo aritmético asociado a ella dentro de una operación ancha controlada por una instrucción compartida.
Una suma de 256 bits tiene ocho carriles SIMD para números de coma flotante de 32 bits, pero cuatro para números de doble precisión de 64 bits.
Clúster
Un clúster es un conjunto de sistemas informáticos completos conectados por una red, cada uno con su propia memoria y sistema operativo.
Un clúster distribuye un arreglo grande entre nodos y combina sus resultados locales mediante mensajes de red.
Coalescencia de accesos a memoria
La coalescencia de accesos a memoria combina accesos cercanos a memoria de hilos vecinos en un pequeño número de transacciones anchas para usar el ancho de banda de forma eficiente.
La coalescencia funciona bien cuando los hilos consecutivos de un grupo leen elementos consecutivos de 4 bytes de un arreglo.
Coherencia de caché
La coherencia de caché coordina las copias de una posición para que los procesadores observen un historial compatible de sus escrituras y valores de lectura.
La coherencia de caché impide que un lector use indefinidamente una copia privada desactualizada después de que otro núcleo la actualice.
Compartición verdadera
La compartición verdadera ocurre cuando los procesadores se comunican mediante la misma palabra de memoria, de modo que su interacción de coherencia afecta a los mismos datos.
Un productor escribe un valor que lee un consumidor, lo que crea compartición verdadera de esa variable de comunicación.
Comprobación de límites
Una comprobación de límites verifica que un índice calculado esté dentro del rango de datos válido antes de que un hilo realice el acceso a memoria asociado.
Cuando una cuadrícula se redondea hacia arriba a bloques completos, una comprobación de límites desactiva los hilos adicionales del último bloque sin omitir elementos válidos.
Concurrencia
La concurrencia es el avance de múltiples tareas durante periodos que se solapan, lo que incluye trabajar por turnos en un recurso de ejecución.
Un sistema operativo de un solo núcleo permite la concurrencia al alternar entre una descarga y un editor.
Consistencia secuencial
La consistencia secuencial requiere resultados que coincidan con una intercalación de las operaciones de todos los procesadores que conserve el orden de programa de cada uno.
La consistencia secuencial restringe el historial combinado sin exigir que los procesadores se ejecuten a la misma velocidad.

D

Dependencia entre iteraciones de un bucle
Una dependencia entre iteraciones de un bucle ocurre cuando una iteración requiere un valor producido por otra, lo que restringe su orden de ejecución.
Una recurrencia acumulativa tiene una dependencia entre iteraciones de un bucle porque cada nuevo valor usa el resultado anterior.
Directorio de coherencia
Un directorio de coherencia registra el estado de coherencia de los bloques de memoria y las cachés que los contienen para enviar solicitudes a las cachés pertinentes.
Un directorio reenvía una solicitud de lectura a la caché que tiene la copia modificada más reciente en lugar de difundirla.
Disponibilidad
La disponibilidad es la capacidad de un servicio para seguir siendo utilizable pese a los fallos, respaldada a gran escala por redundancia, reintentos y redireccionamiento.
Un servicio a escala de centro de datos protege la disponibilidad al dirigir las nuevas solicitudes por rutas que evitan un servidor averiado.
Distribución de una solicitud entre servidores
La distribución de una solicitud entre servidores consiste en repartir el trabajo de una solicitud entre varios servidores cuyas respuestas requeridas contribuyen a completarla.
Una mayor distribución entre servidores da más oportunidades a una ralentización poco frecuente de cualquiera de ellos para retrasar la solicitud completa.
Divergencia de saltos
La divergencia de saltos ocurre cuando los hilos de un grupo siguen caminos diferentes, lo que requiere que esos caminos se ejecuten con distintas máscaras activas.
La divergencia de saltos puede dejar inactiva la mitad de un grupo de hilos mientras se ejecutan los hilos asignados al otro camino.

E

Eficacia en el uso de la energía (PUE)
La PUE es la relación entre la energía total de la instalación y la energía de los equipos informáticos durante el mismo periodo, y mide el sobrecoste energético fuera de la carga informática.
Una PUE de 1,2 significa que la energía total de la instalación es un 20 % mayor que la energía informática, sin medir el trabajo útil dentro de los servidores.
Eficiencia energética
La eficiencia energética compara el trabajo útil completado con la energía consumida e incluye si los recursos de los servidores se usan eficazmente.
Una instalación puede mejorar la PUE y mantener una eficiencia energética deficiente de los servidores si gran parte de su carga informática no realiza trabajo útil.
Eficiencia paralela
La eficiencia paralela es el factor de aceleración dividido por el número de procesadores y expresa la ganancia útil respecto a los procesadores asignados.
Un factor de aceleración de seis con ocho procesadores da una eficiencia paralela del 75 %, aunque la reducción de tiempo es mayor.
Encadenamiento
El encadenamiento solapa operaciones vectoriales dependientes al permitir que una operación consumidora empiece con los primeros elementos antes de que la productora termine todos los elementos.
El encadenamiento permite que una suma use los primeros productos mientras el cauce de multiplicación sigue generando los posteriores.
Equilibrio de carga
El equilibrio de carga es la distribución del trabajo útil entre procesadores para que la carga excesiva de ningún trabajador retrase innecesariamente la fase.
Un mal equilibrio de carga deja a siete trabajadores esperando mientras uno termina una partición desproporcionadamente grande.
Escalabilidad débil
La escalabilidad débil aumenta el trabajo total en proporción al número de procesadores y mantiene constante el trabajo por procesador durante el experimento.
Un experimento de escalabilidad débil duplica los datos cuando duplica los procesadores y después compara los tiempos transcurridos.
Escalabilidad fuerte
La escalabilidad fuerte mide cómo cambia el tiempo transcurrido cuando más procesadores ejecutan el mismo problema de cálculo de tamaño fijo.
Un experimento de escalabilidad fuerte mantiene fijo el número de celdas de una simulación mientras aumenta el número de procesadores asignados.
Espionaje de bus
El espionaje de bus es un método de coherencia en el que los controladores de caché observan las solicitudes difundidas y actualizan los permisos o datos de sus bloques.
El espionaje de bus permite que un propietario en estado modificado detecte la solicitud de lectura de otro núcleo y proporcione el contenido actual del bloque.
Estado compartido
El estado compartido identifica una copia limpia de solo lectura de un bloque en caché que también puede estar presente en otras cachés.
Quien escribe debe solicitar la propiedad antes de cambiar un bloque en estado compartido porque otros lectores pueden tenerlo.
Estado exclusivo
El estado exclusivo en MESI identifica un bloque limpio que posee una sola caché y permite una transición silenciosa a modificado al escribir.
Una lectura seguida de una escritura privada se beneficia del estado exclusivo porque la escritura no necesita una solicitud de promoción.
Estado inválido
El estado inválido identifica un bloque de caché cuyo contenido no puede usarse para atender el acceso de lectura o escritura del procesador.
Una lectura posterior de un bloque en estado inválido debe obtener una copia válida mediante la jerarquía de memoria.
Estado modificado
El estado modificado identifica la única copia válida en caché de un bloque, con datos que se han escrito y son más recientes que la memoria.
Un núcleo puede actualizar repetidamente un bloque en estado modificado sin volver a obtener permiso de escritura.
Estructura de arreglos
Una estructura de arreglos almacena los valores de cada campo en un arreglo separado, de modo que los valores de un campo quedan contiguos para el acceso vectorial.
Una estructura de arreglos mantiene juntas todas las coordenadas x cuando un bucle de geometría procesa solo ese campo.

F

Factor de aceleración
El factor de aceleración es el mejor tiempo de ejecución secuencial dividido por el tiempo de ejecución paralelo para la carga de trabajo que se compara.
Un programa que termina en 12 s en lugar de 60 s tiene un factor de aceleración de cinco respecto a su referencia secuencial.
Fallo de coherencia
Un fallo de coherencia ocurre cuando un acceso debe volver a buscar un bloque que una acción de coherencia de otro procesador ha invalidado.
Quien escribe una variable vecina puede causar un fallo de coherencia incluso cuando la variable propia del lector nunca cambia.
Falsa compartición
La falsa compartición es la interferencia de coherencia entre núcleos que acceden a distintas variables de un bloque de caché cuando al menos un núcleo escribe.
La falsa compartición puede ralentizar contadores separados cuando quienes escriben en ellos intercambian repetidamente la propiedad de un bloque.
Fracción secuencial
La fracción secuencial es la parte del tiempo de ejecución de referencia que no puede dividirse entre procesadores en el modelo paralelo.
Una fracción secuencial de 0,1 deja una décima parte del tiempo original incluso si todo el trabajo paralelo no costara tiempo.

G

Granularidad
La granularidad es la cantidad de cálculo realizado entre eventos de comunicación o sincronización en un cálculo paralelo.
Una granularidad mayor puede reducir el coste de los mensajes por operación, pero dejar muy pocas partes para lograr un buen equilibrio de carga.
Grupo de hilos
Un grupo de hilos es un conjunto de 32 hilos en el modelo de ejecución de NVIDIA; los hilos activos comparten la emisión de instrucciones y mantienen datos separados.
Los hilos de un grupo pueden usar índices consecutivos para que sus cargas se combinen en transacciones de memoria eficientes.

I

Intensidad aritmética
La intensidad aritmética es el número de operaciones de coma flotante por byte transferido; en un modelo de techo de rendimiento basado en DRAM cuenta los bytes en el límite de la DRAM.
La reutilización en caché aumenta la intensidad aritmética cuando el número de operaciones útiles permanece fijo, pero disminuye el tráfico de DRAM.
Interfaz de paso de mensajes (MPI)
MPI es una interfaz estándar de paso de mensajes para que los procesos intercambien datos y realicen operaciones colectivas en un programa paralelo.
Una reducción MPI combina sumas parciales distribuidas sin tratar los datos de nodos remotos como punteros locales normales.

L

Lanzamiento asíncrono
Un lanzamiento asíncrono inicia trabajo en el dispositivo sin hacer que el sistema anfitrión espere a que termine antes de continuar la ejecución.
Un lanzamiento asíncrono necesita una comprobación posterior de finalización o una copia bloqueante de resultados antes de que el sistema anfitrión los use.
Latencia de cola de la distribución
La latencia de cola de la distribución es el extremo de mayor demora de los tiempos de respuesta, que puede dominar una solicitud que necesita respuestas de muchos servidores.
Una solicitud distribuida entre servidores espera su respuesta requerida más lenta, lo que convierte la latencia de cola de un servidor en una preocupación para todo el servicio.
Lectura y suma atómicas
La lectura y suma atómicas es una operación atómica que devuelve el valor anterior de una posición mientras le suma una cantidad especificada de forma indivisible.
La lectura y suma atómicas puede conservar todos los incrementos cuando varios hilos actualizan concurrentemente un contador compartido.
Lectura, modificación y escritura atómicas
Una operación de lectura, modificación y escritura atómicas actualiza una posición de memoria de forma indivisible desde el punto de vista de los demás procesadores y combina la lectura y la escritura.
La lectura, modificación y escritura atómicas impide que dos incrementos de un contador sobrescriban ambos el mismo valor antiguo.
Ley de Amdahl
La ley de Amdahl limita el factor de aceleración global de una mejora usando la fracción del tiempo original a la que afecta y la aceleración de esa fracción.
La ley de Amdahl explica por qué acelerar mucho una pequeña parte de un programa puede cambiar muy poco su tiempo total.
Ley de Gustafson
La ley de Gustafson estima el factor de aceleración escalado a partir del número de procesadores y de la fracción de tiempo secuencial medida en la ejecución paralela.
La ley de Gustafson describe cómo un problema paralelo mayor puede usar una máquina más grande dentro de un presupuesto de tiempo similar.
Longitud del vector
La longitud del vector es el número de elementos activos procesados por instrucciones vectoriales con la configuración vectorial actual.
Una longitud de vector corta permite que la última pasada de un bucle actualice sus ocho elementos restantes sin ejecutar una parte final escalar separada.

M

Malla de bloques
Una malla de bloques es el conjunto de bloques de hilos creado por el lanzamiento de un núcleo de cálculo de GPU, cuyos bloques normales pueden ejecutarse en cualquier orden.
Una malla de bloques debe contener suficientes bloques para cubrir todos los datos cuando el núcleo de cálculo procesa solo un elemento por hilo.
Máscara
Una máscara selecciona los elementos activos de una operación SIMD o vectorial, lo que permite trabajo condicional sin un flujo de instrucciones separado por carril.
Una máscara puede impedir las actualizaciones de elementos de un arreglo que no cumplen una comparación o están fuera de la parte final válida.
Memoria compartida
La memoria compartida es almacenamiento de GPU en el chip gestionado por el programa y disponible para los hilos de un bloque, que lo usan para cooperar y reutilizar datos.
Un bloque carga una porción de datos en memoria compartida antes de reutilizarla en varias operaciones aritméticas.
Memoria global
La memoria global es la DRAM del dispositivo GPU accesible desde toda la malla, cuyos accesos se atienden mediante la jerarquía de caché del dispositivo.
Un núcleo de cálculo puede reutilizar bloques de memoria compartida para reducir el número de veces que vuelve a leer datos de la memoria global.
Modelo de consistencia de memoria
Un modelo de consistencia de memoria define las ordenaciones y los resultados observables permitidos de lecturas y escrituras, incluidas las de distintas posiciones.
Un modelo de consistencia de memoria determina cómo puede observar otro procesador los accesos a un indicador y a sus datos.
Modelo de techo de rendimiento
El modelo de techo de rendimiento limita el rendimiento aritmético alcanzable al menor valor entre la capacidad máxima de cálculo y el ancho de banda multiplicado por la intensidad.
El modelo de techo de rendimiento ayuda a decidir si un cálculo más rápido o un menor movimiento de datos pueden elevar el límite de un núcleo de cálculo.
Multihilo de grano fino
El multihilo de grano fino selecciona un hilo en cada ciclo de reloj, normalmente alternando entre contextos preparados y omitiendo los detenidos.
El multihilo de grano fino puede alternar ráfagas cortas de varios hilos para cubrir paradas del cauce de segmentación.
Multihilo de grano grueso
El multihilo de grano grueso cambia de hilo ante paradas largas, lo que permite una ejecución prolongada de un solo hilo entre cambios costosos.
El multihilo de grano grueso puede cambiar después de un fallo en la caché del último nivel que requiere un acceso largo a memoria.
Multihilo por hardware
El multihilo por hardware mantiene varios contextos de hilo en un núcleo para que pueda ejecutar trabajo preparado mientras otro hilo se detiene.
El multihilo por hardware puede llenar los ciclos de espera de memoria sin duplicar un núcleo físico completo.
Multihilo simultáneo
El multihilo simultáneo permite que un núcleo de emisión múltiple emita instrucciones de distintos hilos de hardware dentro del mismo ciclo.
El multihilo simultáneo llena posiciones de emisión libres cuando un hilo no puede proporcionar suficientes instrucciones preparadas.
Múltiples flujos de instrucciones y múltiples flujos de datos (MIMD)
MIMD es una clase de hardware con múltiples flujos de instrucciones controlados de forma independiente que operan sobre múltiples flujos de datos.
Un clúster es MIMD cuando sus nodos avanzan de forma independiente en sus cálculos e intercambian mensajes.
Múltiples flujos de instrucciones y un flujo de datos (MISD)
MISD es la clase de hardware con múltiples flujos de instrucciones que actúan sobre un flujo de datos; pocas máquinas prácticas encajan claramente en ella.
La etiqueta MISD completa las cuatro combinaciones de flujo único y múltiple, mientras que los ejemplos reales propuestos suelen depender de la interpretación.
Multiprocesador de flujos (SM)
Un multiprocesador de flujos es una unidad de procesamiento de las GPU de NVIDIA que planifica grupos de hilos residentes en carriles aritméticos y usa almacenamiento en el chip.
Un multiprocesador de flujos puede emitir instrucciones de otro grupo de hilos preparado cuando un grupo residente espera a la memoria global.
Multiprocesador de memoria compartida
Un multiprocesador de memoria compartida permite que los procesadores se comuniquen mediante cargas y almacenamientos en un espacio de direcciones físico.
Un multiprocesador de memoria compartida puede tener aun así cachés privadas separadas y memoria distribuida entre zócalos.
Muro de potencia
El muro de potencia es la restricción de potencia y calor que limita las ganancias de rendimiento obtenidas al seguir aumentando las frecuencias de reloj de los procesadores.
El muro de potencia impulsó a los diseñadores de chips a dedicar los transistores adicionales a más núcleos de procesador.

N

Nodo de origen
Un nodo de origen gestiona la entrada de directorio de un bloque de memoria concreto y coordina las solicitudes relacionadas con las copias de ese bloque en caché.
Distintos bloques pueden tener distintos nodos de origen, lo que distribuye el almacenamiento del directorio y la gestión de solicitudes.
Núcleo de cálculo
Un núcleo de cálculo es una función del dispositivo lanzada sobre muchos hilos de GPU, cada uno de los cuales ejecuta la función con sus propios índices y datos.
Un núcleo de cálculo SAXPY asigna un elemento de arreglo a cada hilo válido y comprueba el límite superior del índice.
Núcleo de cálculo limitado por el ancho de banda de memoria
Un núcleo de cálculo limitado por el ancho de banda de memoria tiene un techo de ancho de banda de memoria inferior al techo de cálculo, por lo que su tasa máxima depende del suministro de datos.
Una vez que un núcleo de cálculo limitado por la memoria satura el ancho de banda de DRAM, una capacidad aritmética más ancha por sí sola no puede elevar su límite en el modelo de techo de rendimiento.
Núcleo de cálculo limitado por la capacidad de cálculo
Un núcleo de cálculo limitado por la capacidad de cálculo tiene suficiente intensidad para que la capacidad aritmética máxima sea el límite inferior en el modelo de techo de rendimiento.
El procesamiento por bloques puede acercar un cálculo a la región limitada por la capacidad de cálculo al reutilizar datos para muchas operaciones aritméticas.

O

Ocultación de latencia
La ocultación de latencia ejecuta otro trabajo preparado durante una espera, mejorando el uso de recursos sin acortar la propia operación que espera.
Una GPU usa la ocultación de latencia cuando su planificador selecciona otro grupo de hilos durante un acceso pendiente a memoria.

P

Paralelismo
El paralelismo es la ejecución simultánea de operaciones en recursos de hardware separados para reducir la latencia o aumentar la productividad.
Una simulación usa paralelismo cuando varios núcleos actualizan regiones independientes en el mismo instante.
Paralelismo a nivel de datos
El paralelismo a nivel de datos aplica la misma operación a múltiples elementos de datos independientes, a menudo mediante carriles SIMD o hilos de GPU.
Sumar los elementos correspondientes de arreglos ofrece paralelismo a nivel de datos porque cada par puede procesarse de forma independiente.
Paralelismo a nivel de hilos
El paralelismo a nivel de hilos ejecuta varios hilos al mismo tiempo, cada uno con su propio contador de programa y estado de registros.
Un renderizador de imágenes usa paralelismo a nivel de hilos al asignar distintas regiones de la imagen a diferentes trabajadores.
Paralelismo a nivel de instrucciones
El paralelismo a nivel de instrucciones solapa instrucciones de un flujo mediante técnicas como la segmentación y la emisión múltiple.
Un núcleo aprovecha el paralelismo a nivel de instrucciones al emitir juntas dos sumas escalares independientes.
Paralelismo a nivel de solicitudes
El paralelismo a nivel de solicitudes ejecuta tareas o solicitudes de servicio independientes a la vez, con poca coordinación entre sus cálculos.
Un servicio de búsqueda obtiene paralelismo a nivel de solicitudes de miles de usuarios que hacen preguntas independientes.
Partición de bucles en tramos
La partición de bucles en tramos divide un bucle largo en partes que caben en la configuración vectorial y actualiza el avance después de cada parte procesada.
La partición de bucles en tramos puede procesar 100 elementos con longitudes activas sucesivas de 32, 32, 32 y cuatro.
Procesador lógico
Un procesador lógico es un contexto de hilo de hardware visible para el sistema operativo como un lugar donde puede ejecutarse un hilo de software.
Un chip de seis núcleos con dos contextos por núcleo presenta doce procesadores lógicos que comparten seis núcleos.
Propagación de escrituras
La propagación de escrituras es el requisito de coherencia por el que la escritura de un procesador acaba siendo visible para las lecturas de los demás procesadores.
La propagación de escrituras garantiza que un valor nuevo no permanezca oculto permanentemente en la caché privada de quien lo escribe.
Proporcionalidad energética
La proporcionalidad energética es el objetivo de diseño según el cual el consumo de potencia debería aumentar en proporción a la carga útil que gestiona un sistema.
Una alta potencia en reposo reduce la proporcionalidad energética porque un servidor con poca carga sigue consumiendo energía considerable.
Protocolo de invalidación en escritura
Un protocolo de invalidación en escritura concede a quien escribe permiso exclusivo de escritura al hacer inutilizables las demás copias de su bloque en caché.
Un protocolo de invalidación en escritura permite que un propietario realice escrituras repetidas en estado modificado sin difundir cada valor nuevo.
Punto de cresta
El punto de cresta es la intensidad en la que el techo de ancho de banda se encuentra con el techo de cálculo, igual a la capacidad máxima de cálculo dividida por el ancho de banda.
Un punto de cresta de diez FLOP por byte sitúa a un núcleo de cálculo de dos FLOP por byte fuera de la región limitada por la capacidad de cálculo.

R

Rango de proceso
Un rango de proceso es el identificador de un proceso MPI dentro de un comunicador, usado para seleccionar participantes y asignar datos o funciones de comunicación.
Un proceso usa su rango para determinar qué partición del arreglo debe sumar y dónde enviar su resultado parcial.
Red toroidal
Una red toroidal es una red de malla con enlaces que conectan los bordes opuestos, lo que añade rutas y aumenta la capacidad de corte.
Una red toroidal de 8 por 8 tiene 128 enlaces, incluidas las conexiones entre bordes de las que carece una malla normal.

S

Serialización de escrituras
La serialización de escrituras requiere que todos los procesadores coincidan en el orden de las escrituras en una misma posición en un sistema de memoria coherente.
La serialización de escrituras impide que los procesadores observen órdenes opuestos para dos escrituras en la misma posición X.
Sistema anfitrión
El sistema anfitrión es la parte de CPU de un programa heterogéneo, responsable de organizar el almacenamiento del dispositivo, las transferencias, los lanzamientos y el uso de resultados.
El sistema anfitrión puede continuar después de un lanzamiento, pero debe esperar a que los resultados del dispositivo estén completos antes de usarlos.
Sistema informático a escala de centro de datos
Un sistema informático a escala de centro de datos opera un gran edificio de servidores conectados en red, alimentación y refrigeración como una plataforma para servicios y trabajo por lotes.
Un sistema informático a escala de centro de datos debe tener en cuenta la energía y los fallos habituales, además de la productividad de solicitudes.
Sobrecoste del paralelismo
El sobrecoste del paralelismo es el coste de ejecución añadido por la organización paralela, como la planificación, la comunicación, la sincronización o el trabajo adicional.
El sobrecoste del paralelismo puede crecer tanto que una tarea tarde más después de aumentar su número de procesadores.
Sobresuscripción de la red
La sobresuscripción de la red ocurre cuando los enlaces superiores proporcionan menos capacidad que la capacidad agregada de los enlaces inferiores que los alimentan.
Un bastidor con 400 Gbit/s de enlaces de servidores y 100 Gbit/s de enlaces ascendentes tiene una sobresuscripción de 4:1.
Solapamiento de referencias
El solapamiento de referencias ocurre cuando distintas referencias pueden acceder a almacenamiento solapado, lo que puede hacer inseguras las operaciones simultáneas de un bucle.
Un compilador comprueba el solapamiento de referencias antes de reordenar cargas y almacenamientos mediante punteros que podrían solaparse.

T

Taxonomía de Flynn
La taxonomía de Flynn clasifica el hardware según si los flujos de instrucciones y de datos son únicos o múltiples en un nivel elegido de la máquina.
La taxonomía de Flynn puede describir los núcleos independientes de una CPU de forma distinta a las unidades SIMD que hay dentro de esos núcleos.
Techo de rendimiento
Un techo de rendimiento es un límite inferior dentro de un análisis del modelo de techo de rendimiento que representa una restricción, como la ausencia de SIMD o patrones de acceso deficientes.
Un techo de ancho de banda por debajo del techo principal puede mostrar el rendimiento perdido por accesos ineficientes a memoria.

U

Un flujo de instrucciones y múltiples flujos de datos (SIMD)
SIMD es una clase de hardware en la que una instrucción controla la misma operación sobre múltiples elementos de datos o carriles aritméticos.
Una suma de arreglos de ocho carriles es SIMD aunque realice ocho sumas de elementos con una instrucción emitida.
Un flujo de instrucciones y un flujo de datos (SISD)
SISD es una clase de hardware con un flujo de instrucciones y un flujo de datos, que incluye los núcleos escalares convencionales con segmentación.
Un núcleo escalar segmentado sigue siendo SISD porque las instrucciones solapadas siguen perteneciendo a un flujo de instrucciones.
Un programa y múltiples datos (SPMD)
SPMD es un estilo de programación en el que los trabajadores ejecutan copias del mismo programa y usan sus identificadores para seleccionar datos diferentes.
Una suma de arreglos SPMD usa el identificador de cada trabajador para elegir una región antes de combinar los resultados parciales de los trabajadores.
Una instrucción y múltiples hilos (SIMT)
SIMT es un estilo de ejecución de GPU que presenta hilos independientes mientras emite una instrucción para los hilos activos de un grupo.
El código SIMT calcula un índice por hilo aunque la emisión de instrucciones se comparte dentro de cada grupo de hilos.

V

Vector de presencia
Un vector de presencia usa un bit por núcleo para registrar qué cachés contienen un bloque concreto en un directorio con vector completo.
Un vector de presencia para 64 núcleos requiere ocho bytes por bloque registrado antes de los bits de estado de coherencia.
Vectorización automática
La vectorización automática es una transformación del compilador que convierte el trabajo adecuado de un bucle escalar en operaciones SIMD y conserva los resultados requeridos.
El posible solapamiento de punteros puede impedir la vectorización automática a menos que una comprobación establezca que los arreglos no se solapan.

Sobre esta unidad

Por StudeliInformar de un error

Crea tus propios Materiales de Estudio

Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.

Comenzar