Como Utilizar
Organização de diretórios
Todo o armazenamento compartilhado do cluster está localizado em /projetos, montado via NFS em todos os nós. Cada projeto de pesquisa possui um diretório próprio, e dentro dele cada membro tem seu subdiretório pessoal:
/projetos/<nome-do-projeto>/<usuario>/
Permissões
- Cada usuário possui permissão de leitura e escrita apenas em seu próprio diretório.
- Todos os membros de um mesmo projeto possuem permissão de leitura nos diretórios dos demais membros do grupo.
- Usuários de projetos diferentes não têm acesso entre si.
Estrutura de diretórios
Embora não seja obrigatória, a seguinte estrutura de diretórios é recomendada para manter os projetos organizados:
/projetos/<projeto>/<usuario>/
├── src/ # Código-fonte dos programas
├── build/ # Executáveis compilados
├── input/ # Arquivos de entrada das simulações
├── output/ # Resultados e saídas dos jobs
├── jobs/ # Scripts de submissão Slurm (.sh)
└── logs/ # Arquivos de log gerados pelo Slurm
Exemplo com dois projetos
Considere os projetos hidro (coordenado por juliana.costa) e astro (coordenado por carlos.almeida), cada um com seus membros:
/projetos/
├── hidro/
│ ├── juliana.costa/
│ │ ├── src/
│ │ ├── input/
│ │ └── output/
│ ├── rafael.mendes/
│ └── camila.torres/
└── astro/
├── carlos.almeida/
│ ├── src/
│ ├── input/
│ └── output/
├── maria.souza/
└── joao.pereira/
rafael.mendes pode ler os arquivos de juliana.costa e camila.torres, mas não tem acesso a nenhum diretório do projeto astro.
Consultando seus projetos
No cluster, o comando meus-projetos lista os projetos aos quais seu usuário está vinculado:
$ meus-projetos
Usuário: rafael.mendes
Projetos:
- hidro → /projetos/hidro/rafael.mendes
Slurm — Submissão de Jobs
O Slurm Workload Manager é responsável por escalonar e executar os jobs no cluster. Todos os programas com consumo significativo de recursos devem ser submetidos via Slurm.
Filas disponíveis
| Fila | Nós | Tempo máximo | Uso recomendado |
|---|---|---|---|
debug |
1 | 30 minutos | Testes rápidos, verificação de compilação |
short |
2 | 4 horas | Execuções curtas e interativas |
long |
2 | 7 dias | Simulações de duração média |
max |
2 | Ilimitado | Simulações longas (uso justificado) |
A fila padrão (quando não especificada) é debug.
Comandos básicos do Slurm
# Submeter um job
sbatch job.sh
# Listar seus jobs na fila
squeue -u $USER
# Cancelar um job
scancel <job_id>
# Ver informações detalhadas sobre um job
scontrol show job <job_id>
# Ver status dos nós
sinfo
Exemplos de Jobs
Exemplo 1 — Job simples (teste)
Script básico para verificar que o ambiente está funcionando:
#!/bin/bash
#SBATCH --job-name=teste
#SBATCH --output=logs/teste_%j.out
#SBATCH --error=logs/teste_%j.err
#SBATCH --partition=debug
#SBATCH --ntasks=1
#SBATCH --time=00:05:00
echo "Hostname: $(hostname)"
echo "Data: $(date)"
echo "Diretório de trabalho: $(pwd)"
sbatch jobs/teste.sh
Exemplo 2 — Job MPI (múltiplos processos em múltiplos nós)
Execução de um programa MPI distribuído entre os dois nós, utilizando 48 processos:
#!/bin/bash
#SBATCH --job-name=simulacao-mpi
#SBATCH --output=logs/mpi_%j.out
#SBATCH --error=logs/mpi_%j.err
#SBATCH --partition=long
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=24
#SBATCH --time=12:00:00
# Carregar módulo MPI
module load openmpi
# Executar o programa com 48 processos (24 por nó)
srun ./build/meu_programa_mpi < input/parametros.dat
sbatch jobs/simulacao_mpi.sh
Exemplo 3 — Job OpenMP (múltiplas threads em um nó)
Utilização de 32 threads OpenMP em um único nó para paralelismo de memória compartilhada:
#!/bin/bash
#SBATCH --job-name=simulacao-omp
#SBATCH --output=logs/omp_%j.out
#SBATCH --error=logs/omp_%j.err
#SBATCH --partition=short
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=32
#SBATCH --time=02:00:00
export OMP_NUM_THREADS=32
./build/meu_programa_openmp
sbatch jobs/simulacao_omp.sh
Exemplo 4 — Job Híbrido MPI + OpenMP
Combinação de MPI entre nós e OpenMP dentro de cada nó — estratégia comum para programas de grande escala:
#!/bin/bash
#SBATCH --job-name=hibrido-mpi-omp
#SBATCH --output=logs/hibrido_%j.out
#SBATCH --error=logs/hibrido_%j.err
#SBATCH --partition=long
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=12
#SBATCH --time=24:00:00
module load openmpi
# 2 nós × 4 processos MPI × 12 threads OpenMP = 96 threads totais
export OMP_NUM_THREADS=12
srun ./build/programa_hibrido
Exemplo 5 — Job PLUTO (simulação astrofísica/MHD)
Execução de uma simulação de magnetohidrodinâmica com o código PLUTO, distribuída entre os dois nós:
#!/bin/bash
#SBATCH --job-name=pluto-mhd
#SBATCH --output=logs/pluto_%j.out
#SBATCH --error=logs/pluto_%j.err
#SBATCH --partition=long
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=16
#SBATCH --time=5-00:00:00
module load openmpi
# Entrar no diretório da simulação (onde estão pluto.ini e o executável)
cd /projetos/astro/joao.pereira/jet_simulation
# Executar o PLUTO com 32 processos MPI
srun ./pluto -x1 4 -x2 4 -x3 2
A flag -x1 4 -x2 4 -x3 2 define a decomposição de domínio: 4 processos na direção X1, 4 em X2 e 2 em X3, totalizando 32 processos.
Após a execução, os arquivos de saída (.dbl, .hdf5 ou .vtk) estarão no mesmo diretório e podem ser abertos com ParaView ou VisIt para visualização.
Exemplo 6 — Array de jobs (varredura de parâmetros)
Útil para executar a mesma simulação com diferentes parâmetros de entrada, como varreduras de resolução ou condições iniciais:
#!/bin/bash
#SBATCH --job-name=sweep
#SBATCH --output=logs/sweep_%A_%a.out
#SBATCH --error=logs/sweep_%A_%a.err
#SBATCH --partition=short
#SBATCH --ntasks=8
#SBATCH --array=1-10
#SBATCH --time=04:00:00
module load openmpi
# Cada tarefa do array usa um arquivo de parâmetros diferente
PARAM_FILE="input/params_${SLURM_ARRAY_TASK_ID}.dat"
srun ./build/simulacao < $PARAM_FILE
sbatch jobs/sweep.sh
# Isso submeterá 10 jobs independentes (array IDs 1 a 10)