Chapel

From Alliance Doc
Jump to navigation Jump to search
This site replaces the former Compute Canada documentation site, and is now being managed by the Digital Research Alliance of Canada.

Ce site remplace l'ancien site de documentation de Calcul Canada et est maintenant géré par l'Alliance de recherche numérique du Canada.

This page is a translated version of the page Chapel and the translation is 100% complete.
Other languages:

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.

File : probeLocales.chpl

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.