Minicluster:Compilando MPI

De WikiLICC
Ir para: navegação, pesquisa
  • 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)