Pregunta

Estoy desarrollando una aplicación científica utilizada para realizar simulaciones físicas. Los algoritmos utilizados son O (n3), por lo que para un gran conjunto de datos se tarda mucho tiempo en procesar. La aplicación ejecuta una simulación en aproximadamente 17 minutos, y tengo que ejecutar alrededor de 25,000 simulaciones. Eso es alrededor de un año de tiempo de procesamiento.

La buena noticia es que las simulaciones son completamente independientes entre sí, por lo que puedo cambiar fácilmente el programa para distribuir el trabajo entre varias computadoras.

Hay varias soluciones que puedo ver para implementar esto:

  • Obtenga una computadora multinúcleo y distribuya el trabajo entre todos los núcleos. No es suficiente para lo que necesito hacer.
  • Escribir una aplicación que se conecte a múltiples procesos de procesamiento servidores y distribuir la carga entre ellos.
  • Obtenga un grupo de computadoras linux baratas y haga que el programa trate todo como una sola entidad.

La opción número 2 es relativamente fácil de implementar, por lo que no busco muchas sugerencias sobre cómo implementar esto (se puede hacer simplemente escribiendo un programa que espere en un puerto determinado los parámetros, procese los valores y devuelve el resultado como un archivo serializado). Ese sería un buen ejemplo de Grid Computing .

Sin embargo, me pregunto por las posibilidades de la última opción, un clúster tradicional. ¿Qué tan difícil es ejecutar un programa Java en una cuadrícula de Linux? ¿Se tratarán todas las computadoras separadas como una sola computadora con múltiples núcleos, lo que facilitará la adaptación del programa? ¿Hay algún buen indicador de los recursos que me permita comenzar? ¿O estoy haciendo esto demasiado complicado y estoy mejor con la opción número 2?

EDITAR: Como información adicional, estoy interesado en cómo implementar algo como se describe en este artículo de la revista Wired: Scientific reemplazó una supercomputadora con un clúster de Linux Playstation 3 . Definitivamente el número dos suena como el camino a seguir ... pero el factor de frescura.

EDIT 2: El cálculo está muy vinculado a la CPU. Básicamente, hay muchas operaciones en matrices grandes, como inversa y multiplicación. Intenté buscar mejores algoritmos para estas operaciones, pero hasta ahora he descubierto que las operaciones que necesito son 0 (n3) (en bibliotecas que normalmente están disponibles). El conjunto de datos es grande (para tales operaciones), pero se crea en el cliente en función de los parámetros de entrada.


Ahora veo que tuve un malentendido sobre cómo funcionaba un clúster de computadora en Linux. Supuse que funcionaría de tal manera que parecería que tenía todos los procesadores en todas las computadoras disponibles, como si tuviera una computadora con múltiples núcleos, pero ese no parece ser el caso. Parece que todas estas supercomputadoras funcionan al tener nodos que ejecutan tareas distribuidas por alguna entidad central, y que hay varias bibliotecas y paquetes de software diferentes que permiten realizar esta distribución fácilmente.

Entonces, la pregunta realmente se convierte, ya que no existe el número 3, en: ¿Cuál es la mejor manera de crear una aplicación Java en clúster?

¿Fue útil?

Solución

Recomiendo encarecidamente el Java Parallel Processing Framework, especialmente porque sus cálculos ya son independientes. Hice un buen trabajo con esta licenciatura y funciona muy bien. El trabajo de hacer la implementación ya está hecho para usted, así que creo que esta es una buena manera de lograr el objetivo en el "número 2."

http://www.jppf.org/

Otros consejos

El número 3 no es difícil de hacer. Requiere desarrollar dos aplicaciones distintas, el cliente y el supervisor. El cliente es más o menos lo que ya tienes, una aplicación que ejecuta una simulación. Sin embargo, debe modificarse para que se conecte al supervisor mediante TCP / IP o lo que sea y solicite un conjunto de parámetros de simulación. Luego ejecuta la simulación y envía los resultados al supervisor. El supervisor escucha las solicitudes de los clientes y para cada solicitud, obtiene una simulación no asignada de una base de datos y actualiza la base de datos para indicar que el elemento está asignado pero no terminado. Cuando finaliza la simulación, el supervisor actualiza la base de datos con el resultado. Si el supervisor almacena los datos en una base de datos real (MySql, etc.), la base de datos puede consultarse fácilmente para conocer el estado actual de las simulaciones. Esto debería escalar hasta el punto en que el tiempo necesario para proporcionar los datos de simulación a todos los clientes es igual al tiempo requerido para realizar la simulación.

La forma más sencilla de distribuir la informática en un clúster de Linux es usar MPI. Te sugiero que descargues y mires MPICH2. Es gratis. su página de inicio está aquí

Si sus simulaciones son completamente independientes, no necesita la mayoría de las características de MPI. Puede que tenga que escribir algunas líneas de C para interactuar con MPI y comenzar la ejecución de su script o programa Java.

Debería consultar Hazelcast , la solución de agrupación peer2peer (sin servidor centralizado) más simple para Java. Pruebe Hazelcast Distributed ExecutorService para ejecutar su código en el clúster.

Saludos,

-talip

Ya lo sugirió, pero lo descalificó: núcleos múltiples. Podría optar por múltiples núcleos, si tuviera suficientes núcleos. Un tema candente es la computación GPGPU. Esp. NVIDIAs CUDA es un enfoque muy prometedor si tiene muchas tareas independientes que tienen que hacer el mismo cálculo. Una GTX 280 le ofrece 280 núcleos, que pueden calcular hasta 1120-15360 hilos simultáneamente. Un par de ellos podría resolver tu problema. Si es realmente implementable depende de su algoritmo (flujo de datos versus flujo de control), porque todos los procesadores escalares operan de manera SIMD.

Desventaja: sería C / C ++, no java

¿Qué tan optimizados están sus algoritmos? ¿Está utilizando bibliotecas BLAS nativas? Puede obtener un aumento de rendimiento de orden de magnitud al cambiar de bibliotecas ingenuas a optimizadas. Algunos, como ATLAS, también distribuirán automáticamente los cálculos en varias CPU en un sistema, de modo que cubran la viñeta 1 automáticamente.

Los grupos AFAIK generalmente no se tratan como una entidad única. Por lo general, se tratan como nodos separados y se programan con cosas como MPI y SCALAPACK para distribuir los elementos de las matrices en múltiples nodos. En realidad, esto no te ayuda mucho si tu conjunto de datos cabe en la memoria de un nodo de todos modos.

¿Ha visto Terracotta ?

Para la distribución del trabajo, querrá utilizar el Marco maestro / trabajador .

Hace diez años, la compañía para la que trabajé buscó una solución de virtualización similar, y Sun, Digital y HP la respaldaron en ese momento, pero solo con supercomputadoras de última generación con intercambio de hardware y similares. Desde entonces, escuché que Linux admite el tipo de virtualización que está buscando para la solución n. ° 3, pero nunca la he usado.

Primitivas y rendimiento de Java

Sin embargo, si realiza cálculos matriciales, desearía hacerlo en código nativo, no en Java (suponiendo que esté usando primitivas Java). Especialmente los errores de caché son muy costosos, y la intercalación en sus matrices matará el rendimiento. Los fragmentos de memoria no intercalados en sus matrices y el código nativo le permitirán aprovechar al máximo la velocidad sin hardware adicional.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top