==== 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[]''.