Guia rápido de submissão
************************
A submissão de *jobs* pode ser realizado por dois comandos do gerenciador do cluster: ``srun`` e ``sbatch``. O comando ``srun`` executa na linha de comando e é bloqueante, equanto o comando ``sbatch`` executa um arquivo de configuração e não é bloqueante.

.. contents:: :depth: 4

Principais parametros de submissão:
===================================
    * ``-p|--partition nome`` Especifica o nome da partição que o *job* será executado.
    * ``-t|--time tempo`` Especifica um tempo limite para a execução do job. Caso o tempo limite especificado seja maior que o tempo da partição, o job ficará com o estado pendente (PENDING), possivelmente para sempre. Formatos de tempo aceitos: “minutos”, “minutos:segundos”, “horas:minutos:segundos”, “dias-horas”, “dias-horas:minutos” e “dias-horas:minutos:segundos”.
    * ``-c|--cpus-per-task`` Especifica a quantidade de core/threads o seu programa vai utilizar.
    * ``--mem tamano unidade`` Especifica quantidade de memória seu programa vai utilizar.
    * ``-n NUM_PROCESSOS``  Especifica o número de processos a serem iniciados.
    * ``-N NUM_NODOS`` Especifica que deverão ser alocados pelo menos NUM_NODOS nodos para a execução do job, ou seja, cada nodo vai executar NUM_PROCESSOS dividido por NUM_NODOS.
    * ``–job-name=NOME`` Especifica o nome do Job que será executado. Este nome irá aparecer juntamente com o id do job na listagem de jobs do sistema.
    * ``-e`` Especifica o redirecionamento do stderr. Exemplo:
    ``-e arquivoErros.txt``

    * ``-o``  Especifica o redirecionamento do stdout. Caso -e não tenha sido especificado, stderr também será enviado para o arquivo especificado. Exemplo:
    ``-o arquivoSaida.txt`` ou ``--output arquivoSaida.txt``
Comando *srun* 
==============
| O comando ``srun`` submete um *job* para o escalanodador, por padrão esse comando é bloqueante. A sintaxe do comando é:
| ``srun executavel``

Exemplo: Execução simples do *srun*
-----------------------------------
O exemplo submete o programa ``/cluster/tests/omp/omp`` para fila de execução do cluster e será executado quando tiver recursos disponíveis.

.. code-block:: console	

    testem@c3hpc:~$ srun /cluster/tests/omp/omp
    Missing arguments
    Usage: /cluster/tests/omp/omp [-n|--nprocs] <cpus> [-t|--time] <time>
    Examples:
      Example 1: short options: To Execute program with 4 threads during 10 seconds:
            /cluster/tests/omp/omp -n 4 -t 10
      Example 2: long options: To Execute program with 8 threads during 15 seconds:
            /cluster/tests/omp/omp --nprocs 8 --time 15
    srun: error: node4: task 0: Exited with exit code 2
    testem@c3hpc:~$ srun /cluster/tests/omp/omp --nprocs 4 -t 4
    Time 4 Nproc 4
    count: 258531857
    count: 260249707
    count: 262771821
    count: 262113384
    testem@c3hpc:~$

| Para especificar a quantidade de recurso que o *job* vai utilizar passe como argumentos antes do programa.
| ``srun <argumentos do srun> executavel`` 



Exemplo: Execução com argumentos *srun*
---------------------------------------
No exemplo abaixo, o executável é um programa em *openMP* que lança 4 threads, mas o srun só disponibiliza duas threads para ser executado. Portanto para que as quatros threads tenham aceso a 4 nucleo de processamento é necessário passar o argumento ``--cpus-per-task 4``.

.. code-block::

    testem@c3hpc:~$ srun --cpus-per-task 2 --mem 16G --partition maratona /cluster/tests/omp/omp --nprocs 4 -t 60
    Time 60 Nproc 4
    count: 430357224
    count: -63444304
    count: -21866144
    count: -33171848
    testem@c3hpc:~$


Comando *sbatch* 
================
| O comando *sbatch* recebe como argumento um arquivo com as especificações do *jobs* que será executado. Sbatch é Uma opção mais comum é a utilização de um script, que contém as informações sobre o jobs que serão executados. No script, as opções de execução podem ser definidas utilizando-se o prefixo ``#SBATCH`` antes da opção.
| ``#SBATCH --time=1``

Abaixo, um exemplo de script que roda a aplicação “meuPrograma” que está dentro do diretório bin. A aplicação irá executar por no máximo 7 dias e é solicitado 1 nodo para a execução.

.. code-block:: bash
   #!/bin/sh
    #SBATCH -p 7d
    #SBATCH -t 7-00:00:00
    #SBATCH -n 1
    srun $HOME/meuPrograma

| Para submeter o script, salve-o como meuscript.sh, e execute-o utilizando o comando sbatch. Muitos dos parâmetros do comando srun também são válidos para o sbatch. Os parâmetros passados ao sbatch irão sobrescrever os parâmetros existentes dentro do script sendo executado. Exemplo do comando:
| ``sbatch -o saida.txt meuscript.sh``



Modelo de arquivo *sbatch*
---------------------------
.. code-block:: bash

 #!/bin/bash
 #SBATCH -t 1-10:00:00
 #SBATCH --cpus-per-task=NUM_CPUS_POR_PROCESSO
 #SBATCH -o ARQUIVO_DE_SAIDA
 #SBATCH --job-name=NOME_JOB
 #SBATCH -p PARTICAO_ONDE_SERA_EXECUTADO
 #SBATCH -n NUM_DE_PROCESSOS
 #SBATCH -N NUM_NODOS_NECESSARIOS
 srun $HOME/meuPrograma parametro1Programa parametro2Programa

| É possível sobrescrever os valores que estão no scripts pela linha de comando. Exemplo:
| ``sbatch -o saida.txt -t 5-00:00:00 meuscript.sh``
| Note que o comando acima sobrescreve o parâmetro -t que já está presente no meuscript.sh. Isso fará com que o parâmetro no meuscript.sh seja ignorado, sendo assim, ao executar a linha acima, o tempo limite para a execução será de 5 dias. No entanto, recomenda-se que todos os parâmetros estejam dentro do script e que estes não sejam sobrecarregados pelo sbatch para facilitar a localização de erros e múltiplas execuções de um mesmo script.

Cancelando *jobs*
=================
| Para cancelar um job que está rodando ou que está na fila para execução, utilize o comando scancel. Modo de uso:
| ``scancel jobId``

.. note::
    O **jobid** pode ser obitido através do comando **squeue**