Segue um script básico para o pessoal submeter seus programas no cluster.
#!/bin/sh # #This is an example script example.sh # #These commands set up the Grid Environment for your job: #PBS -N NOME_DO_PROGRAMA #PBS -l nice=16,walltime=36:00:00 #PBS -M SEU_E-MAIL@if.uff.br #PBS -m abe cd $PBS_O_WORKDIR ./caminho/do/seu/executável
O nome de sua tarefa é dada na linha #PBS -N
, mude NOME_DO_PROGRAMA
para o nome de sua escolha. Deve ser especificado um tempo de execução máximo no campo walltime=hh:mm:ss
, para que não existam procesos esquecidos, lembrem-se que o gerenciador matará o processo que exceder esse tempo.
Finalmente no terminal faça:
qsub nomedoscript
E aguarde o término, para verificar o andamento faça qstat
no terminal. Dúvidas perguntem ao Ângelo.
walltime=hh:mm:ss
!
Código exemplo:
#!/bin/sh # #This is an example script example.sh # #These commands set up the Grid Environment for your job: #PBS -N opsw1 #PBS -l nice=16,walltime=36:00:00 #PBS -M seuemail@if.uff.br #PBS -m abe #PBS -d /fiscomp/orahcio/pesquisa/caos_sw/analise #PBS -t 0-5 #Inicio do script case "$PBS_ARRAYID" in 0) echo "L=1e6" date ./opsw 1000000 10 89763287 0.1 -6 0.1 0.49 1 0.001 0.01 5 5000 2500 date ;; 1) date ./opsw 1000000 10 89763287 0.1 -6 0.1 0.49 1 0.3 1 5 5000 2500 date ;; 2) echo "L=1e5" date ./opsw 100000 10 89763287 0.1 -6 0.1 0.49 1 0.001 0.01 5 5000 2500 date ;; 3) date ./opsw 100000 10 89763287 0.1 -6 0.1 0.49 1 0.3 1 5 5000 2500 date ;; 4) echo "L=1e4" date ./opsw 10000 10 89763287 0.1 -6 0.1 0.49 1 0.001 0.01 5 5000 2500 date ;; 5) date ./opsw 10000 10 89763287 0.1 -6 0.1 0.49 1 0.3 1 5 5000 2500 date ;; esac
Cada linha abaixo do comentário Inicio do script
será executada no intervalo de núcleos especificados em #PBS -t 0-5
, diga adeus ao nice 16
pois esse script já faz suas tarefas serem executadas com essa prioridade. O comentário #PBS -d
especifica o diretório de trabalho para cada núcleo adentrar antes de executar o processo.
O uso do case
no bash é interessante se quisermos rodar parâmetros diferentes, devemos usar a variável de ambiente PBS_ARRAYID
para usarmos os comandos a serem executados de acordo com o núcleo escolhido pelo gerenciador, os valores dela variam segundo o array que que definimos em #PBS -t
.
Segue um script mais eficaz, que demorou um mês mais ou menos pra a coisa toda funcionar, nesse script usa-se a opção -t
porém cria-se um array adicional no script bash para mudar o parâmetro conforme o ID do núcleo que irá rodar o programa.
#!/bin/bash # #This is an example script example.sh # #These commands set up the Grid Environment for your job: #PBS -N L1e4_p #PBS -l nice=16,walltime=36:00:00 #PBS -M seuemail@if.uff.br #PBS -m abe #PBS -t 0-29 # Gerando sementes (só se você quiser gerar sementes) a=$RANDOM if [ $(($a%2)) -eq 0 ] then a=$(($a+1)) fi # Fim do gerador de sementes #p=( 0 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 ) p=( 0.5166667 0.5333333 0.5500000 0.5666667 0.5833333 0.6000000 0.6166667 0.6333333 0.6500000 0.6666667 0.6833333 0.7000000 0.7166667 0.7333333 0.7500000 0.7666667 0.7833333 0.8000000 0.8166667 0.8333333 0.8500000 0.8666667 0.8833333 0.9000000 0.9166667 0.9333333 0.9500000 0.9666667 0.9833333 1.0000000 ) cd $PBS_O_WORKDIR ./opsw 10000 10 ${p[$PBS_ARRAYID]} $a 0.1 -6 0.1 0.49 100 5000 2500
Veja que o parâmetro que estou variando pertence ao vetor p
, cada núcleo executará o mesmo script porém vai assumir o parâmetro de posição ditada pela variável de ambiente $PBS_ARRAYID
.
Fica um gerador de números aleatórios, ímpares, escrito em bash. Claro que uso a variável de ambiente $RANDOM
para isso.
bash
e não sh
como nos demais exemplos, alguma sintaxe desse script não funciona num terminal sh
.
Uma forma mais limpa de fazer o script acima é usar:
#!/bin/bash # #This is an example script example.sh # #These commands set up the Grid Environment for your job: #PBS -N trinta_ps_com_1e4_sitios #PBS -l nice=16,walltime=36:00:00 #PBS -M orahcio@gmail.com #PBS -m abe #PBS -t 0-25 # Gerando sementes a=$RANDOM if [ $(($a%2)) -eq 0 ] then a=$(($a+1)) fi p=$(echo "scale=10; $PBS_ARRAYID*1/25" | bc) cd $PBS_O_WORKDIR ./opsw 100000 10 $p $a 0.1 -6 0.1 0.49 100 5000 2500
Dessa forma cada núcleo terá 25 pontos do seu valor de parâmetro no intervalo [0,1].
Um script para Open MPI seria
#!/bin/sh #PBS -N Nome_do_Programa #PBS -M SEU_E-EMAIL@if.uff.br #PBS -m bae #PBS -l nice=16,nodes=5:ppn=4,walltime=168:00:00 export NPROCS=`wc -l $PBS_NODEFILE |gawk '//{print $1}'` mpirun -machinefile $PBS_NODEFILE -np $NPROCS /CAMINHO/DO/SEU_PROG_MPI
Use o comando qstat
para ver um resumo dos processos que estão sendo executados e qstat -nt
para ver detalhadamente em quais máquinas cada tarefa está rodando. A saída é algo do tipo:
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time -------------------- -------- -------- ---------------- ------ ----- --- ------ ----- - ----- 273[0].merlot.if orahcio batch opsw-0 23786 1 1 -- 36:00 R 00:15 pinot/1 273[1].merlot.if orahcio batch opsw-1 23786 1 1 -- 36:00 R 00:15 pinot/2 273[2].merlot.if orahcio batch opsw-2 23786 1 1 -- 36:00 R 00:15 cabernet/1
Use o comando qdel #_do_processo
, por exemplo 273[0] se eu for matar o processo que roda na pinot no tópico acima, se quiser matar todo mundo é só dizer qdel 273[]
.