Chapel

From CC Doc
Jump to navigation Jump to search
This page is a translated version of the page Chapel and the translation is 100% complete.
Other languages:
English • ‎français

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

Pour l'instant, les calculs simples sur nos grappes tout usage (Cedar, Graham et Béluga) sont possibles ailleurs que centralement et peuvent être intiailisés avec un script. Par exemple, pour tester les codes Chapel salloc en séquentiel :

  [name@server ~]$ source /home/razoumov/startSingleLocale.sh
  [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

avec plusieurs cœurs sur un même nœud :

  [name@server ~]$ source /home/razoumov/startSingleLocale.sh
  [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

L'utilisation d'une mémoire distribuée nécessite le réglage de l'amorçage de Chapel en fonction de l'interconnexion physique particulière de chacune des grappes. Comme les interconnexions physiques sont différentes, à titre expérimental, chacune offre une version compilée dans un répertoire distinct. Pour tester cette configuration, utilisez le code suivant qui insère dans votre tâche les renseignements de base sur les nœuds disponibles.


File : probeLocales.chpl

use Memory.Diagnostics;
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");
  }


Chargez Chapel et lancez une tâche interactive demandant quatre nœuds et trois cœurs sur chaque nœud.

  [name@server ~]$ source /home/razoumov/startMultiLocale.sh
  [name@server ~]$ salloc --time=0:30:0 --nodes=4 --cpus-per-task=3 --mem-per-cpu=3500 --account=def-someprof


Une fois la tâche lancée, compilez et exécutez votre code à partir de l'invite sur le premier nœud de calcul alloué.

  [name@server ~]$ chpl probeLocales.chpl -o probeLocales
  [name@server ~]$ ./probeLocales -nl 4

Pour les tâches de production, veuillez préparer un script de soumission Slurm et le soumettre avec sbatch.