¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Fundamentos de computación paralela

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de contenedores12 min de lectura7 comandos

Un solo trabajo, una multitud de piezas

Aclarar una foto es sumar el mismo número pequeño a millones de píxeles. Un píxel no depende de otro, así que miles de pequeños trabajadores pueden encargarse de unos pocos cada uno. Una tarjeta gráfica está hecha justo para eso. Este laboratorio no tiene tarjeta gráfica, pero te deja ver las ideas en las que se apoya.

Al terminar esta lección

Nota

Puedo explicar en qué se diferencia hacer un mismo trabajo sobre muchos datos a la vez de hacer un bucle, y por qué más trabajadores no hacen el trabajo proporcionalmente más rápido.

Palabras clave

  • Paralelo: varias partes de un trabajo hechas al mismo tiempo.
  • Trabajador (worker): un proceso o hilo que hace una parte del trabajo.
  • Parte en serie: la parte de un trabajo que no se puede dividir y se hace en orden.
  • Aceleración: cuántas veces más rápido es un trabajo que con un solo trabajador.
  • Hilo (thread): un trabajador pequeño; una GPU ejecuta miles a la vez.
  • Núcleo (kernel): la pequeña función que ejecuta cada hilo, cada uno sobre su propio elemento.

Para empezar: lo que ya sabes

Nota

Responde mentalmente. 1. ¿Qué hace un bucle for? 2. Si una persona tarda 8 minutos en doblar 80 folletos, ¿cuánto tardan 4 personas si se reparten el montón a partes iguales? 3. ¿Y si uno de los 8 minutos se va en escribir la lista de direcciones, que solo puede hacer una persona? Respuestas: repite los mismos pasos uno tras otro; 2 minutos; más de 2, porque la lista de direcciones sigue llevando 1 minuto a una sola persona.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra de arriba de la lección y espera a que diga que está en marcha. Hay un solo contenedor, jupyter, y el terminal llega a su Python con docker exec jupyter, que ejecuta una orden dentro de él. El enlace JupyterLab abre su página web, en el puerto 8888. Aquí no hay GPU. Cada botón Ejecutar de abajo escribe su orden en el terminal de tu laboratorio, una detrás de otra en la misma sesión. Para verlas o escribir las tuyas, pulsa Abrir terminal (pestaña nueva) en la barra.

Un proyecto paralelo es una carpeta de scripts pequeños

ls lista la carpeta de trabajo: el cuaderno start.ipynb y la carpeta steps. cat muestra el primer script. Suma dos veces los cuadrados del 1 al 1000: una con un bucle de Python y otra con una sola operación de NumPy, que hace el mismo trabajo sobre toda la matriz de golpe.

Comando
docker exec jupyter ls

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker exec jupyter cat steps/vectors.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una operación sobre toda una matriz

Las dos formas dan 333833500, y el script dice que los dos resultados son iguales. El bucle necesita 2000 operaciones a nivel de Python, una multiplicación y una suma por cada uno de los 1000 números. NumPy necesita 1, porque una sola llamada hace todo el trabajo en código compilado y rápido. No se mide ningún tiempo, así que el script imprime lo mismo cada vez. Una GPU va más lejos: una instrucción, miles de elementos.

Comando
docker exec jupyter python3 steps/vectors.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Repartir un trabajo entre trabajadores

Los números del 1 al 40 se cortan en 4 trozos de 10 y dos trabajadores se los reparten. Cada trozo da una suma parcial, 55, 155, 255 y 355, siempre listadas en el orden de los trozos, y al sumarlas sale 820, igual que sumar toda la lista de una vez. Dividir funciona porque cada trozo se puede sumar sin conocer los demás.

Comando
docker exec jupyter python3 steps/chunks.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El límite de la aceleración

Una parte de todo trabajo no se puede dividir. La tabla calcula la aceleración con 1, 2, 4 y 8 trabajadores cuando el 10, el 25 y el 50 por ciento no se pueden dividir. Con un 10 por ciento en serie, 8 trabajadores dan 4,71 veces, no 8, y ni siquiera infinitos trabajadores dan más de 10,0. Con un 50 por ciento en serie, 8 trabajadores dan solo 1,78.

