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
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]
+
== Digitando ==
 
+
Conecte-se a máquina '''one'''
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.
 
 
 
= 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.
 
 
 
[usuario@one]$ cd
 
[usuario@one]$ vi .mpd.conf
 
MPD_SECRET_WORD=yours3cr3tw0rd
 
MPD_USE_ROOT_MPD=yes
 
 
 
onde
 
*<code>MPD_SECRET_WORD</code> 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.
 
 
 
 
 
== Para o usuário root ==
 
Similar aos usuários, o root precisa ter um arquivo <code>mpd.conf</code> em todos os nós localizado em
 
[root@one]$ cd /etc
 
[root@one]$ vi /etc/mpd.conf
 
MPD_SECRET_WORD=yours3cr3tw0rd
 
e permitir acesso leitura e escrita somente ao root
 
[root@one]$ chmod 600 /etc/mpd.conf
 
 
 
=== Para criar um script para todos os usuários===
 
* 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.
 
 
 
=== Usuários futuros ===
 
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 criados.  Tenha certeza que as flags estejam setadas corretamente. Então rode
 
 
 
chmod 600 /etc/skel/.mpd.conf
 
 
 
para ter certeze que o arquivo tenha permissão de escrita e leitura para o usuário somente.
 
 
 
= Testes =
 
==Configuring Worker Nodes to use Root's MPD Daemon ==
 
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'').
 
 
 
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.
 
 
 
IMPORTANTE: A maioria dos testes deve ser feito tanto na máquina '''one''' quanto na máquina '''cell100'''
 
 
 
== Iniciar um Daemon ==
 
* Conecte-se a máquina  (como root) e inicie mpd (multi-purpose daemon) para rodar em background
 
 
  [  hunter  ]$ ssh usuario@one
 
  [  hunter  ]$ ssh usuario@one
 
  [usuario@one]$ mpd --daemon  
 
  [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
 
  [usuario@one]$ mpdtrace -l
 
  one.matrix_54419 (192.168.0.99)
 
  one.matrix_54419 (192.168.0.99)
  
* Teste também em '''cell100'''
+
== Compilando ==
 
+
== Rodando ==
== 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
 
one.matrix
 
 
[dago@one ~]$ mpiexec -l -n 4 /bin/hostname
 
1: one.matrix
 
2: one.matrix
 
0: one.matrix
 
3: one.matrix
 
 
 
* Testar em '''cell100'''
 
 
 
== Testar o mpdcheck em um anel com dois nós ==
 
* Iniciar em '''one''' o processo mpdcheck (ver [http://lists.mcs.anl.gov/pipermail/mpich-discuss/2006-August/001521.html]):
 
[dago@one ~] $ mpdcheck -s
 
server listening at INADDR_ANY on: one.matrix 60582
 
 
 
No outro nó, cell100
 
[dago@cell100 ~] $ 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
 
 
 
* 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
 
Um programa hellompi em paralelo

Edição das 15h41min de 6 de julho de 2010

  • Configure o MPICH conforme [Minicluster:MPICH].

Digitando

Conecte-se a máquina one

[  hunter   ]$ ssh usuario@one
[usuario@one]$ mpd --daemon 
[usuario@one]$ mpdtrace -l
one.matrix_54419 (192.168.0.99)

Compilando

Rodando

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 ?)

[usuario@cell100]$ mpiexec -np 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 cell100.matrix é o nome da máquina (todas no mesmo nó ainda). Para rodar em mais máquinas, primeiro desligue o mpd

[usuario@one]$ mpdallexit


Testando o anel de máquinas

  • 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

No mestre

dago@um ~ $ mpdboot -n 2
dago@um ~ $ mpdtrace -l
um.phantom_40584 (192.168.0.99)
cell100.matrix_59410 (192.168.0.100)
dago@um ~ $ cd fortran/
dago@um fortran $ mpiexec -l -n 2 ./hellompi
1:  Sou o processo            1  de um total de            2  rodando em  cell100.matrix
0:  Sou o processo            0  de um total de            2  rodando em um.phantom

Em cell100

[dago@cell100 fortran]$ mpdtrace -l
cell100.matrix_59410 (192.168.0.100)
um.phantom_40584 (192.168.0.99)