2010-07-28 19 views
32

¿Cómo podemos hacer la programación paralela en Java? ¿Hay algún marco especial para eso? ¿Cómo podemos hacer que las cosas funcionen?Programación paralela en Java

Les diré lo que necesito, creo que estoy desarrollado un rastreador web, su gran cantidad de sitios web de Internet, un sistema de rastreo no hará que las cosas funcionen correctamente, por lo que necesitamos 1000 de sistema para trabajar Si este es el caso, ¿puedo aplicar la computación paralela? ¿Pueden darme un buen ejemplo?

+4

Depende de lo que quiere decir con "programación en paralelo". –

+0

@Stephen: trabajo 2 o sistema para un proceso, para que el proceso se complete rápidamente –

+0

Veo ... no el tipo SIMD de programación en paralelo. –

Respuesta

16

Si usted está planteando pura programación paralela decir no concurrente de programación, entonces definitivamente debe tratar MPJExpress http://mpj-express.org/. Es una implementación de mpiJava segura para subprocesos y admite modelos de memoria distribuida y compartida. Lo probé y encontré muy confiable.

1 import mpi.*; 
2 
3 
/** 
4 * Compile:impl specific. 
5 * Execute:impl specific. 
6 */ 
7 
8 public class Send { 
9 
10  public static void main(String[] args) throws Exception { 
11 
12   MPI.Init(args); 
13 
14   int rank = MPI.COMM_WORLD.Rank() ; //The current process. 
15   int size = MPI.COMM_WORLD.Size() ; //Total number of processes 
16   int peer ; 
17 
18   int buffer [] = new int[10]; 
19   int len = 1 ; 
20   int dataToBeSent = 99 ; 
21   int tag = 100 ; 
22 
23   if(rank == 0) { 
24 
25    buffer[0] = dataToBeSent ; 
26    peer = 1 ; 
27    MPI.COMM_WORLD.Send(buffer, 0, len, MPI.INT, peer, tag) ; 
28    System.out.println("process <"+rank+"> sent a msg to "+ 29        "process <"+peer+">") ; 
30 
31   } else if(rank == 1) { 
32 
33    peer = 0 ; 
34    Status status = MPI.COMM_WORLD.Recv(buffer, 0, buffer.length, 35             MPI.INT, peer, tag); 
36    System.out.println("process <"+rank+"> recv'ed a msg\n"+ 37        "\tdata <"+buffer[0] +"> \n"+ 38        "\tsource <"+status.source+"> \n"+ 39        "\ttag <"+status.tag +"> \n"+ 40        "\tcount <"+status.count +">") ; 
41 
42   } 
43 
44   MPI.Finalize(); 
45 
46  } 
47 
48 } 

Una de las funcionalidades más comunes proporcionados por bibliotecas de mensajería como MPJ Express es el apoyo de comunicación punto a punto entre los procesos de ejecución. En este contexto, dos procesos que pertenecen al mismo comunicador (por ejemplo, el comunicador MPI.COMM_WORLD) pueden comunicarse entre sí enviando y recibiendo mensajes. Una variante del método Send() se usa para enviar el mensaje desde el proceso del remitente. Por otro lado, el proceso de recepción recibe el mensaje enviado utilizando una variante del método Recv(). Tanto el emisor como el receptor especifican una etiqueta que se utiliza para encontrar un mensaje entrante coincidente en el lado del receptor.

Después de inicializar la biblioteca de MPJ Express utilizando el método MPI.Init (args) en la línea 12, el programa obtiene su rango y el tamaño del comunicador MPI.COMM_WORLD. Ambos procesos inicializan una matriz de enteros de longitud 10 llamada buffer en la línea 18.El proceso del emisor-rango 0-almacena un valor de 10 en el primer elemento de la matriz de mensajes. Una variante del método Send() se usa para enviar un elemento de la matriz de mensajes al proceso del receptor.

El proceso del remitente llama al método Send() en la línea 27. Los primeros tres argumentos están relacionados con los datos que se envían. La matriz emisora ​​-la matriz más grande- es el primer argumento seguido por 0 (o! Set) y 1 (conteo). Los datos que se envían son del tipo MPI.INT y el destino es 1 (variable par); el tipo de datos y el destino se especi fi can como cuarto y quinto argumento del método Send(). El último y el sexto argumento es la variable de etiqueta. Una etiqueta se usa para identificar mensajes en el lado del receptor. Una etiqueta de mensaje suele ser un identificador de un mensaje particular en un comunicador específico. Por otro lado, el proceso del receptor (rango 1) recibe el mensaje utilizando el método de recepción de bloqueo.

