==== Submetendo trabalhos no cluster complex ====
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.
* Use sempre a merlot pra iniciar os processos;
* Os processos morrem se excederem o tempo definido em ''walltime=hh:mm:ss''!
==== Submetendo diversos trabalhos no mesmo script / Array Jobs ====
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''.
==== Array Jobs 2 ====
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.
O terminal deve ser ''bash'' e não ''sh'' como nos demais exemplos, alguma sintaxe desse script não funciona num terminal ''sh''.
==== Array Jobs 3 ====
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]$$.
==== Open MPI / Torque ====
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
==== Monitorando seus processos ====
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
=== Matando seus processos ===
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[]''.