Paralelizace
Metacentrum wiki is deprecated after March 2023
Dear users, due to integration of Metacentrum into https://www.e-infra.cz/en (e-INFRA CZ service), the documentation for users will change format and site. The current wiki pages won't be updated after end of March 2023. They will, however, be kept for a few months for backwards reference. The new documentation resides at https://docs.metacentrum.cz. |
Příbuzná témata | |
---|---|
Aplikace s MPI [EN] |
|
Paralelní počítání dokáže výrazně zkrátit čas běhu vaší úlohy, protože úloha dokáže najednou využívat více zdrojů. Detailní informací si můžete přečíst zde.
MetaCentrum nabízí dva způsoby paralelního počítání – OpenMP a MPI, případně lze kombinovat oba.
OpenMP
Pokud vaše aplikace dokáže používat více vláken pomocí sdílené paměti, potom si vyžádejte samostatný uzel s více procesory. Například:
qsub -l select=1:ncpus=4:mem=16gb:scratch_local=5gb -l walltime=24:00:00 skript.sh
Ujistěte se, že před během vaší úlohy je správně nastavena proměnná OMP_NUM_THREADS (měl by ji automaticky nastavovat plánovač na počet vyžádaných jader). Pokud není nastavena, úloha využije všechna dostupná jádra uzlu a negativně ovlivní ostatní běžící úlohy (a navíc vám plánovač úlohu zabije). Kontrolu provedete příkazem:
echo $OMP_NUM_THREADS
Upozornění: odstraníte-li tuto proměnnou, velmi pravděpodobně vám úlohu zabije plánovač kvůli překročení využití povolených zdrojů.
Nastavení proměnné OMP_NUM_THREADS
Vepište následující řádku do vašeho dávkového skriptu.
export OMP_NUM_THREADS=$PBS_NUM_PPN #omezi pocet paralelnich procesu na pocet procesoru ziskanych od planovaciho systemu
MPI
Všechny MPI implementace, na které jsou v MetaCentru moduly, jsou zkompilované s podporou plánovače, takže u nich nemusíte, až na pár výjimek (viz dále v tabulce), používat parametr --hostfile.
Pokud vaše aplikace umožňuje komunikaci mezi více procesy promocí rozhraní předávání zpráv (přečtěte si kategorii aplikace s MPI), potom si vyžádejte určitý počet uzlů s libovolným počtem procesorů. Například:
qsub -l select=2:ncpus=2:mem=1gb:scratch_local=2gb -l walltime=1:00:00 skript.sh
Chcete-li si být jisti, že každý chunk bude na jiném nodu, je vhodné zařadit volbu place=scatter
qsub -l select=2:ncpus=2:mem=1gb:scratch_local=2gb -l place=scatter -l walltime=1:00:00 skript.sh
- Ujistěte se, že vhodný openmpi/mpich2/mpich3/lam modul je nahraný ve vašem protředí ještě předtím, než sputíte výpočet
Můžete si také vyžádat speciální uzly, který jsou propojené pomocí nízko-latenčního InfiniBand spojení, což povede k dalšímu navýšení rychlosti vaší úlohy. Například:
qsub -l select=4:ncpus=4:mem=1gb:scratch_local=1gb -l walltime=1:00:00 -l place=group=infiniband skript.sh
- InfiniBand je detekováno automaticky při spuštění MPI výpočtu, který využívá InfiniBand. Výpočet můžete začít běžným způsobem, například:
mpirun myMPIapp
Interakce MPI a OpenMP
Pokud vaše aplikace podporuje oba typy paralelizace (MPI a OpenMP), tak můžete využít jejich interakci. Ovšem je nutné výpočet spustit správně, jinak se úloha dostane do konfliktu s plánovacím systémem, který ji zabije. Příklady správného použití OpenMP knihovny:
Note: První dva příklady jsou zaměnitelné, ale jejich rychlost se může lišit. Zkuste oba způsoby a vyberte ten rychlejší
Žádané zdroje | Příklad |
---|---|
1 uzel, více procesorů | export OMP_NUM_THREADS=$PBS_NUM_PPN
mpirun -n 1 /cesta/k/programu ...
|
1 uzel, více procesorů | export OMP_NUM_THREADS=1
mpirun /cesta/k/programu ...
|
2 uzly, více procesorů | cat $PBS_NODEFILE |uniq >nodes.txt
export OMP_NUM_THREADS=$PBS_NUM_PPN
mpirun -n 2 --hostfile nodes.txt /cesta/k/programi ...
|