thread programming parallel net library for examples c# .net concurrency parallel-processing cloud

parallel - thread programming c#



¿Cuál es la forma más fácil de paralelizar mi programa C#en varias PC? (9)

... con poco o ningún cambio de código?

Difícil. Básicamente, busque en WCF como una forma de comunicarse entre varias instancias del programa a través de la red. Dependiendo del algoritmo, la estructura podría tener que cambiar drásticamente, o no cambiarse en absoluto. En cualquier caso, debe encontrar la forma de separar el problema en partes que actúen de forma independiente. Luego, debe idear una forma de distribuir estas partes entre diferentes instancias y recopilar los datos resultantes.

PLinq ofrece una excelente manera de paralelizar su programa sin grandes cambios, pero esto solo funciona en un proceso, a través de diferentes hilos, y solo si el algoritmo se presta a la paralelización. En general, es necesaria una refacturación manual.

Tengo muchas computadoras sin usar en casa. ¿Cuál sería la forma más fácil de utilizarlos para paralelizar mi programa C # con poco o ningún cambio de código?

La tarea que estoy tratando de hacer implica pasar por muchas oraciones en inglés, el conjunto de datos se puede dividir fácilmente en trozos más pequeños, procesados ​​en diferentes máquinas al mismo tiempo.


¿Cada oración se procesa de manera independiente, o se combinan de alguna manera? Si su procesamiento opera en una sola oración a la vez, no necesita cambiar su código en absoluto. Simplemente ejecute el mismo código en cada una de sus máquinas y divida los datos (su lista de oraciones) entre ellos. Puede hacerlo instalando una parte de los datos en cada máquina o compartiendo la base de datos y asignando un trozo diferente a cada máquina.

Si desea cambiar su código ligeramente para facilitar el paralelismo, comparta toda la base de datos y haga que el código "marque" cada oración a medida que se procesa, luego busque la siguiente oración sin marcar para procesar. Esto le dará una introducción suave al concepto de seguridad de subprocesos : técnicas que aseguran que un procesador no interfiere negativamente con otro.

Como siempre, cuantos más detalles pueda proporcionar sobre su aplicación específica, mejor será la comunidad de SO que pueda adaptar nuestras respuestas a su propósito.

Buena suerte, ¡esto suena como un proyecto interesante!


Antes de invertir en la paralelización de tu programa, ¿por qué no intentas dividir los conjuntos de datos en partes y ejecutar manualmente tu programa en cada computadora y cotejar los resultados a mano? Si eso funciona, intente automatizarlo con scripts y escriba un programa para clasificar los resultados.


Es posible que desee ver la Programación basada en flujo : tiene una implementación Java y C #. La mayoría de las aproximaciones a este problema implican tratar de tomar un programa de subproceso convencional y determinar qué partes se pueden ejecutar en paralelo. FBP tiene un enfoque diferente: la aplicación está diseñada desde el principio en términos de múltiples componentes de "caja negra" que se ejecutan de forma asíncrona (piense en una línea de ensamblaje de fabricación). Dado que un programa convencional de un solo subproceso actúa como un único componente en el entorno FBP, es muy fácil extender una aplicación existente. De hecho, las piezas de una aplicación existente a menudo pueden romperse y convertirse en componentes separados, siempre que puedan ejecutarse de forma asincrónica con el resto de la aplicación (es decir, no con subrutinas). Alguien lo llamó "convertir un iceberg en cubos de hielo").


Eso probablemente no sea posible.

La forma de paralelizar un programa depende completamente de lo que hace su programa y cómo está escrito, y generalmente requiere cambios de código extensos y aumenta la complejidad de su programa muchas veces.

La forma habitual de aumentar fácilmente la concurencia en un programa es llevar a cabo una tarea que se repite muchas veces y simplemente escribir una función que divide esa tarea en fragmentos y los envía a diferentes núcleos para procesar.



La respuesta depende de la naturaleza del trabajo que hará su aplicación. Los diferentes tipos de trabajo tienen diferentes soluciones posibles de paralelización. Para algunos tipos, no existe una forma posible / factible de paralelizar.

El escenario más fácil que puedo pensar es para una aplicación cuyo trabajo se puede romper fácilmente en trozos de trabajo discretos. Si este es el caso, entonces simplemente diseñe su aplicación para trabajar en un solo pedazo de trabajo. Proporcione a su aplicación la capacidad de aceptar nuevos trabajos y entregar los trabajos terminados. Luego, construya un planificador de trabajo encima. Este planificador puede ser parte de la misma aplicación (configure una máquina para que sea el planificador y el resto como clientes) o una aplicación por separado.

Hay otras cosas a considerar: ¿cómo se producirá la comunicación entre máquinas (archivos, conexiones de red?); la aplicación debe poder informar / solicitarse acerca del porcentaje del trabajo completado ?; hay una necesidad de poder forzar a la aplicación a dejar de procesar el trabajo actual ?; etc.).

Si necesita una respuesta más detallada, edite su pregunta e incluya detalles sobre la aplicación, el problema que resuelve la aplicación, la cantidad esperada de trabajos, etc. Luego, la comunidad vendrá con respuestas más específicas.


Necesita ejecutar su aplicación en un sistema distribuido, google para ventanas de computación distribuidas o para grid computing c #.


Dryad (la variación de Microsoft de MapReduce) aborda exactamente este problema (paraleliza programas .NET en varias PC). Está en etapa de investigación en este momento. Lástima que todavía no hay CTP :-(