+0

Butt: ¿Puedes decir cómo puedo implementarlo? –

+0

seguro. Supongo que ha descargado la versión multinúcleo de mpj-express.He añadido un fragmento de código en mi respuesta ahora. Tengo los documentos para la API. puedes llamarme si quieres esos. –

+0

Butt: ¿Cómo puedo PM? ¿Podrías por favor darme tu dirección de correo electrónico? –

2

en el procesamiento paralelo de Java se realiza mediante hilos que forman parte de la biblioteca de ejecución

El Concurrency Tutorial debe responder a muchas preguntas sobre este tema, si usted es nuevo en Java y la programación paralela.

2

He oído hablar de uno en la conferencia hace unos años - ParJava. Pero no estoy seguro del estado actual del proyecto.

+5

Veo que es nuevo en StackOverflow y pensó que quizás no sepa que las personas usualmente votan por respuestas útiles. – grigy

8

Java admite subprocesos, por lo tanto, puede tener una aplicación Java de subprocesos múltiples. Recomiendo el Programación Concurrente en JAVA: Principios y patrones de libros para ese diseño:

http://java.sun.com/docs/books/cp/

+0

thks para la información –

+0

Los hilos están bien, pero en mi opinión, pero esto debe decirse: HILOS SON UN MUERTO FINAL. Los hilos son solo para cosas triviales como la "vivacidad" de la interfaz de usuario, mientras que una tarea de larga duración procede al mismo tiempo, por lo que en otras palabras, 2 hilos. Seguro que hay 12 estaciones de trabajo de 24 hilos pero el cartel dice que quiere miles de hilos. Use algo como JPPF o puede ser Hadoop. – H2ONaCl

2

Por lo que yo sé, en la mayoría de los sistemas operativos del mecanismo de ordenamiento de Java debe basarse en los hilos del núcleo reales . Esto es bueno desde la perspectiva de programación paralela. Otros lenguajes como Python simplemente hacen un poco de multiplexación de tiempo del procesador (es decir, si ejecuta una aplicación multiproceso pesada en una máquina multiprocesador, verá solo un procesador ejecutándose).

Usted puede encontrar fácilmente algo sólo googling: por ejemplo, este es el primer resultado de "enhebrado java": http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/

Básicamente se reduce a extender la clase Thread, sobrecargar el método de "correr" con el código que pertenece a la otra cadena y llama al método "start" en una instancia de la clase que extendió.

Además, si necesita hacer que algo sea seguro, eche un vistazo al synchronized methods.

+0

@Decav: thks para la información;) –

+0

Los subprocesos son un callejón sin salida porque no puede ir masivamente paralelo. El cartel dijo que quería miles de sistemas. – H2ONaCl

1

Es posible que desee comprobar Hadoop. Está diseñado para tener trabajos que se ejecutan en una cantidad arbitraria de casillas y se encarga de toda la contabilidad para usted. Está inspirado en MapReduce de Google y sus herramientas relacionadas, por lo que incluso proviene de la indexación web.

3

Este es el recurso programación paralela que he hecho notar que en el pasado:

http://www.jppf.org/

no tengo ni idea de si su bueno o no, sólo que alguien lo recomendó hace un tiempo.

8

que desea buscar en el marco de procesamiento en paralelo de Java (JPPF)

2

paquete java.util.concurrency y el libro de Brian Goetz "concurrencia de Java en la práctica"

También hay una gran cantidad de recursos aquí sobre los patrones paralelos de Ralph Johnson (uno de los patrones de diseño GoF autor): http://parlab.eecs.berkeley.edu/wiki/patterns/patterns

2

¿está el ateji PX-paralelo de bucle lo que estás buscando? Esto rastrear todos los sitios en paralelo (nótese la doble barra al lado del de la palabra clave):

for||(Site site : sites) { 
    crawl(site); 
} 

Si necesita componer los resultados de rastreo, entonces probablemente querrá usar una comprensión paralelo, como:

Set result = set for||{ crawl(site) | Site site : sites } 

Además de leer aquí: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

7

usted puede echar un vistazo a Hadoop y Hadoop Wiki .Este es un marco inspirado en Apache de google map-reduce.It le permite d o Computación distribuida usando múltiples sistemas. Muchas compañías como Yahoo, Twitter lo usan (Sites Powered By Hadoop). Consulte este libro para obtener más información sobre cómo usarlo Hadoop Book.

+0

necesito saber más sobre Hadoop, ¿me pueden ayudar? –

+1

