Macierz zadań

Z KdmWiki
Przejdź do nawigacji Przejdź do wyszukiwania
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

< Podręcznik użytkownika KDM < System kolejkowy < Macierz zadań

Czym jest macierz zadań

Macierz zadań (job array) stanowi zbiór zadań uruchomionych jednocześnie.

Mechanizm ten pozwala w łatwy i szybki sposób uruchomić kilka zadań jednocześnie.

Każde zadanie w macierzy posiada indeks, który jest przechowywany w zmiennej środowiskowej PBS_ARRAY_INDEX.

Jak utworzyć macierz zadań?

W celu utworzenia macierzy zadań należy użyć w skrypcie opcji –J i podać zakresów indeksów macierzy:

  #PBS -J i-f:s

gdzie i to indeks początkowy, f – końcowy, a s definiuje krok. Parametr s jest opcjonalny, domyślnie przyjmuje wartość 1.

W celu utworzenia macierzy dziesięciu zadań indeksowanych od 1 do 10, należy użyć w skrypcie polecenia:

  #PBS -J 1-10

W celu utworzenia macierzy zadań można również podać opcję –J przy zlecaniu obliczeń:

  qsub -l walltime=1:00:00 -J 1-3 hello.sh

Powyższa komenda spowoduje uruchomienie trzech zadań zdefiniowanych w skrypcie hello.sh. Zadania te mają przypisane kolejno indeksy 1, 2 i 3, które są przechowywane w zmiennej PBS_ARRAY_INDEX.

Jak sprawdzić status macierzy zadań

Macierz zadań jest oznaczona w systemie kolejkowym numerem z kwadratowym nawiasem

  jobID[]

zatem w celu sprawdzenia statusu macierzy zadań, należy użyć polecenia:

  qstat jobID[]

W celu sprawdzenia statusu wszystkich zadań w macierzy należy użyć polecenia:

  qstat –t jobID[]
  ~/test_array_jobs > qstat -t 1030789[]
  Job id                 Name             User              Time Use S Queue
  ---------------------  ---------------- ----------------  -------- - -----
  1030789[].ossachilles  hello.sh         3107mach                 0 B vshort
  1030789[1].ossachilles hello.sh         3107mach          00:00:00 E vshort
  1030789[2].ossachilles hello.sh         3107mach          00:00:00 R vshort
  1030789[3].ossachilles hello.sh         3107mach          00:00:00 R vshort

W celu sprawdzenia statusu pojedynczego zadania w macierzy należy użyć polecenia:

  qstat jobID[indeks]

W celu sprawdzenia szczegółowych informacji o macierzy zadań należy użyć polecenia:

  qstat –f jobID[]

Szczególnie przydatne mogą być informacje o ilości zadań z macierzy w poszczególnych statusach:

  ~/test_array_jobs > qstat -f 1031517[] | grep array_state_count
      array_state_count = Queued:4 Running:16 Exiting:0 Expired:0

Działające macierze zadań są oznaczone w systemie kolejkowym literą B “batch”, a nie R „running”.

Przykład użycia

Poniższy skrypt pozwala na jednoczesne uruchomienie kilku zadań w programie Gaussian2016. Skrypt można wywołać w katalogu zawierającym pliki inputowe programu Gaussian2016. Wywołanie skryptu spowoduje utworzenie macierzy zadań, której elementami będą zadania powiązane z poszczególnymi plikami inputowymi.

  #!/bin/bash 
  
  # tworzenie listy, której elementami są pliki inputowe znajdujące się w bieżącym katalogu
  list=(`ls *.inp`)
  # liczba plików inputowych pomniejszona o 1
  number=$(( ${#list[*]} - 1 ))
  
  cat   <<EOF  | qsub
  #!/bin/bash
  # deklaracja liczby zadań macierzy równej liczbie plików inputowych
  #PBS -J 0-${number}
  # parametry zadania
  #PBS -l select=1:ncpus=4:mem=2000MB
  #PBS -N Zadanie
  #PBS -l software=Gaussian_2016-C01
  #PBS -l walltime=1:00:00
  # deklaracja nazwy plików ze standardowym wyjściem i standardowym wyjściem błędów
  # pliki stdout i stderr zostaną zapisane w katalogu Job^array_index^
  #PBS -o Job^array_index^/stdout
  #PBS -e Job^array_index^/stderr
  
  list=(`ls *.inp`)
  cd `pwd`
  # utworzenie katalogów Job0, Job1, ..., w których zapisane zostaną pliki stdout i stderr
  mkdir Job\$PBS_ARRAY_INDEX
  
  module load gaussian/g16.C.01
  
  # uruchomienie zadań zapisanych na liście
  g16 \${list[\$PBS_ARRAY_INDEX]}
  
  EOF

W celu odwołania się do indeksu podzadania macierzy w dyrektywie PBS (#PBS) należy użyć składni: ^array_index^, a nie zmiennej BASH: PBS_ARRAY_INDEX.


Zobacz też: Jak korzystać z kolejek PBS?