MPI JAVA
(Computo Paralelo)
Computo Paralelo con JAVA (Crea tu Cluster)
Este manual le mostrara como configurar y trabajar con MpiJava (Interfaz de Paso de Mensajes). La
ejecución simultanea de una misma tarea, repartida sobre varios procesadores a fin de obtener un
resultado más rápido se le conoce como computo paralelo. By: John Michel Rivera de León.
[email protected]
“Es detestable esa avaricia espiritual que
tienen los que, sabiendo algo, no procuran
la transmisión de esos conocimientos”
By: John Michel Rivera de León
MPI JAVA
(Computo
Paralelo)
Computo Paralelo con JAVA (Crea tu Cluster)
Introduccio n
Una de las razones principales para utilizar el cómputo paralelo
es obtener un alto rendimiento al ejecutar un programa. Hoy en
MPI JAVA
Este manual le enseña a
como trabajar con
computo paralelo
utilizando
programación paralela
con Java.
día diferentes áreas tales como la biología, química, física, la
Se creara un Cluster de
industria cinematográfica, por mencionar solo algunas, se ven
computadoras para
beneficiadas con esta tecnología; en general, aplicaciones que
trabajar en paralelo.
requieren realizar grandes cantidades de cálculos son excelentes
candidatos para utilizar el cómputo paralelo.
Para utilizar el cómputo paralelo es necesario que nuestros
programas sean hechos con programación paralela y necesitamos
también contar con una arquitectura paralela para ejecutarlos.
Para poder utilizar el cómputo paralelo, necesitamos hacer uso
de la programación paralela. La programación paralela es una
técnica de programación basada en la ejecución simultánea, bien
sea en una misma computadora con varios procesadores o en un
sistema tipo cluster de computadoras.
Para paralelizar una aplicación es necesario contar con el
lenguaje adecuado que permita expresar el paralelismo del
problema. Dependiendo de la herramienta con que se cuente, se
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
1
By: John Michel Rivera de León
particionará el código en piezas para que se ejecute en paralelo en varios procesadores.
Es importante mencionar que no todos los problemas pueden ser paralelizados, hay
problemas que son inherentemente secuenciales y por lo tanto es difícil conseguir su
ejecución en paralelo.
Requerimientos
Bien, lo primero que necesitamos son los siguientes paquetes:
1. MPICH2
2. MPIJava
3. Open SSH Servidor & cliente.
4. NFS Kernel Servidor & cliente.
5. Java (para este ejemplo utilize jdk 1.7)
6. GCC
Ya que contamos con el software, lo primero que vamos a hacer es crear un usuario y
folder compartido
Primero creamos el folder con: sudo mkdir /mirror
Despues creamos el usuario: sudo adduser mpiu --home /mirror
Damos permisos: sudo chown mpiu /mirror
Mpiu es el nuevo usuario, asignamos privilegios de todo en System->Administration-
>Users and Groups Una vez realizado esto, nos logueamos con este user.
Ahora para cada nodo o maquina que usemos en el cluster, le asignamos un hostname e
ip único. Esto con el comando sudo gedit /etc/hostname
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
Reiniciamos la maquina.
2
Nos logueamos nuevamente con el user mpiu.
By: John Michel Rivera de León
Instalamos gcc : sudo apt-get install build-essential
Instalamos java: sudo apt-get install sun-java6-jdk
Si les faltan otras referencias instalan los paquetes faltantes. Yo instale JDK 1.7
manualmente así que las direcciones cambiaran.
Instalamos MPICH2, este puede ser via apt: sudo apt-get install mpich2
Pero no se si funcione, yo lo instale a manita como debe de ser:
Bajamos el mpich2-(version).tar.gz de su web.
Nos vamos al escritorio y creamos una carpeta MPICH2:
mkdir mpich2
descomprimimos : tar xvf mpich2-(version).tar.gz
ingresamos a la carpeta: cd mpich2-(version)
configuramos con el prefix donde se instala:
./configure --prefix=/mirror/mpich2
una vez configurado, hacemos: make && make install
el && es; si todo salio bien entonces instalalo.
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
Como ven, en mi imagen integre -–disable-f77 y -–disable-fc
Esto para desactivar la compilación con fortran, puesto que no lo ocupo y no lo tengo
instalado xD.
Después del make && make install debe quedar como esto:
3
By: John Michel Rivera de León
Ahora, nos dirigimos al directorio mirror, dentro de el modificamos el .bashrc con gedit:
gedit /mirror/.bashrc
agregamos las líneas:
export PATH=/mirror/mpich2/bin:$PATH
export LD_LIBRARY_PATH=/mirror/mpich2/lib:$LD_LIBRARY_PATH
aqui como me quedo a mi, puesto que lo hice en el desktop:
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
Cargamos estas variables con source:
source ~/.bashrc
4
Ahora definimos el path de MPICH para que sea visible a SSH.
By: John Michel Rivera de León
sudo echo /mirror/mpich2/bin >> /etc/environment
Probamos la instalación de MPICH con: which mpiexec y tambien con mpirun
Muy bien ya instalamos MPICH2, que en realidad es para trabajar con MPI pero con C,
C++.
Ahora necesitamos instalar MPI Java que utiliza JNI para trabajar con los procesos de
MPICH2.
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
5
By: John Michel Rivera de León
Instalando MPIJAVA
Descomprimimos el paquete de MPIJava, nos metemos a el cd mpiJava.
Configuramos: ./configure
Al configurar pon atención, ya que te pedirá el path de java, este lo puedes saber con el
comando which java. Y metes esa direccion cuando te la pida el ./configure.
En mi caso como instale JDK a manita mi path es: /usr/lib/jvm/jdk1.7.0
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
Ya que finalizo, hacemos : make
6
Ya que se compilo correctamente abrimos nuevamente el archivo .bashrc
gedit ~/.bashrc
agregamos estas nuevas lineas:
By: John Michel Rivera de León
export CLASSPATH=$CLASSPATH:/mirror/mpiJava/lib/classes/ export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mirror/mpiJava/lib/
Cargamos la fuente nuevamente con : source ~/.bashrc
Ya que cargamos estos fuentes, ya tenemos listo MPIJAVA!!!!
Ahora hay que probarlo con un programa xD!!!.
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
7
By: John Michel Rivera de León
Ejemplo Programacio n Paralela con MPI JAVA
Muye bien ahora creamos un programa sencillo que acceda a una base datos en MySQL,
de ahí extrae datos por cada nodo trabajador y envían los resultados al nodo principal.
De esta manera cada nodo se reparte el trabajo de extraer la información de una columna
de una tabla, y le envían los resultados a un solo nodo principal, que es el que solo
almacena los resultados que le envían, así todos trabajan en conjunto xD.
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
l
l
)
o
e
a
r
a
P
o
t
u
p
m
o
C
(
A
V
A
J
I
P
M
8
Aquí el código:
/*
* Author of revised version: John Michel Rivera de León
*
*/
import mpi.* ;
import java.sql.*;
class Okas {
By: John Michel Rivera de León
dest=0;
static public void main(String[] args) throws MPIException {
Connection conn;
ResultSet rs;
Statement st;
MPI.Init(args) ;
int my_rank; // Rango del proceso
int source; // Rango del enviador
int dest; // Rango del recividor
int tag=50; // Tag para mensajes
int myrank = MPI.COMM_WORLD.Rank() ;
int p = MPI.COMM_WORLD.Size() ;
if(myrank == 1) {
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/prueba","root","root");
st=conn.createStatement();
rs= st.executeQuery("SELECT * FROM datos");
while(rs.next()){
char [] message = ("Registro de proceso " + myrank+":Nombre["+rs.getObject("nombre")+"]").toCharArray() ;
MPI.COMM_WORLD.Send(message, 0, message.length, MPI.CHAR,dest, tag) ;
message = new char[45];
//System.out.println("id="+rs.getObject("id")+" nombre="+rs.getObject("nombre")+" edad="+rs.getObject("edad")+"
desde["+MPI.Get_processor_name()+"]");
}
}catch(Exception e){System.out.println(e);}
}
if(myrank == 2) {
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/prueba","root","root");
st=conn.createStatement();
rs= st.executeQuery("SELECT * FROM datos");
while(rs.next()){
char [] message = ("Registro de proceso " + myrank+":edad["+rs.getObject("edad")+"]").toCharArray() ;
MPI.COMM_WORLD.Send(message, 0, message.length, MPI.CHAR,dest, tag) ;
}
}catch(Exception e){System.out.println(e);}
}
if(myrank == 3) {
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/prueba","root","root");
st=conn.createStatement();
rs= st.executeQuery("SELECT * FROM datos");
while(rs.next
Comentarios de: MPI JAVA (Computo Paralelo) (0)
No hay comentarios