Programy paralelizované pomocí OpenMP (shared memory) mohou běžet na clusteru, pokud při spouštění úlohy přidáte k příkazu qsub
parametr
-pe threaded no_slots
-pe threaded min_slots-max_slots
kde no_slots
nebo interval min_slots
a max_slots
je požadovný počet slotů, tj. procesorů na kterých má být úloha počítána. Toto je příklad odeslání víceprocesorové úlohy, která má bežet na dvou až čtyřech procesorech (podle aktuální dostupnosti slotů na clusteru)
$ qsub -pe threaded 2-4 myscript.sh
Alternativně je možné uvést příslušný parametr do souboru myscript.sh
#! /bin/sh
#$ -pe threaded 2-4
echo "Hello, I am $HOSTNAME"
echo "and will run your job on ${OMP_NUM_THREADS} processors."
./myprogram.exe
a skript odeslat příkazem
qsub
již bez parametrů. Protože paralelizace OpenMP je tzv. multi-threaded nebo shared memory, všechny procesory musí být na jednom počítači.
Update 20.1.2014
Při spouštění víceprocesorových úloh zatím nepoužívejte jméno počítače v seznamu požadavků (hard-request). Úloha potom zůstane viset ve frontě se zprávou cannot run in PE "threaded" because it only offers 0 slots
. Někde je asi chyba v nastavení, kterou se mi bohužel zatím nepodařilo najít.
Pro účely stanovení, které úlohy ve frontě se spustí dříve, nerozhoduje počet běžících úloh, ale počet využívaných procesorů (slotů).
Zde je ukázka kódu ve Fortranu paralelizovaného pomocí OpenMP
program helloworld implicit none integer OMP_GET_THREAD_NUM integer OMP_GET_NUM_THREADS, npp !$OMP PARALLEL DEFAULT (NONE) PRIVATE (npp) npp = OMP_GET_NUM_THREADS() !$OMP CRITICAL print *,'Hello from thread number',OMP_GET_THREAD_NUM(), npp !$OMP END CRITICAL !$OMP END PARALLEL end program helloworld |
Program uložený v souboru hello.f90
se zkompiluje se zapnutou podporou OpenMP například:
ifort -o myprogram.exe -openmp hello.f90
Nakonec technickou poznámku: v souvislostí s přidáním podpory pro paralelní úlohy jsem pozměnil nastavení clusteru z posix-compliant na unix-behavior. Mělo by to znamenat, že při spouštění úlohy se použije shell, který je uveden na prvním řádku skriptu (#! /bin/sh
) a není nutné zadávat parametr -S
při spouštění úlohy. Pro většinu uživatelů by se nemělo nic změnit, ale kdyby náhodou po této změně něco přestalo fungovat, tak se ozvěte…