Laboratorio Nacional de Computacao Cientifica

Cluster Sunhpc

1. Características do cluster

O Cluster é formado por 72 máquinas (nós de execução), cada uma com a seguinte especificação:

Sun Blade X6250

voltar

2. Informações sobre acesso e submissão

  1. O Sistema Operacional do cluster é o CentOS 7
  2. O acesso ao cluster deve ser feito através do host sun.hpc.lncc.br
  3. A submissão dos jobs deve ser feita através do gerenciador de filas Torque
  4. O número máximo de processadores por usuário é 128
  5. O número máximo de jobs por usuário é 128, sendo 64 em execução
  6. O tempo máximo de execução de um job é de duas semanas (336 horas)
  7. O filesystem dos usuários não tem backup

voltar

3. Módulos de Ambiente

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

Comandos

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.

voltar

4. Compiladores e Selecionar o MPI

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

  • MVAPICH2-2.1 + 4.8: source /hpc/modulos/bash/mvapich2-2.1-gcc48.sh
  • *MVAPICH2-2.1 + 5.3: source /hpc/modulos/bash/mvapich2-2.1-gcc53.sh
  • OpenMPI 1.10 + 5.3: source /hpc/modulos/bash/openmpi-1.10-gcc53.sh

* 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

  • MVAPICH2-2.1: source /hpc/modulos/bash/mvapich2-2.1-intel-psxe13.sh
  • OpenMPI 1.10: source /hpc/modulos/bash/openmpi-1.10-intel-psxe13.sh

voltar

5. Gerenciador de filas

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:

  • linux.q
    • 384 slots
    • Jobs seriais e paralelos
1 slot = 1 core = 1 processador

voltar

6. Submeter Jobs

  1. Criar um script de sumissão
  2. Submeter o script com o comando qsub
  3. Verificar os arquivos de saída
  • 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).

voltar

6.1. Jobs seriais

Script Geral

#PBS -S  /bin/bash
#PBS -N NOME-DO-JOB
#PBS -q  nome_da_fila

cd $PBS_O_WORKDIR

./programa  parametros_do_programa
Exemplo:

Script rodar.sh
#PBS -S  /bin/bash
#PBS -N FLOPS
#PBS -q  linux.q

cd $PBS_O_WORKDIR

./flops
qsub rodar.sh

voltar

6.2. Jobs seriais (matlab)

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_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

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

voltar

6.3. Jobs seriais (scilab)

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

voltar

6.4. Jobs paralelos (MPI)

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

voltar

6.5. Jobs paralelos (MPI-multithreaded)

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

voltar

6.6. Jobs paralelos (threads/OpenMP)

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

voltar

6.7. Jobs paralelos implícitos (matlab)

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

voltar

7. Verificar status dos jobs

Comando: qstat [parametros]

Comando: qhost [parametros]

  1. qstat
  2. qstat -f: exibe informação completa sobre o job
  3. qstat -t: exibe exibe informações detalhadas sobre os jobs na fila
  4. checkjob JOBID: exibe informações sobre o job (estado, recursos solicitados, utilização, entre outros)
  5. diagnose -j JOBID: exibe informações sobre o job (estado, recursos solicitados, utilização, entre outros)
  6. qstat -q/-Q: exibe informações sobre as filas
  7. showq : exibe informações sobre as filas
  8. checknode HOSTNAME: exibe informações sobre o nó

voltar

8. Remover jobs da fila ou em execução

Comando: qdel [parametros]

  1. qdel 145 (remove o jobid 145 da fila ou em execução)
  2. qdel 178 179 180 (remove os jobid 178 179 180 da fila ou em execução)
  3. qdel ALL (remove todos os jobs da fila ou em execução)

voltar

9. Utilizando bibliotecas MPI (sem utilizar os scripts mpicc e mpif90)

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:

  • libibverbs
  • libibumad
  • outras

voltar

10. Comentários Finais

Para maiores detalhes consulte os manuais dos comandos:

  • man qsub
  • man qstat
  • man qdel

voltar

LNCC © Equipe de Suporte Técnico