O Cluster é formado por 25 máquinas (nós de execução) diskless, cada uma com a seguinte especificação:
O cluster conta com 1 login node com capacidade bruta de armazenamento de 5TB
O objetivo dos módulos é carregar as variáveis de ambiente e a inclusão no path dos programas de forma modular. Para uma lista completa dos módulos disponíveis execute:
module avail
module load mpt/2.06
module unload mpt/2.06
module list
Para carregar um módulo automaticamente ao se logar inclua no arquivo de inicialização do shell:
o comando:
module load MODULO
Todas as variáveis de ambientes (PATH, LD_LIBRARY_PATH etc) necessárias para a execução do job (aplicação, MPI etc) devem ser configuradas antes da submissão do job.
OBS.: Caso o modulo não seja executado através do arquivo de inicialização do shell, este deve ser executado antes da submissão de jobs para o Torque.
As opções de implementações MPI disponíveis são o SGI MPT e o OpenMPI 1.6.3. Para colocar os executávies (mpicc, mpif77, etc) no path, execute o comando abaixo.
module load mpt/2.06
ou
module load openmpi/1.6.3
Compilar:
mpicc -o myprog myprog.c
ou
mpif90 -o myprog myprog.f
Compilar programas híbridos (MPI-MultiThreaded):
mpicc -fopenmp -o myprog myprog.c
mpicc -lmpi_mt -fopenmp -o myprog myprog.c
Maiores informações:
Compilador disponível: GNU v4.3
O gerenciador de filas utilizado é o Torque integrado com o escalonador de jobs Maui. Todos os jobs devem ser submetidos através dele.
As filas de execução são:
1 slot = 1 core |
Basicamente há duas formas de solicitar processadores no Torque
Nesse caso, o Toque irá alocar os primeiros X processadores disponíveis que encontrar, podendo utilizar mais do que um nó.
Exemplo:
qsub -l nodes=37 script.pbs
Irá alocar os 37 primeiros processadores disponíveis através de 4 ou mais nós.
Nesse caso, o Toque irá alocar Y processadores em X nós computacionais diferentes, alocando um total de X*Y processadores.
Exemplo:
qsub -l nodes=3:ppn=8 script.pbs
Irá alocar 8 processadores em 3 nós, alocando um total de 24 processadores. Essa opção permite uma distribuição melhor dos processos através dos nós, mas o job ficará esperando na fila até que os recursos necessários fiquem disponíveis.
* O valor de Y (ppn) precisa ser obrigatoriamente maior ou igual a 2 (vide explicação abaixo).
No caso da alocação de apenas 1 processador em 2 ou mais nós computacionais diferentes, devido a um problema de compatibilidade entre o gerenciador de recursos Torque com o escalonador de jobs Maui, é necessário requisitar os recursos da seguinte forma.
Exemplo:
qsub -l nodes=1+1+1+1:ppn=1 script.pbs
Irá alocar 1 processador em 4 nós computacionais, alocando um total de 4 processadores.
* Nesse caso, se a submissão fosse configurada com -l nodes=4:ppn=1, seriam alocados os 4 primeiros processadores disponíveis, provavelmente em um mesmo nó computacional.
No script de submissão, a forma de alocação é escolhida através do parâmetro:
#PBS -l nodes=X |
ou
#PBS -l nodes=X:ppn=Y |
ou
#PBS -l nodes=1+1+...:ppn=1 |
* ppn = Processor Per Node
* Lembrando que o número máximo de processos por cada nó é 11
Nos scripts (jobs em batch) os parâmetros do Torque devem ser precedidos por #PBS como será visto mais adiante.
Os scripts não precisam ser executáveis.
Script Geral
#PBS -S /bin/bash #PBS -N NOME_DO_JOB #PBS -q nome_da_fila #PBS -V cd $PBS_O_WORKDIR ./programa parametros_do_programaExemplo:
#PBS -S /bin/bash #PBS -N JOB_SERIAL #PBS -q fila #PBS -V cd $PBS_O_WORKDIR /hpc/NPB3.2.1/SER/bin/cg.C
qsub rodar.sh
Exemplo 1 - Dinâmico:
Script Geral - Utilizando o MPT
#PBS -S /bin/bash #PBS -N NOME_DO_JOB #PBS -q nome_da_fila #PBS -l nodes=NUMERO_DE_PROCESSADORES #PBS -V cd $PBS_O_WORKDIR mpiexec_mpt -n NUMERO_DE_PROCESSADORES programa parametros_do_programaScript rodarmpi.sh
#PBS -S /bin/bash #PBS -N JOB_EXEMPLO1_DINAMICO #PBS -q fila #PBS -l nodes=16 #PBS -V cd $PBS_O_WORKDIR mpiexec_mpt -n 16 /hpc/NPB3.2.1/MPI/bin/cg.C.16
module load mpt/2.06-----
qsub rodarmpi.sh
Script Geral - Utilizando o OpenMPI
#PBS -S /bin/bash #PBS -N NOME_DO_JOB #PBS -q nome_da_fila #PBS -l nodes=NUMERO_DE_PROCESSADORES #PBS -V cd $PBS_O_WORKDIR mpiexec programa parametros_do_programa
*Atenção: Ao utilizar o OpenMPI, não é necessário configurar o parâmetro "-n" do "mpiexec". Ele já obtem esse parâmetro diretamente da configuração do Torque.
Script rodarmpi_openmpi.sh#PBS -S /bin/bash #PBS -N JOB_EXEMPLO1_DINAMICO #PBS -q fila #PBS -l nodes=16 #PBS -V cd $PBS_O_WORKDIR mpiexec /hpc/NPB3.2.1/MPI/bin/cg.C.16_openmpi
module load openmpi/1.6.3
qsub rodarmpi_openmpi.sh
Exemplo 2 - Fixado - Utilizando MPT:
Script Geral
#PBS -S /bin/bash #PBS -N NOME_DO_JOB #PBS -q nome_da_fila #PBS -l nodes=NUMERO_DE_NOS:ppn=NUMERO_DE_PROCESSADORES_POR_NO #PBS -V cd $PBS_O_WORKDIR mpiexec_mpt -n NUMERO_DE_NOS * NUMERO_DE_PROCESSADORES_POR_NO programa parametros_do_programaScript rodarmpi2.sh
#PBS -S /bin/bash #PBS -N JOB_EXEMPLO2_FIXADO #PBS -q fila #PBS -l nodes=4:ppn=4 #PBS -V cd $PBS_O_WORKDIR mpiexec_mpt -n 16 /hpc/NPB3.2.1/MPI/bin/cg.C.16
module load mpt/2.06
qsub rodarmpi2.sh
Atenção:
- Nesse caso, o valor da flag -n deve ser o produto do valor de nodes pelo ppn (4*4)
Exemplo 3 - Fixado - Utilizando OpenMPI:
Script Geral
#PBS -S /bin/bash #PBS -N NOME_DO_JOB #PBS -q nome_da_fila #PBS -l nodes=NUMERO_DE_NOS:ppn=1 #PBS -V cd $PBS_O_WORKDIR mpiexec programa parametros_do_programaScript rodarmpi3.sh
#PBS -S /bin/bash #PBS -N JOB_EXEMPLO3_FIXADO #PBS -q fila #PBS -l nodes=1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1:ppn=1 #PBS -V cd $PBS_O_WORKDIR mpiexec /hpc/NPB3.2.1/MPI/bin/cg.C.16_openmpi
module load openmpi/1.6.3
qsub rodarmpi3.sh
Atenção:
- Nesse caso, irá submeter 1 processo MPI (utilizando 1 processador) para 16 nós computacionais diferentes.
Script Geral
#PBS -S /bin/bash #PBS -N NOME_DO_JOB #PBS -q nome_da_fila #PBS -l nodes=NUMERO_DE_NOS:ppn=NUMERO_DE_PROCESSOS_POR_NO #PBS -V cd $PBS_O_WORKDIR export OMP_NUM_THREADS=NUMERO_DE_PROCESSOS_POR_NO mpimtexec_mpt -n NUMERO_DE_NOS omplace -nt NUMERO_DE_PROCESSOS programa parametros_do_programa
Exemplo 1:
Número de threads que cada mpi abrirá = 4
Número de máquinas = 8
Número total de processadores = 4 * 8 = 32
Script rodarmpi.sh
#PBS -S /bin/bash #PBS -N MULTITHREADED #PBS -l nodes=8:ppn=4 #PBS -V cd $PBS_O_WORKDIR export OMP_NUM_THREADS=4 mpimtexec_mpt -n 8 omplace -nt 4 programa
module load mpt/2.06
qsub rodarmpi.sh
Exemplo 2:
Número de threads que cada mpi abrirá = 2
Número de máquinas = 20
Número total de processadores = 2 * 20 = 40
#PBS -S /bin/bash #PBS -N MULTITHREADED #PBS -l nodes=20:ppn=2 #PBS -V cd $PBS_O_WORKDIR export OMP_NUM_THREADS=2 mpimtexec_mpt -n 20 omplace -nt 2 programa
module load mpt/2.06
qsub rodarmpi.sh
* Restrito a somente 1 nó computacional.
** O número máximo de threads é 10, que é o número máximo de processadores disponíveis em cada nó no Torque. Esse valor é configurado através da flag ncpus
Script Geral
#PBS -S /bin/bash #PBS -N NOME_JOB #PBS -q fila #PBS -l ncpus=NUMERO_DE_THREADS #PBS -V cd $PBS_O_WORKDIR #No caso de jobs OpenMP, configurar a variavel abaixo export OMP_NUM_THREADS=NUMERO_DE_THREADS ./programa.exe parametros_do_programa
Exemplo:
Script openmp.sh#PBS -S /bin/bash #PBS -N JOB_OPENMP #PBS -q fila #PBS -l ncpus=7 #PBS -V cd $PBS_O_WORKDIR export OMP_NUM_THREADS=7 /hpc/NPB3.2.1/OMP/bin/sp.C
qsub openmp.sh
Comando: qstat [parametros]
Comando: qhost [parametros]
Comando: qdel [parametros]
Para compilar programas que irão chamar diretamente as bibliotecas do MPI é preciso incluir algumas bibliotecas Infiniband que se encontram no diretório /usr/lib64:
Exemplo:
gcc ... -lmpi -losmcomp -lrdmacm -libverbs ....
O mais indicado é utilizar os "wrappers" mpicc/mpif90 sempre que possível quando for compilar/linkar algum programa, pois eles já utilizam os includes e bibliotecas necessárias.
Para maiores detalhes consulte os manuais dos comandos:
LNCC © Equipe de Suporte Técnico