Chapel
Chapel est un langage de programmation parallèle compilé de haut niveau à usage général avec des abstractions intégrées pour le parallélisme à mémoire partagée et distribuée. Chapel offre deux styles de programmation parallèle : (1) le parallélisme de tâches, où le parallélisme se fait par des tâches spécifiées par programmation, et (2) le parallélisme de données, où le parallélisme se fait en effectuant les mêmes calculs sur des sous-ensembles de données qui peuvent se trouver dans la mémoire partagée d'un nœud unique ou être distribués sur plusieurs nœuds.
Ces abstractions de haut niveau font de Chapel l'outil idéal pour apprendre la programmation parallèle pour le calcul de haute performance. Ce langage est incroyablement intuitif et s'efforce de fusionner la facilité d'utilisation de Python avec les performances des langages compilés traditionnels tels que C et Fortran. Les blocs parallèles qui prennent généralement des dizaines de lignes de code MPI peuvent être exprimés en seulement quelques lignes de code Chapel. Chapel est open source et peut fonctionner sur n'importe quel système d'exploitation de type Unix, avec une prise en charge matérielle des ordinateurs portables aux grands systèmes de CHP.
Chapel a une base d'utilisateurs relativement petite, donc de nombreuses bibliothèques qui existent pour C, C++ et Fortran n'ont pas encore été implémentées dans Chapel. Espérons que cela changera dans les années à venir, si l'adoption de Chapel continue de prendre de l'ampleur dans la communauté de CHP.
Pour plus d'information, voyez notre webinaire Chapel.
Calculs simples
Le module chapel-multicore
est utilisé sur nos grappes d'usage général avec un nœud unique et une mémoire partagée seulement. Vous pouvez utiliser salloc
pour tester si votre code fonctionne en séquentiel.
[name@server ~]$ module load gcc/9.3.0 chapel-multicore/1.31.0
[name@server ~]$ salloc --time=0:30:0 --ntasks=1 --mem-per-cpu=3600 --account=def-someprof
[name@server ~]$ chpl test.chpl -o test
[name@server ~]$ ./test
ou avec plusieurs cœurs sur un même nœud :
[name@server ~]$ module load gcc/9.3.0 chapel-multicore/1.31.0
[name@server ~]$ salloc --time=0:30:0 --ntasks=1 --cpus-per-task=3 --mem-per-cpu=3600 --account=def-someprof
[name@server ~]$ chpl test.chpl -o test
[name@server ~]$ ./test
Pour les tâches de production, veuillez préparer un script de soumission de tâche et le soumettre avec sbatch
.
Calculs distribués
Pour des tâches avec plusieurs nœuds et une mémoire hybride (partagée et distribuée), utilisez le module chapel-ofi
pour l'interconnexion OmniPath de Cedar et le module chapel-ucx
pour l'interconnexion InfiniBand de Graham, Béluga et Narval.
Le code suivant imprime l'information de base au sujet des nœuds disponibles dans votre tâche.
use MemDiagnostics;
for loc in Locales do
on loc {
writeln("locale #", here.id, "...");
writeln(" ...is named: ", here.name);
writeln(" ...has ", here.numPUs(), " processor cores");
writeln(" ...has ", here.physicalMemory(unit=MemUnits.GB, retType=real), " GB of memory");
writeln(" ...has ", here.maxTaskPar, " maximum parallelism");
}
Pour exécuter ce code sur Cedar, vous devez charger le module chapel-ofi
.
[name@server ~]$ module load gcc/9.3.0 chapel-ofi/1.31.0
[name@server ~]$ salloc --time=0:30:0 --nodes=4 --cpus-per-task=3 --mem-per-cpu=3500 --account=def-someprof
Une fois que la [[Running_jobs/fr#Tâches_interactives|] tâche interactive] est lancée, vous pouvez compiler et exécuter votre code à partir de l'invite sur le premier nœud de calcul alloué.
[name@server ~]$ chpl --fast probeLocales.chpl -o probeLocales
[name@server ~]$ ./probeLocales -nl 4
Pour exécuter le même code sur les grappes avec un réseau InfiniBand (toutes sauf Cedar), utilisez le module chapel-ucx
.
Pour les tâches de production, veuillez préparer un script de soumission de tâche et soumettre la tâche avec sbatch
.