2012-07-28 14 views
18

Here son diapositivas de Rob Pike en esto. Cada vez que paso por esto me siento como un idiota. No puedo descifrar su esencia. Se entiende bien que la concurrencia es la descomposición de un problema complejo en componentes más pequeños. Si no puede dividir correctamente algo en partes más pequeñas, es difícil resolverlo usando concurrencia.¿Concurrencia no es paralelismo?

Pero no hay muchos detalles en las diapositivas sobre cómo obtener el paralelismo una vez que ha logrado la concurrencia. En la diapositiva de la lección (num 52), dice Simultaneidad: "Quizás incluso en paralelo". Pero la pregunta es: ¿Cuándo y cómo puede la concurrencia conducir correcta y eficientemente a Parallelism?

Supongo que, bajo el capó, Rob señala que los desarrolladores deben trabajar en el nivel de concurrencia, y el paralelismo debe ser la preocupación de language/vm (¿gomaxprocs?). Solo me importa la descomposición inteligente en unidades más pequeñas, solo preocupado por la concurrencia correcta: el "sistema" cuidará el paralelismo.

Por favor, arroja algo de luz.

+0

Hay demasiado alcance para una discusión abierta aquí. He preguntado a los modificadores de Programmers.SE si esto funcionará allí. Gracias. – Kev

Respuesta

6

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.)].

+1

Creo que lo que Rob Pike está diciendo es sobre "procesamiento del paralelismo": múltiples hilos que se ejecutan al mismo tiempo en procesadores multinúcleo. – devundef

+1

He cubierto esto en la parte EDIT :). – amb

+0

La ley de Amdahl habla sobre el paralelismo cuando tiene más de 1 núcleo/procesador involucrado. http://en.wikipedia.org/wiki/Amdahl's_law – devundef