2008-11-08 27 views
6

Tengo muchas computadoras sin usar en mi 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?¿Cuál es la forma más fácil de paralelizar mi programa C# en varias PC?

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 fragmentos más pequeños, procesados ​​en diferentes máquinas al mismo tiempo.

+0

¿Puedes revelar lo que intentas lograr? ¿Ha considerado una base de datos o una indexación de texto completo para sus necesidades? – vmarquez

+0

Se requieren detalles. Con solo tu pregunta, ¿debemos suponer que la paralelización fue para mejorar la velocidad de una sola carrera? También se puede considerar que simplemente está buscando realizar la misma operación en varias máquinas, lo que tiene una respuesta completamente diferente. – Klathzazt

Respuesta

2

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 un gran número de cambios de código y aumenta la complejidad de su programa.

La forma habitual de aumentar fácilmente la concurencia en un programa es realizar 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 su procesamiento.

7

... 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 para la paralelización. En general, es necesario realizar alguna refabricación manual .

1

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

2

La respuesta depende de la naturaleza del trabajo que realizará 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 tener en cuenta: ¿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.

1

¿Cada oración se procesa de forma 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, compartir toda la base de datos y tener la "marca" código de cada frase que se procesa, a continuación, busque la siguiente frase sin marcar para procesar. Esto le dará una introducción suave al concepto de thread safety - 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 SO la que pueda adaptar nuestras respuestas a su propósito.

¡Buena suerte - esto suena como un proyecto interesante!

0

Antes de invertir en la paralelización de tu programa, ¿por qué no intentas dividir los conjuntos de datos 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.

2

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

+0

[descontinuado] (http://www.zdnet.com/blog/microsoft/microsoft-drops-dryad-puts-its-big-data-bets-on-hadoop/11226) – kmote

0

Es posible que desee ver Flow-Based Programming - tiene una implementación de 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 se pueden dividir y convertir en componentes separados, siempre que puedan ejecutarse de forma asincrónica con el resto de la aplicación (es decir, no subrutinas). Alguien lo llamó "convertir un iceberg en cubos de hielo").

Cuestiones relacionadas