O Cluster é formado por 72 máquinas (nós de execução), cada uma com a seguinte especificação:
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:
ls /hpc/modulos/bash ls /hpc/modulos/csh
source /hpc/modulos/bash/modulo_desejado ou . /hpc/modulos/bash/modulo_desejado
Indiponível no momento
Para carregar um módulo automaticamente ao se logar inclua no arquivo de inicialização do shell:
o comando:
source /hpc/modulos/bash/modulo_desejado ou . /hpc/modulos/bash/modulo_desejado
Exemplo
source /hpc/modulos/bash/mvapich2-2.2-gcc53.sh
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.
Os compiladores disponíveis
*As variáveis de ambiente dos compiladores já são carregadas automaticamente, durante o login.
Implementações MPI disponíveis
As opções de são mvapich2 v2.2 e OpenMPI v1.10. Para colocar os executávies (mpicc, mpif77, etc) no path execute um dos comandos abaixo.
MPI utilizando compiladores GNU
* Essa versão do MVAPICH2 compilada com o GCC 5.3 emite o seguinte aviso durante a execução do job:
WARNING: Error in initializing MVAPICH2 ptmalloc library.Continuing without InfiniBand registration cache support.
Apesar disso, a execução do job transcorre normalmente, porém, podendo haver uma pequena queda no desempenho. Isso não ocorre com a versão compilada com o GCC 4.8 e nem com o OpenMPI
MPI utilizando compiladores Intel
O gerenciador de filas utilizado é o Torque. Todos os jobs devem ser submetidos através do Torque.
As filas de execução do Torque são:
1 slot = 1 core = 1 processador |
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.
Por padrão o Torque aloca 2GB de memória para cada processo. Caso seja necessário uma quantidade maior de memória por processo, basta utilizar o parâmetro -l pvmem=xG, onde 'x' é a quantidade de memória a ser alocada por processo. Importante observar o limite da quantidade de memória de cada nó.
Por padrão, o Torque configura o tempo de execução dos jobs em 1 semana (168 horas). Caso seja necessário modificar esse valor, basta utilizar o parâmetro -l walltime=HH:MM:SS. Importante observar o limite de tempo de 2 semanas (336 horas).
Script Geral
#PBS -S /bin/bash #PBS -N NOME-DO-JOB #PBS -q nome_da_fila cd $PBS_O_WORKDIR ./programa parametros_do_programaExemplo:
#PBS -S /bin/bash #PBS -N FLOPS #PBS -q linux.q cd $PBS_O_WORKDIR ./flops
qsub rodar.sh
Script Geral
#PBS -S /bin/bash #PBS -N JOB-MATLAB #PBS -q nome_da_fila cd $PBS_O_WORKDIR matlab -nodisplay -singleCompThread -r scriptmatlab ou matlab -nodisplay -singleCompThread < scriptmatlab.qualquer_extensaoAo utilizar o parâmetro do matlab -r, o arquivo que contém os comandos do matlab scriptmatlab deve ter a extensão .m porém deve ser chamado sem a extensão .m no script de submissão.
Exemplo 1:
Arquivo que contém comandos do matlab → scriptmatlab.m
Script rodar.sh
#PBS -S /bin/bash #PBS -N JOB-MATLAB #PBS -q linux.q cd $PBS_O_WORKDIR matlab -singleCompThread -nodisplay -r scriptmatlab
qsub rodar.sh
Exemplo 2:
Arquivo que contém comandos do matlab → scriptmatlab.exe
Script rodar.sh
#PBS -S /bin/bash #PBS -N JOB-MATLAB #PBS -q linux.q cd $PBS_O_WORKDIR matlab -nodisplay -singleCompThread < scriptmatlab.exe
qsub rodar.sh
Script Geral
#PBS -S /bin/bash #PBS -N JOB-SCILAB #PBS -q nome_da_fila cd $PBS_O_WORKDIR source /hpc/modulos/bash/scilab-5.5.2.sh scilab-cli < script_scilab ou scilab-cli << EOF [codigo] [codigo] ... exit EOF
Exemplo 1:
Arquivo que contém comandos do scilab → scriptscilab
Script rodar.sh
#PBS -S /bin/bash #PBS -N JOB-SCILAB #PBS -q linux.q cd $PBS_O_WORKDIR source /hpc/modulos/bash/scilab-5.5.2.sh scilab-cli < scriptscilab
qsub rodar.sh
Exemplo 2:
Script rodar.sh
#PBS -S /bin/bash #PBS -N JOB-SCILAB #PBS -q linux.q cd $PBS_O_WORKDIR source /hpc/modulos/bash/scilab-5.5.2.sh scilab-cli << EOF a = 10 b = 20 c = 30 d = sqrt((a + b + c)/%pi) exit EOF
qsub rodar.sh
Script Geral
#PBS -S /bin/bash #PBS -N NOME-DO-JOB #PBS -q nome_da_fila #PBS -l nodes=N:ppn=P cd $PBS_O_WORKDIR # MVAPICH2-2.1 GCC 4.8 source /hpc/modulos/bash/mvapich2-2.1-gcc48.sh export MV2_CPU_BINDING_POLICY=bunch mpiexec.hydra programa parametros_do_programa # ou # MVAPICH2-2.1 GCC 5.3 source /hpc/modulos/bash/mvapich2-2.1-gcc53.sh export MV2_CPU_BINDING_POLICY=bunch mpiexec.hydra programa parametros_do_programa # ou # OPENMPI 1.10 + GCC 5.3 source /hpc/modulos/bash/openmpi-1.10-gcc53.sh mpiexec -np ${PBS_NP} -hostfile ${PBS_NODEFILE} programa parametros_do_programa
* Onde:
N = Número de nós
P = Número de processos por nó
${PBS_NP} = Variável de ambiente gerada pelo Torque contendo o número total de slots (cores) solicitados para o job
Exemplo 1:
Script rodarmpi.sh#PBS -S /bin/bash #PBS -N JOB_MPI #PBS -q linux.q #PBS -l nodes=2:ppn=8 cd $PBS_O_WORKDIR #MVAPICH2 source /hpc/modulos/bash/mvapich2-2.1-gcc53.sh export MV2_CPU_BINDING_POLICY=bunch mpiexec.hydra /hpc/NPB3.3.1-MZ/NPB3.3-MZ-MPI/bin/sp-mz.C.16
qsub rodarmpi.sh
Exemplo 2: Requisitando uma quantidade maior de memória por processo e alterando o limite de tempo
#PBS -S /bin/bash #PBS -N JOB_MPI #PBS -q linux.q #PBS -l nodes=2:ppn=4,walltime=00:30:00,pvmem=3gb cd $PBS_O_WORKDIR # OPENMPI source /hpc/modulos/bash/openmpi-1.10-gcc53.sh mpiexec -np ${PBS_NP} -hostfile ${PBS_NODEFILE} /hpc/NPB3.3.1-MZ/NPB3.3-MZ-MPI/bin/sp-mz.C.8
qsub rodarmpi.sh
* Nesse caso será alocado um total de 24G de memória para o job
Script Geral
#PBS -S /bin/bash #PBS -N NOME-DO-JOB #PBS -q nome_da_fila #PBS -l nodes=N:ppn=P,other=mpi+thread cd $PBS_O_WORKDIR export OMP_NUM_THREADS=${PBS_NUM_PPN} # MVAPICH source /hpc/modulos/bash/mvapich2-2.1-gcc53.sh #ou source /hpc/modulos/bash/mvapich2-2.1-gcc48.sh export MV2_CPU_BINDING_POLICY=bunch export MV2_ENABLE_AFFINITY=0 mpiexec.hydra programa parametros_do_programa #====== # OPENMPI source /hpc/modulos/bash/openmpi-1.10-gcc53.sh mpiexec -np ${PBS_NUM_NODES} -hostfile ${PBS_NODEFILE} programa parametros_do_programa
* Onde:
${PBS_NUM_PPN} = Variável de ambiente gerada pelo Torque contendo o número de processadores (cores) por nó alocado para o job.
${PBS_NUM_NODES} = Variável de ambiente gerada pelo Torque contendo o número nós alocados para o job
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 JOB-MPI+THREAD #PBS -q linux.q #PBS -l nodes=8:ppn=4,other=mpi+thread cd $PBS_O_WORKDIR export OMP_NUM_THREADS=${PBS_NUM_PPN} # MVAPICH source /hpc/modulos/bash/mvapich2-2.1-gcc48.sh export MV2_CPU_BINDING_POLICY=bunch export MV2_ENABLE_AFFINITY=0 mpiexec.hydra /hpc/NPB3.3.1-MZ/NPB3.3-MZ-MPI/bin/sp-mz.D.32
qsub rodarmpi.sh
Exemplo 2:
Número de threads que cada mpi abrirá = 2
Número de máquinas = 32
Número total de processadores = 2 * 32 = 64
#PBS -S /bin/bash #PBS -N JOB-MPI+THREAD #PBS -q linux.q #PBS -l nodes=32:ppn=2,other=mpi+thread cd $PBS_O_WORKDIR export OMP_NUM_THREADS=${PBS_NUM_PPN} # OPENMPI source /hpc/modulos/bash/openmpi-1.10-gcc53.sh mpiexec -np ${PBS_NUM_NODES} -hostfile ${PBS_NODEFILE} /hpc/NPB3.3.1-MZ/NPB3.3-MZ-MPI/bin/sp-mz.D.64
qsub rodarmpi.sh
O número de nós (nodes=) deve sempre ser 1
O número máximo de threads (ppn=) é 8
Script Geral
#PBS -S /bin/bash #PBS -N NOME-DO-JOB #PBS -q nome_da_fila #PBS -l nodes=1:ppn=P cd $PBS_O_WORKDIR export OMP_NUM_THREADS=${PBS_NUM_PPN} ./programa.exe parametros_do_programa
Exemplo
Script rodarthread.sh#PBS -S /bin/bash #PBS -N JOB_THREADS #PBS -q linux.q #PBS -l nodes=1:ppn=6 cd $PBS_O_WORKDIR export OMP_NUM_THREADS=${PBS_NUM_PPN} /hpc/NPB3.3.1-MZ/NPB3.3-MZ-OMP/bin/bt-mz.C.x
qsub rodarthread.sh
Por padrão o Matlab irá abrir 8 threads para a execução de tarefas sem que seja necessária nenhuma alteração no código do usuário. Este tipo de paralelismo é utilizado para acelerar os cálculos em algumas funções como sin e log, e cálculos que utilizam a biblioteca Basic Linear Algebra Subroutines (BLAS), como por exemplo multiplicação de matrizes.
Para utilizar 8 threads nada precisará ser alterado no código. Para utilizar um número menor de threads é obrigatório que o primeiro comando do código seja:
maxNumCompThreads(N)
onde N e o número de threads desejadas (de 2 a 7)
Script Geral
#PBS -S /bin/bash #PBS -N NOME-DO-JOB #PBS -q nome_da_fila #PBS -l nodes=1:ppn=N matlab -nodisplay -r scriptmatlab ou matlab -nodisplay < scriptmatlab.qualquer_extensao
Ao utilizar o parâmetro do matlab -r, o arquivo que contém os comandos do matlab scriptmatlab deve ter a extensão .m porém deve ser chamado sem a extensão .m no script de submissão.
Exemplo 1:
Arquivo que contém comandos do matlab → scriptmatlab.m
Script rodar.sh
#PBS -S /bin/bash #PBS -N JOB_MATLAB #PBS -q linux.q #PBS -l nodes=1:ppn=8 matlab -nodisplay -r scriptmatlab
qsub rodar.sh
Exemplo 2:
Arquivo que contém comandos do matlab → scriptmatlab.exe
Primeiro comando do scriptmatlab.exe → maxNumCompThreads(4)
Script rodar.sh
#PBS -S /bin/bash #PBS -N JOB_MATLAB #PBS -q linux.q #PBS -l nodes=1:ppn=4 matlab -nodisplay < scriptmatlab.exe
qsub rodar.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:
Para maiores detalhes consulte os manuais dos comandos:
LNCC © Equipe de Suporte Técnico