Mudanças entre as edições de "Minicluster:Compilando MPI"

De WikiLICC
Ir para: navegação, pesquisa
m (Criou página com '== MPICH sem funcionalidade Torque == Parece que na distribuição padrão não está presente. Para instalação veja [http://www3.mat.ufrgs.br/mediawiki/index.php/Minicluster:…')
 
m (Conectando)
 
(37 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
== MPICH sem funcionalidade Torque  ==
+
* Configure o MPICH conforme [Minicluster:MPICH].
Parece que na distribuição padrão não está presente. Para instalação veja [http://www3.mat.ufrgs.br/mediawiki/index.php/Minicluster:Linux#Update  Minicluster:Linux#Update]
+
== Conectando ==
 +
Conecte-se a alguma máquina do instituto (Ex. hunter,euler,...).
  
Neste paradigma, usuários (e sysadmins) são responsáveis por mais overhead e mais possibilidade de erros de configuração. É recomendado usar um [[scheduler and queue]] com Torque.
+
Conecte-se a máquina '''one''':
 +
[dago@hunter]$ ssh dago@one
 +
Verifique quais máquinas nós estão ativas:
 +
[dago@one]$ pingcluster.sh
  
= Configurações =
 
Mpd significa "multi-purpose daemon."  MPICH2 separa comunicação de processos de gerenciamento de processo usando o programa mpd para gerenciar qualquer processo usando MPI.  Mpd necessita uma pequena configuração que não era necessário com MPICH1.
 
  
== Para o usuário comum ==
+
 
Cada usuário deve ter um arquivo <code>.mpd.conf</code> no seu diretório <code>/home/usuario/</code> e deve permitir acesso e leitura somente a este usuário.
+
Verifique os testes da sessão [Minicluster:MPICH], principalmente o último usando '''mpiboot'''. Inicie o daemon
 +
 
 +
Verifique quais nós estão ativos (para nós ativos aparecem o último número do ip e para nós inativos aparece [ . ]):
 +
[dago@one]$ pingcluster.sh
 +
====================
 +
=      MATRIX      =
 +
====================
 +
[108][109][ . ][ . ]
 +
[112][113][ . ][ . ]
 +
[100]  <- switch
 +
[116][117][ . ][ . ]
 +
[120][121][ . ][ . ]
 +
====================
 +
 
 +
== Configurando o mpd.conf ==
 +
Cada usuário deve ter um arquivo .mpd.conf no seu diretório /home/usuario/ e deve permitir acesso e leitura somente a este usuário.
  
 
  [usuario@one]$ cd
 
  [usuario@one]$ cd
Linha 14: Linha 31:
 
  MPD_SECRET_WORD=yours3cr3tw0rd
 
  MPD_SECRET_WORD=yours3cr3tw0rd
 
  MPD_USE_ROOT_MPD=yes
 
  MPD_USE_ROOT_MPD=yes
 +
[usuario@one]$ chmod 600 .mpd.conf
  
 
onde
 
onde
*<code>MPD_SECRET_WORD</code> pode ser única para cada usuário.
+
    MPD_SECRET_WORD pode ser única para cada usuário.
*<code>MPD_USE_ROOT_MPD</code> especifica que usuários não irão iniciar se próprio mpd daemons, mas irão usar um já rodando iniciado pelo root.
+
    MPD_USE_ROOT_MPD especifica que usuários não irão iniciar se próprio mpd daemons, mas irão usar um já rodando iniciado pelo root.
  
  
== Para o usuário root ==
+
Verifique se os nós ativos estão conectados através do '''mpd''' formando um anel (os números após o '_' devem mudar):
Similar aos usuários, o root precisa ter um arquivo <code>mpd.conf</code> em todos os nós localizado em
+
  [dago@one]$ ssh cell108 -T "mpdtrace -l"
  [root@one]$ cd /etc
+
  cell108_35232 (192.168.0.108)
  [root@one]$ vi /etc/mpd.conf
+
cell121_55680 (192.168.0.121)
  MPD_SECRET_WORD=yours3cr3tw0rd
+
cell120_58236 (192.168.0.120)
e permitir acesso leitura e escrita somente ao root
+
cell117_35568 (192.168.0.117)
  [root@one]$ chmod 600 /etc/mpd.conf
+
cell116_42441 (192.168.0.116)
 +
  cell113_39465 (192.168.0.113)
 +
cell112_50931 (192.168.0.112)
 +
  cell109_45891 (192.168.0.109)
  
=== Para criar um script para todos os usuários===
+
Ok. Nós ativos e conectados através do daemon mpd. Cluster pronto para ser usado em paralelo.
* Crie o arquivo acima em
 
[root]$ cd
 
[root]$ vi .mpd.conf
 
[root]$ chmod 600 /root/.mpd.conf
 
* Faça uma cópia para cada usuário:
 
for x in `ls /shared/home/`; do rsync -plarv /root/.mpd.conf /shared/home/$x/; chown $x:users /shared/home/$x/.mpd.conf; done
 
  
Troque <code>/shared/home/</code> com o diretório home dos usuários e troque <code>users</code> com o grupo que os usuários estão.
+
== Digitando ==
 
+
Abra um editor de textos (por exemplo o vi ou emacs):
=== Usuários futuros ===
+
[dago@one]$ vi hellompi.f90
Para usuários futuros terem automaticamente o arquivo criado, crie <code>.mpd.conf</code> em <code>/etc/skel/</code> na máquina que os usuários são criadosTenha certeza que as flags estejam setadas corretamente. Então rode
+
e digite o programa abaixo:
 
+
program hellompi
  chmod 600 /etc/skel/.mpd.conf
+
implicit none
 
+
include "mpif.h"
para ter certeze que o arquivo tenha permissão de escrita e leitura para o usuário somente.
+
integer      ::  np, myid, ier,length
 +
character*80  ::  nome
 +
 +
  call MPI_Init( ier )
 +
call MPI_Comm_size( MPI_COMM_WORLD, np,  ier)
 +
  call MPI_Comm_rank( MPI_COMM_WORLD, myid, ier)
 +
call MPI_Get_processor_name(nome,length,ier)
 +
 +
print *,"Sou o processo ", myid," de um total de ", np," rodando em ",nome
 +
 +
call MPI_Finalize( ier )
 +
end program
  
= Testes =
+
== Compilando ==
==Configuring Worker Nodes to use Root's MPD Daemon ==
+
* Conectado a máquina '''one''', compile o programa (não compile conectados aos nós para não sobrecarregá-los):
Starting up an mpd daemon for each user each time they log in is doable, but that requires an extra step of complexity for your users to understand.  Plus, they'll need to remember to start up daemons on multiple machines when they run programs that require multiple processors (not just multiple ''processes'').
+
[dago@one]$ mpif90 hellompi.f90 -o hellompi
  
An easier paradigm to follow is to start a single mpd daemon on each of the worker nodes and have users' programs attach to that daemon.  Continue on to [[MPICH: Starting a Global MPD Ring]] to implement this.
+
== Rodando em um processador ==
 
+
Para rodar existem duas opções:
IMPORTANTE: A maioria dos testes deve ser feito tanto na máquina '''one''' quanto na máquina '''cell100'''
+
* Conecte a um nó e inicie o comando mpiexec neste nó:
 
+
  [dago@one]$ ssh dago@cell108
== Iniciar um Daemon ==
+
  [dago@cell108]$ mpdtrace -l
* Conecte-se a máquina  (como root) e inicie mpd (multi-purpose daemon) para rodar em background
+
  cell108_41888 (192.168.0.108)
  [ hunter  ]$ ssh usuario@one
+
  cell109_42454 (192.168.0.109)
  [usuario@one]$ mpd --daemon
 
 
 
* Verifique se o mpd foi iniciado nesta máquina [deveria aparecer algo como o Nome.da.maquina_PID (endereco.ip)]:
 
[usuario@one]$ mpdtrace -l
 
  one.matrix_54419 (192.168.0.99)
 
 
 
* Teste também em '''cell100'''
 
 
 
== Testar o mpdcheck em um nó ==
 
Seguindo o manual do [mpich2] e os testes do apêndice A.
 
 
 
* Testar em um nó (duas janelas diferentes então)
 
  [dago@one ~] $ mpdcheck -s
 
server listening at INADDR_ANY on: one.matrix 60582
 
Em outra janela, no mesmo nó
 
[dago@one ~] $ mpdcheck -c one 60582
 
client successfully recvd ack from server: ack_from_server_to_client
 
Que dará resposta na primeira janela
 
server has conn on <socket._socketobject object at 0x7fa130646980> from ('192.168.0.99', 54005)
 
server successfully recvd msg from client: hello_from_client_to_server
 
 
 
* Testar também em '''cell100'''
 
 
 
== Rodar em uma máquina ==
 
É possível rodar um programa que não use MPICH com o mpd:
 
[dago@one ~]$ mpd --daemon
 
 
   
 
   
  [dago@one ~]$ mpiexec -n 1 /bin/hostname
+
  [dago@cell108]$ mpiexec ./hellompi
one.matrix
 
 
   
 
   
  [dago@one ~]$ mpiexec -l -n 4 /bin/hostname
+
* Utilize o comando ssh para rodar o comando mpiexec no nó:
1: one.matrix
+
  [dago@one]$ ssh cell108 -T "mpiexec ./hellompi"
2: one.matrix
 
0: one.matrix
 
3: one.matrix
 
  
* Testar em '''cell100'''
 
  
== Testar o mpdcheck em um anel com dois nós ==
+
=== Rodando no cluster ===
* Iniciar em '''one''' o processo mpdcheck (ver [http://lists.mcs.anl.gov/pipermail/mpich-discuss/2006-August/001521.html]):
+
* Para rodar em 4 processadores (2 máquinas x 2 processadores)
  [dago@one ~] $ mpdcheck -s
+
  [dago@cell108]$ mpiexec -l -n 4 ./hellompi
  server listening at INADDR_ANY on: one.matrix 60582
+
2:  Sou o processo 2  de um total de            4  rodando em cell109
 +
0:  Sou o processo 0  de um total de            4  rodando em cell108
 +
1:  Sou o processo 1  de um total de            4  rodando em cell109
 +
  3: Sou o processo 3  de um total de            4  rodando em cell108
  
No outro nó, cell100
+
== Usando o MPE ==
[dago@cell100 ~] $ mpdcheck -c one 60582
+
* Para compilar o programa:
client successfully recvd ack from server: ack_from_server_to_client
+
  [one]$ mpif90 hellompi.f90 -o hellompi -mpe=mpilog
 
 
Que dará resposta na primeira janela
 
server has conn on <socket._socketobject object at 0x7fa130646980> from ('192.168.0.99', 54005)
 
server successfully recvd msg from client: hello_from_client_to_server
 
 
 
* Fazer o teste ao contrário também, iniciando de cell100.
 
 
 
== Rodar no anel de máquinas ==
 
No nó mestre
 
[one]$ mpd --daemon
 
[one]$ mpdtrace -l
 
one.matrix_44333 (192.168.0.99)
 
 
 
No nó escravo
 
[cell100]$ mpd -h one -p 44333 --daemon
 
[cell100]$ mpdtrace -l
 
cell100.matrix_58296 (192.168.0.100)
 
one.matrix_44333 (192.168.0.99)
 
[cell100]$
 
 
 
No nó mestre
 
[one]$ mpdtrace -l
 
one.matrix_44333 (192.168.0.99)
 
cell100.matrix_58296 (192.168.0.100)
 
[one]$ mpiexec -n 2 /bin/hostname
 
one.matrix
 
cell100.matrix
 
[one]$ mpiexec -n 4 /bin/hostname
 
cell100.matrix
 
one.matrix
 
cell100.matrix
 
one.phantom
 
[one]$ mpiexec -l -n 4 /bin/hostname
 
1: cell100.matrix
 
2: one.matrix
 
0: one.matrix
 
3: cell100.matrix
 
[one]$
 
 
 
Um programa hellompi em paralelo
 
[one]$ mpiexec -l -n 4 ./hellompi
 
0:  Sou o processo 0  de um total de            4  rodando em one.matrix
 
1:  Sou o processo 1  de um total de            4  rodando em cell100.matrix
 
2:  Sou o processo 2  de um total de            4  rodando em one.matrix
 
3:  Sou o processo 3  de um total de            4  rodando em cell100.matrix
 
 
 
== Rodar um programa MPI ==
 
Abra o editor de texto e digite o programa "hello world" [[Creating and Compiling an MPI Program]].
 
[usuario@one]$ vi hellompi.f90
 
 
 
...Compilando...
 
 
Para rodar o programa em um processo
 
[usuario@one]$ mpiexec ./hellompi
 
  
Rode novamente usando mais processos (e um processador - talvez 2 se for dual-core ?)
+
* Para rodar o programa:
[usuario@cell100]$ mpiexec -np 4 ./hellompi
+
  [one]$ mpiexec -l -n 4 ./hellompi  
Sou o processo            0  de um total de            4  rodando em cell100.matrix
 
Sou o processo            2  de um total de            4  rodando em cell100.matrix
 
Sou o processo            1  de um total de            4  rodando em cell100.matrix
 
Sou o processo            3  de um total de            4  rodando em cell100.matrix
 
onde <code>cell100.matrix</code> é o nome da máquina (todas no mesmo nó ainda). Para rodar em mais máquinas, primeiro desligue o mpd
 
[usuario@one]$ mpdallexit
 
  
 +
* Depois de rodar o programa, um arquivo Unknows.clog2 foi criado. Para visualizar a iteração entre os computadores:
 +
  [one]$ jumpshot Unknown.clog2
  
 +
* Veja sobre visualizadores em http://www.mcs.anl.gov/research/projects/perfvis/software/viewers/index.htm
  
== Testando o anel de máquinas ==
+
== Problemas: ==
* ALELUIA. Funcionou!
 
No nó mestre
 
dago@um ~ $ mpd --daemon
 
dago@um ~ $ mpdtrace -l
 
um.phantom_44333 (192.168.0.99)
 
No nó escravo
 
[dago@cell100 ~]$ mpd -h um -p 44333 --daemon
 
[dago@cell100 ~]$ mpdtrace -l
 
cell100.matrix_58296 (192.168.0.100)
 
um.phantom_44333 (192.168.0.99)
 
[dago@cell100 ~]$
 
No nó mestre
 
dago@um ~ $ mpdtrace -l
 
um.phantom_44333 (192.168.0.99)
 
cell100.matrix_58296 (192.168.0.100)
 
dago@um ~ $ mpiexec -n 2 /bin/hostname
 
um.phantom
 
cell100.matrix
 
dago@um ~ $ mpiexec -n 4 /bin/hostname
 
cell100.matrix
 
um.phantom
 
cell100.matrix
 
um.phantom
 
dago@um ~ $ mpiexec -l -n 4 /bin/hostname
 
1: cell100.matrix
 
2: um.phantom
 
0: um.phantom
 
3: cell100.matrix
 
dago@um ~ $
 
Um programa hellompi em paralelo
 
dago@um fortran $ mpiexec -l -n 4 ./hellompi
 
0:  Sou o processo 0  de um total de            4  rodando em um.phantom
 
1:  Sou o processo 1  de um total de            4  rodando em cell100.matrix
 
2:  Sou o processo 2  de um total de            4  rodando em um.phantom
 
3:  Sou o processo 3  de um total de            4  rodando em cell100.matrix
 
  
=== Teste final ===
+
=== 1) mpdtrace resulta vazio ===
No mestre
+
Caso as máquinas não estejam conectadas através do mpd, o usuário pode formar ele mesmo um anel (Comunique ao Prof.Dagoberto por email para que possa iniciar o serviço). No momento, crie um arquivo ~/.mpd.hosts com os nós ativos (2 máquinas nesse exemplo):
dago@um ~ $ mpdboot -n 2
+
  [dago@cell108]$ vi ~/.mpd.hosts       
  dago@um ~ $ mpdtrace -l
+
  cell108:2
um.phantom_40584 (192.168.0.99)
+
  cell109:2
  cell100.matrix_59410 (192.168.0.100)
+
e inicie um anel
  dago@um ~ $ cd fortran/
+
  [dago@cell108]$ mpdboot -n 2 -f ~/.mpd.hosts
  dago@um fortran $ mpiexec -l -n 2 ./hellompi
+
Verifique se funcionou.
1:  Sou o processo            1  de um total de            2  rodando em  cell100.matrix
+
  [dago@cell108]$ mpdtrace -l
0:  Sou o processo            0  de um total de            2  rodando em um.phantom
+
  cell108_41199 (192.168.0.108)
Em cell100
+
  cell109_52092 (192.168.0.109)
  [dago@cell100 fortran]$ mpdtrace -l
 
  cell100.matrix_59410 (192.168.0.100)
 
  um.phantom_40584 (192.168.0.99)
 

Edição atual tal como às 15h56min de 10 de julho de 2014

  • Configure o MPICH conforme [Minicluster:MPICH].

Conectando

Conecte-se a alguma máquina do instituto (Ex. hunter,euler,...).

Conecte-se a máquina one:

[dago@hunter]$ ssh dago@one

Verifique quais máquinas nós estão ativas:

[dago@one]$ pingcluster.sh


Verifique os testes da sessão [Minicluster:MPICH], principalmente o último usando mpiboot. Inicie o daemon

Verifique quais nós estão ativos (para nós ativos aparecem o último número do ip e para nós inativos aparece [ . ]):

[dago@one]$ pingcluster.sh
====================
=      MATRIX      =
====================
[108][109][ . ][ . ]
[112][113][ . ][ . ]
[100]  <- switch
[116][117][ . ][ . ]
[120][121][ . ][ . ]
====================

Configurando o mpd.conf

Cada usuário deve ter um arquivo .mpd.conf no seu diretório /home/usuario/ e deve permitir acesso e leitura somente a este usuário.

[usuario@one]$ cd
[usuario@one]$ vi .mpd.conf
MPD_SECRET_WORD=yours3cr3tw0rd
MPD_USE_ROOT_MPD=yes
[usuario@one]$ chmod 600 .mpd.conf

onde

   MPD_SECRET_WORD pode ser única para cada usuário.
   MPD_USE_ROOT_MPD especifica que usuários não irão iniciar se próprio mpd daemons, mas irão usar um já rodando iniciado pelo root.  


Verifique se os nós ativos estão conectados através do mpd formando um anel (os números após o '_' devem mudar):

[dago@one]$ ssh cell108 -T "mpdtrace -l"
cell108_35232 (192.168.0.108)
cell121_55680 (192.168.0.121)
cell120_58236 (192.168.0.120)
cell117_35568 (192.168.0.117)
cell116_42441 (192.168.0.116)
cell113_39465 (192.168.0.113)
cell112_50931 (192.168.0.112)
cell109_45891 (192.168.0.109)

Ok. Nós ativos e conectados através do daemon mpd. Cluster pronto para ser usado em paralelo.

Digitando

Abra um editor de textos (por exemplo o vi ou emacs):

[dago@one]$ vi hellompi.f90

e digite o programa abaixo:

program hellompi
implicit none
include "mpif.h"
integer       ::  np, myid, ier,length
character*80  ::  nome

call MPI_Init( ier )
call MPI_Comm_size( MPI_COMM_WORLD, np,   ier)
call MPI_Comm_rank( MPI_COMM_WORLD, myid, ier)
call MPI_Get_processor_name(nome,length,ier)

print *,"Sou o processo ", myid," de um total de ", np," rodando em ",nome

call MPI_Finalize( ier )
end program

Compilando

  • Conectado a máquina one, compile o programa (não compile conectados aos nós para não sobrecarregá-los):
[dago@one]$ mpif90 hellompi.f90 -o hellompi

Rodando em um processador

Para rodar existem duas opções:

  • Conecte a um nó e inicie o comando mpiexec neste nó:
[dago@one]$ ssh dago@cell108
[dago@cell108]$ mpdtrace -l
cell108_41888 (192.168.0.108)
cell109_42454 (192.168.0.109)

[dago@cell108]$ mpiexec ./hellompi

  • Utilize o comando ssh para rodar o comando mpiexec no nó:
[dago@one]$ ssh cell108 -T "mpiexec ./hellompi"


Rodando no cluster

  • Para rodar em 4 processadores (2 máquinas x 2 processadores)
[dago@cell108]$ mpiexec -l -n 4 ./hellompi
2:  Sou o processo 2  de um total de            4  rodando em cell109
0:  Sou o processo 0  de um total de            4  rodando em cell108
1:  Sou o processo 1  de um total de            4  rodando em cell109
3:  Sou o processo 3  de um total de            4  rodando em cell108

Usando o MPE

  • Para compilar o programa:
 [one]$ mpif90 hellompi.f90 -o hellompi -mpe=mpilog
  • Para rodar o programa:
 [one]$ mpiexec -l -n 4 ./hellompi 
  • Depois de rodar o programa, um arquivo Unknows.clog2 foi criado. Para visualizar a iteração entre os computadores:
 [one]$ jumpshot Unknown.clog2

Problemas:

1) mpdtrace resulta vazio

Caso as máquinas não estejam conectadas através do mpd, o usuário pode formar ele mesmo um anel (Comunique ao Prof.Dagoberto por email para que possa iniciar o serviço). No momento, crie um arquivo ~/.mpd.hosts com os nós ativos (2 máquinas nesse exemplo):

[dago@cell108]$ vi ~/.mpd.hosts        
cell108:2
cell109:2

e inicie um anel

[dago@cell108]$ mpdboot -n 2 -f ~/.mpd.hosts

Verifique se funcionou.

[dago@cell108]$ mpdtrace -l
cell108_41199 (192.168.0.108)
cell109_52092 (192.168.0.109)