El paralelismo implica concurrencia, pero no al revés, ¿verdad?

15

A menudo leo que el paralelismo y la concurrencia son cosas diferentes. Muy a menudo, los respondedores / comentaristas llegan a escribir que son dos cosas completamente diferentes. Sin embargo, en mi opinión, están relacionados, pero me gustaría una aclaración al respecto.

Por ejemplo, si estoy en una CPU multinúcleo y logro dividir el cómputo en x cómputo más pequeño (digamos usando fork / join) cada uno ejecutándose en su propio hilo, tendré un programa que está haciendo cómputo paralelo (porque supuestamente, en cualquier momento, varios hilos se ejecutarán en varios núcleos) y serán concurrentes, ¿verdad?

Mientras que si simplemente estoy usando, digamos, Java y lidiando con eventos de UI y repintado en el hilo de despacho de eventos más ejecutando el único hilo que creé yo mismo, tendré un programa que sea concurrente (hilo EDT + GC + mi hilo principal etc.) pero no en paralelo.

Me gustaría saber si estoy haciendo esto bien y si el paralelismo (en un sistema "único pero con múltiples núcleos") siempre implica concurrencia o no.

Además, ¿se ejecutan programas de subprocesos múltiples en CPU de múltiples núcleos pero donde los diferentes subprocesos están haciendo un cálculo totalmente diferente se considera que usan "paralelismo"?

Cedric Martin
fuente

Respuestas:

13

De acuerdo con Wikipedia :

La computación paralela es una forma de computación en la cual muchos cálculos se llevan a cabo simultáneamente, operando bajo el principio de que los problemas grandes a menudo se pueden dividir en problemas más pequeños, que luego se resuelven simultáneamente ("en paralelo").

Es decir, el paralelismo siempre implica concurrencia.

Además, ¿se ejecutan programas de subprocesos múltiples en CPU de múltiples núcleos pero donde los diferentes subprocesos están haciendo un cálculo totalmente diferente se considera que usan "paralelismo"?

No. La esencia del paralelismo es que un gran problema se divide en otros más pequeños para que las piezas más pequeñas se puedan resolver al mismo tiempo. Las piezas son mutuamente independientes (al menos hasta cierto punto), pero siguen siendo parte del problema más grande, que ahora se resuelve en paralelo.

La esencia de la concurrencia es que varios hilos (o procesos, o computadoras) están haciendo algo simultáneamente , posiblemente (pero no necesariamente) interactuando de alguna manera. Wikipedia nuevamente :

La concurrencia es una propiedad de los sistemas en los que varios cálculos se ejecutan simultáneamente y potencialmente interactúan entre sí.

Joonas Pulakka
fuente
44
Buena publicación. El paralelismo es un subconjunto de la concurrencia.
3
Lo siento, pero esta respuesta es incorrecta. Definitivamente puede tener paralelismo sin concurrencia (por ejemplo, paralelismo a nivel de bit) y, de hecho, los dos son conceptos distintos. La concurrencia se trata de componer unidades independientes de ejecuciones, mientras que el paralelismo se trata de la ejecución simultánea de cálculos potencialmente asociados.
Kai Sellgren
@KaiSellgren: Cite alguna fuente para respaldar su declaración.
Joonas Pulakka
El primer wikiquote es simplemente incorrecto. Afortunadamente, se solucionó hace algún tiempo y ahora dice correctamente que el paralelismo no depende de la concurrencia.
Kai Sellgren
De hecho, eso es lo que dice actualmente la entrada wiki ( es posible tener paralelismo sin concurrencia (como el paralelismo a nivel de bits) ). Pero no entiendo ese punto en absoluto; ¿No es el paralelismo a nivel de bits lo más concurrente que se pueda imaginar?
Joonas Pulakka
3

El código puede ser concurrente, pero no paralelo.

Imagine múltiples hilos ejecutándose en una máquina de un solo núcleo. Esta máquina de un solo núcleo solo procesará un subproceso a la vez, por lo que no habrá paralelismo de operaciones. Pero para cada subproceso, gracias a cómo el sistema operativo maneja múltiples subprocesos, cada subproceso debe asumir que todos los demás subprocesos se ejecutan al mismo tiempo.

Eufórico
fuente
0

Paralelismo simplemente significa hacer muchas tareas simultáneamente; Por otro lado, la concurrencia es la capacidad del núcleo para realizar muchas tareas cambiando constantemente entre muchos procesos.

Para lograr el paralelismo es importante que el sistema tenga muchos núcleos solo entonces el paralelismo se puede lograr de manera eficiente. Y hay un gran impacto en el rendimiento y se genera una gran sobrecarga si se intenta el paralelismo en una máquina de un solo núcleo.

Por ejemplo, el sistema anterior tenía solo un núcleo y los programadores de CPU darían una ilusión de paralelismo al cambiar constantemente entre procesos permitiendo que cada proceso progrese.

usuario196279
fuente