Paralelismo

En esta página, aprenderás cómo la ejecución de múltiples programas en paralelo puede reducir el tiempo total que se tarda en ejecutar un algoritmo.

En Snap!, estás acostumbrado a ver un montón de programas que se ejecutan de forma independiente, que pueden o no estar asociados con diferentes objetos. Esto es una especie de computación en paralelo. Así que, si tuviéramos un ordenador diferente para cada objeto, eso sería el verdadero paralelismo. Tal como es, solo hay un ordenador, y divide su atención entre los procesos ejecutando un poco de uno y luego ejecutando un poco del siguiente. Específicamente, cambia en la parte inferior de los bucles (por siempre, repetir, etc.).

: Computación secuencial vs. computación en paralelo
CSN-2.A.1, CSN-2.A.2

Esta sección cubre dos modelos de computación:

CSN-2.A.4

Puedes comparar la eficiencia de dos soluciones algorítmicas diferentes a un problema comparando el tiempo que les toma realizar la misma tarea.

  1. CSN-2.A part b, CSN-2.A.5
    ¿Cuánto tiempo tardará este programa secuencial en ejecutarse?
    esperar (6), esperar (4), esperar (8)
    18
    8
    4
    6
CSN-2.A.5

El tiempo de ejecución de un algoritmo secuencial es la suma de los tiempos de ejecución de todos sus pasos.

  1. CSN-2.A part b, CSN-2.A.6
    ¿Cuánto tiempo tardará este programa paralelo en ejecutarse?
    enviar mensaje (ir) y esperar, esperar (6) segs enviar mensaje (ir): esperar (4) segs enviar mensaje (ir): esperar (8) segs
    18
    8
    6
    14
CSN-2.B.1, CSN-2.B.2, CSN-2.B.3, CSN-2.B.4
: Computación distribuida
CSN-2.A.3

Computación distribuida (distributed computing) es una forma de computación paralela que utiliza múltiples computadoras (tal vez incluso se extienda por todo el mundo).

Escribir un programa que no hace nada más que esperar es, por supuesto, poco realista, pero lo que es realista es que en la mayoría de los problemas, no hay una solución que sea puramente paralela. Alguna parte de la computación tiene que hacerse de forma secuencial. En la pregunta previa,  la parte secuencial es modelada por esperar 6 segs. El paralelismo con este tonto ejemplo se siente trivial, pero imagina que trabajas para Google. Millones de consultas de búsqueda y ediciones de páginas web han ocurrido hoy en día, y es tu trabajo tener que procesarlos. Si no tuvieran enormes instalaciones de servidores con miles de computadoras en cada edificio, no podrían seguir el ritmo en absoluto. La informática distribuida te permite escalar a problemas muy grandes.

CSN-2.A.6

Diagrama de algoritmo para encontrar la longitud promedio de palabras en una lista de 100,000 palabras: los primeros dos pasos (Dividir la lista de palabras, Enviar tareas a cada otra una de las computadoras) están etiquetados como 'secuenciales'; luego, las flechas indican la ramificación en múltiples tareas (Contar todas las palabras con 'A', Contar todas las palabras con 'B', ..., Contar todas las palabras con 'Z') que están etiquetadas como 'paralelas'; finalmente, las flechas indican la reunión de estos resultados de nuevo en un solo hilo de tres pasos (Agregar los 26 resultados parciales, Dividir la suma por el total de número de palabras, Reportar el promedio) etiquetados como 'secuenciales'Como un ejemplo más específico, supongamos que quieres saber la longitud media de las palabras de una lista de 100.000 palabras. Puedes dividir la tarea entre varias computadoras (uno para cada letra de inicio). Cada computadora suma las longitudes de todas las palabras que se le asignan (todas las palabras "A", todas las palabras "B", etc.). Luego una computadora tiene que sumar los 26 resultados parciales y dividirlos por el número total de palabras para encontrar el promedio. Para calcular el tiempo de ejecución de esta solución paralela, añadirías el tiempo de ejecución de la parte paralela más larga (el tiempo de ejecución de la letra con más palabras) al tiempo de ejecución de la parte secuencial (sumando los 26 resultados parciales y dividiendo la suma por el número total de palabras).

Debido a que cada cómputo incluye una porción secuencial, hay un límite de cuánto puede acelerar una tarea al agregar procesadores.

: Procesador

