Minicluster:Compilando MPI
- Configure o MPICH conforme [Minicluster:MPICH].
Índice
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
- Veja sobre visualizadores em http://www.mcs.anl.gov/research/projects/perfvis/software/viewers/index.htm
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)