Lo que significa
Rob Pike Cuando tiene la forma abstracta de un algoritmo en mente, a continuación, tiene que elegir si llevarlo a la práctica con el paso de mensaje o de memoria compartida o tal vez híbrido. También tendrá que considerar el tipo de acceso a la memoria (NUMA, UMA, etc.) y la topología utilizada (Hypercube, Torus, Ring, Mesh, Tree, etc.)
Esto parece mucho trabajo para alguien que solo quiere algo, tal vez incluso simple, hecho de forma paralela (por ejemplo, paralelo para).
Y es mucho trabajo especialmente si cambia la topología (para que pueda tener todas sus ventajas).
Así que escribe el código paralelo (ya sea simple o complejo) y la máquina virtual o el compilador elegirán lo que parece ser la mejor manera de hacerlo, ¡incluso ejecutarlo de forma secuencial! (un ejemplo sería tarea Parallel Library for .NET)
EDITAR Importante:
Debo mencionar que estoy hablando de concurrencia en un programa/algoritmo y no entre los programas independientes que se ejecutan en un sistema de .
Usted ha dicho que
Es bien entendido que la concurrencia es la descomposición de un problema complejo en componentes más pequeños. Si no se puede dividir correctamente algo en partes más pequeñas, es difícil de resolver usando concurrencia
pero es un error b/c esos componentes más pequeños pueden depender unos de otros de manera secuencial para completar, por lo que incluso si se divide en pequeños componentes, no significa que se logre concurrencia/paralelismo.
En todas mis clases de algoritmos paralelos y distribuidos (tanto en BS y MS) nunca hablamos de "concurrencia obtuvimos y ahora vamos a ver cómo obtener el paralelismo". Si usa la palabra concurrencia para describir y algoritmo, entonces implica paralelismo y viceversa.
En la literatura también encontrará una línea delgada entre distribuidos y paralelos.
Desde un punto de vista algorítmico puede usar simultaneidad, paralelismo y distribuido y obtendrá la misma idea.
Desde el punto de vista de la implementación, si dices "paralelismo" normalmente pretendes un programa que se ejecuta en la computadora local o un clúster (comunicación de memoria compartida) y "distribuido" cuando ejecutas el programa en una cuadrícula (Mensaje que pasa la comunicación).
Ahora, tanto la distribución como el paralelismo implican concurrencia.
Creo que debería ser más escéptico sobre el significado preciso de estos términos porque incluso en la literatura (y hablo de personas que realmente contribuyeron a este campo y no solo la creación de algún idioma) se utilizan para expresar la concepto abstracto.
La concurrencia en un algoritmo (ya sea un programa) significa tener partes de código que pueden ejecutarse independientemente de otras partes de código, incluso si eventualmente esperarán otras piezas de código (ver la Ley de Amdahl para ver exactamente la implicación de esta).
Por lo tanto, siempre que tenga concurrencia en un algoritmo/programa también tiene paralelismo.
Creo que es mejor implementar algunos algoritmos paralelos Y distribuidos para comprender mejor la idea detrás de esto. Si conoce C/C++ puede usar OpenMPI para implementaciones distribuidas (Message Passing) y OpenMP para implementaciones paralelas (Shared Memory).
EDIT:
También podría significar la concurrencia como principio abstracto y paralelo como la forma en que se implementa [Memoria compartida, paso de mensajes, híbrido entre ambos; Tipo de acceso a la memoria (numa, uma, etc.)].
Hay demasiado alcance para una discusión abierta aquí. He preguntado a los modificadores de Programmers.SE si esto funcionará allí. Gracias. – Kev