Un procesador (processor) es una pieza de circuitos dentro de una computadora que procesa las instrucciones de los programas de computación.

CPU

Créditos de la imagen: Wikipedia usuario Solipsist

    CSN-2.A parts a and b, CSN-2.A.4, CSN-2.B.5
  1. Supongamos que una tarea incluye un minuto de pasos secuenciales y una porción paralelizable que tomaría una hora si se hace de manera secuencial. Completa esta tabla:
    Número de procesadores Tiempo total requerido Tipo de solución
    1 61 minutos (1 hr + 1 min) solución secuencial
    2 31 minutos (30 min + 1 min) soluciones paralelas
    3
    4
    10
    20
    30
    60
    120
    240
    480
  2. CSN-2.B.5
  3. Ten en cuenta la ley de los rendimientos decrecientes:
    1. Si tienes un procesador y añades uno más, ¿cuánto tiempo te ahorras?
    2. Si tienes 240 procesadores y añades 240 más, ¿cuánto tiempo te ahorras?
    3. Habla con tu compañero¿Cuántos procesadores crees que vale la pena tener para este problema?
  4. ¿Qué es la ley de rendimientos decrecientes?
    La ley de los rendimientos decrecientes es una idea de la economía que básicamente dice que después de cierto punto, más no es mejor. Por ejemplo, si recibiste cinco regalos de cumpleaños, puede que seas más feliz que si solo recibiste uno, pero recibir más regalos no es necesariamente mejor. Imagina que recibes cien regalos. Te aburrirías abriéndolos y probablemente te sentirías abrumado. Y recibir mil o un millón de regalos no haría más feliz tu cumpleaños. La misma regla al ¡pastel de cumpleaños!
: Aceleración
CSN-2.A.7

Los programadores se refieren a la aceleración (speedup) de la solución paralela para describir cuántas veces más rápido se compara la solución paralela con la solución secuencial:
\text{aceleración} = \frac{\text{tiempo secuencial}}{\text{tiemo paralelo}}

El hardware de la computadora es muy fiable; es raro que se averíe mientras estás ejecutando un programa. Pero en la computación distribuida con decenas de miles de computadoras trabajando en el mismo problema, es probable que uno de ellos falle. (Si la probabilidad de que una computadora falle durante la ejecución de un programa es de 0,0001 y utilizas 10.000 computadoras, entonces la probabilidad de que uno de ellos falle es de alrededor de 0,368, aproximadamente ¡un tercio de las veces!) Por lo tanto, el software tiene que compensar comprobando que las máquinas están funcionando y reasignando las tareas de una computadora que ha fallado a una que funciona.

Además, cuando se hacen las cosas en paralelo, los procesos paralelos pueden interferir entre sí.

Un ejemplo de interferencia de procesos con la banca...

Si una persona retira dinero de un cajero automático al mismo tiempo que otra persona en un cajero automático diferente retira dinero de la misma cuenta, podrías encontrarte con una situación como la siguiente:

downward pointing arrow labeled 'time' Cajero automático 1 Cajero automático 2
Busca el saldo ($100)

Busca el saldo ($100)

Revisa si la cantidad requerida ($40) está disponible

Ajusta el saldo ($60)

Reparte el dinero
Revisa si la cantidad requerida ($20) está disponible
Ajusta el saldo ($80)
Reparte el dinero

Debido a que el cajero automático 2 cambió el saldo de la cuenta después de que el cajero automático 1 buscó el saldo, el cajero automático 1 no sabía que el saldo había sido cambiado. La cuenta bancaria terminó con un saldo de 80 dólares, aunque empezó con 100 dólares y se retiró un total de 60 dólares.

Por estas y otras razones, un programa paralelo es más difícil de escribir y depurar que un programa secuencial.

    CSN-2.B
  1. Habla con tu compañero Identifica algunos beneficios y desafíos potenciales de la computación paralela y distribuida. Escribe tus pensamientos
  1. ¿Cuál es la aceleración para esta solución paralela en comparación con la solución secuencial?
    • Solución secuencial: esperar (6), esperar (4), esperar (8)
    • Solución paralela: enviar mensaje (ir) y esperar, esperar (6) segs cuando me llegue (ir): esperar (4) segs cuando me llegue (ir): esperar (8) segs
    \frac{18}{14}
    \frac{14}{18}
    \frac{18}{6}
    \frac{18}{8}