Comando
docker exec jupyter python3 steps/amdahl.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Compruébalo

Consejo

En la tabla, ¿cuánto más rápido es el trabajo con 8 trabajadores si el 25 por ciento no se puede dividir? Respuesta: 2,91 veces, no 8, porque el cuarto en serie lo sigue haciendo un solo trabajador.

Un lanzamiento de bloques de hilos

Una GPU ejecuta una función llamada núcleo una vez por hilo. Los hilos van en bloques, y cada uno calcula cuál es su elemento con bloque * tamaño del bloque + hilo. Este script simula un lanzamiento de 3 bloques de 4 hilos sobre 10 elementos, para sumar dos vectores. Imprime el índice global de cada hilo, del 0 al 11, y el resultado 11, 22, y así hasta 110. Los dos últimos hilos, el 10 y el 11, se pasan del final y no hacen nada.

Comando
docker exec jupyter python3 steps/kernel.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mover datos también cuesta tiempo

Un dispositivo tiene dos límites: la velocidad a la que mueve bytes y la velocidad a la que hace cuentas. Este script es aritmética sobre un dispositivo inventado que mueve 500 gigabytes por segundo y hace 10 teraflops por segundo. Una suma de vectores de 10 millones de elementos mueve 120000000 bytes para 10000000 cuentas, así que la limita la memoria. Una multiplicación de matrices de 1000 por 1000 mueve 12000000 bytes para 2000000000 cuentas, así que la limita el cálculo.

Comando
docker exec jupyter python3 steps/transfer.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente piensa que 8 trabajadores hacen un trabajo 8 veces más rápido. Solo ocurre si nada del trabajo tiene que hacerse en orden. Lo que queda en serie pone un techo, y mover los datos puede costar más que las cuentas. Hazte dos preguntas antes de añadir trabajadores: qué parte no se puede dividir, y si el trabajo espera a la memoria o al cálculo.

El mismo trabajo en un cuaderno

Abre JupyterLab desde la barra y haz doble clic en start.ipynb. Cada celda ejecuta un script, así que ves lo que hacían los seis scripts, una idea cada vez. Haz clic en una celda y pulsa Mayús e Intro para ejecutarla. Para explorar, abre un script en la lista de archivos, cambia un número, por ejemplo el de trozos o la parte que no se puede dividir, y vuelve a ejecutarlo.

Comprobación final

Consejo

Responde sin mirar atrás. 1. ¿Cuántas operaciones a nivel de Python necesitó el bucle para la suma de cuadrados, y cuántas NumPy? 2. ¿A cuánto sumaron las cuatro sumas parciales? 3. Con un 10 por ciento en serie, ¿cuál es la aceleración máxima que puede dar cualquier número de trabajadores? 4. ¿Qué calcula primero cada hilo de un núcleo? Respuestas: 2000 y 1; 820; 10,0 veces; cuál es su elemento, su índice global.

Para docentes

Consejo

Esta lección es un pequeño ejemplo de lección que se hace dentro de un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia de cada estudiante. El laboratorio es un solo servicio, JupyterLab con NumPy, y no tiene GPU: enseña el modelo sobre el que se construye una GPU, y nada aquí se corrige solo. El estudiante entrega un cambio breve suyo en un script y una frase sobre qué se movió. Puntos clave: 1. Una operación sobre toda una matriz sustituye a un bucle. 2. Un trabajo repartido entre trabajadores conserva una parte en serie que pone un techo. 3. Un núcleo se ejecuta una vez por hilo, y cada hilo calcula su propio elemento. Error frecuente: creer que 8 trabajadores dan 8 veces la velocidad. Material: el laboratorio y un navegador. Consejo: pide al alumnado que prevea cada casilla de la tabla antes de pulsar Ejecutar. Cada script imprime lo mismo cada vez, porque no se mide ningún tiempo. Cópiala en tu propio módulo y modifícala, o crea una desde cero con el menú Lab del creador de lecciones.

Sobre este laboratorio y su código: Laboratorio de computación paralela: cómo piensa una GPU, sin GPU, en JupyterLab

¿Enseñas a una clase? Asigna estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.