@alex: La verdad es que acabo de encontrar este marco hace 2 días. Así que no tengo mucha idea sobre cómo usarlo. Comencé a leer el libro (el que te di como enlace). Creo que puede dar un buen comienzo. De cualquier manera, si tiene algún problema, siéntase libre de preguntar. Si sé, lo ayudaré. Puede consultar este enlace en SO con etiquetas hadoop.http: //stackoverflow.com/questions/tagged/hadoop. Esto podría ayudarlo a comprender los problemas que enfrentan los usuarios de hadoop en general. – Emil

+1

@alex: También por lo que entiendo, lo que necesita es distribuir la carga de un sistema a muchas máquinas. No creo que aprender sobre el hilo o la concurrencia en Java lo ayude a lograr esto. Creo que hadoop es el único código abierto. , un marco estable que le permite hacer esto a partir de ahora. Puede tomar algún tiempo aprender un nuevo marco, pero siempre es mejor que "reinventar la rueda". – Emil

0

Puede probar Parallel Java 2 Library.

En el sitio web Prof. Alan Kaminsky escribió:

Fast forward to 2013, when I started developing PJ2. Parallel computing had expanded far beyond what it was a decade earlier. Multicore parallel computers were equipped with many more CPU cores and much larger main memory, such that computations that used to require a whole cluster now could be done on a single multicore node. New kinds of parallel computing hardware had become commonplace, notably graphics processing unit (GPU) accelerators. Cloud computing services, such as Amazon's EC2, allowed anyone to run parallel programs on a virtual supercomputer with thousands of cores. New application areas for parallel computing had opened up, notably big data analytics. New parallel programming APIs had arisen, such as OpenCL and NVIDIA Corporation's CUDA for GPU parallel programming, and map-reduce frameworks like Apache's Hadoop for big data computing. To explore and take advantage of all these trends, I decided that a completely new Parallel Java 2 Library was needed.

A principios de 2013, cuando PJ2 aún no estaba disponible (aunque una versión anterior era), he intentado Java Parallel Processing Framework (JPPF). JPPF estaba bien, pero a primera vista PJ2 parece interesante.

0

Hay una biblioteca llamada Habanero-Java (HJ), desarrollada en Rice University que se construyó usando lambda expressions y puede ejecutarse en cualquier Java 8 JVM.

HJ-lib integra una amplia gama de construcciones de programación paralelas (por ejemplo, tareas asincrónicas, futuros, tareas basadas en datos, barreras, phasers, transacciones, actores) en un único modelo de programación que permite combinaciones únicas de estos constructos (por ejemplo, combinaciones anidadas de paralelismo de tarea y actor).

El tiempo de ejecución de HJ es responsable de orquestar la creación, ejecución y terminación de las tareas de HJ, y cuenta con programadores de trabajo compartido y de robo de trabajo. Puede seguir el tutorial para configurarlo en su computadora.

Aquí es un simple ejemplo HelloWorld:

import static edu.rice.hj.Module1.*; 

public class HelloWorld { 

public static void main(final String[] args) { 

    launchHabaneroApp(() -> { 

     finish(() -> { 
      async(() -> System.out.println("Hello World - 1!")); 
      async(() -> System.out.println("Hello World - 2!")); 
      async(() -> System.out.println("Hello World - 3!")); 
      async(() -> System.out.println("Hello World - 4!")); 
     }); 

    }); 
}} 

Cada async método se ejecuta en paralelo con los otros asincrónicos métodos, mientras que el contenido dentro de estos métodos ejecuta secuencialmente. El programa no continúa hasta que se complete todo el código dentro del método.

+0

Excepción en el hilo "principal" java.lang.RuntimeException: java.lang.Error: La función de llamada no está instrumentada. Este error viene con la ejecución de este código. ¿Como arreglar? –

+0

Una advertencia que olvidé mencionar es que HJ-Lib requiere que configure la opción javaagent para ejecutarlo. Proporcionan servicios que permiten a los agentes del lenguaje de programación Java instrumentar los programas que se ejecutan en la JVM. No estoy seguro acerca de otros IDEs, pero en IntelliJ, vas a tener que ir a Editar Configuraciones y agregar '-javaagent: $ DIRECCIÓN_MOD $/lib/hjlib-cooperative-0.1.8.jar' (o lo que sea). versión de jar que tiene) a las opciones de VM. –

1

Paralelismo

Paralelismo significa que una aplicación se divide sus tareas hasta en subtareas más pequeñas que se pueden procesar en paralelo, por ejemplo en múltiples CPUs exactamente al mismo tiempo. enter image description here