Macierz zadań

Z KdmWiki
Wersja z dnia 08:23, 19 maj 2020 autorstwa Martach (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

< 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?