web-dev-qa-db-fra.com

Cluster HPC: sélectionnez le nombre de processeurs et de threads dans SLURM sbatch

La terminologie utilisée dans la page de manuel sbatch peut être un peu déroutante. Ainsi, je veux être sûr d'obtenir les bonnes options. Supposons que j'ai une tâche à exécuter sur un seul nœud avec N threads. Ai-je raison de supposer que j'utiliserais --nodes=1 et --ntasks=N?

J'ai l'habitude de penser, par exemple, à utiliser pthreads pour créer N threads dans un seul processus. En résulte-t-il ce qu'ils appellent des "cœurs" ou des "cpus par tâche"? Les processeurs et les threads ne sont pas les mêmes choses dans mon esprit.

10
Tanash

Selon le parallélisme que vous utilisez: mémoire distribuée ou partagée

--ntasks=#: Nombre de "tâches" (à utiliser avec le parallélisme distribué).

--ntasks-per-node=#: Nombre de "tâches" par nœud (à utiliser avec le parallélisme distribué).

--cpus-per-task=#: Nombre de CPU alloués à chaque tâche (à utiliser avec le parallélisme de mémoire partagée).


À partir de cette question : si chaque nœud a 24 cœurs, y a-t-il une différence entre ces commandes?

sbatch --ntasks 24 [...]
sbatch --ntasks 1 --cpus-per-task 24 [...]

Réponse :

Oui, il y a une différence entre ces deux soumissions. Vous avez raison, généralement ntasks est pour mpi et cpus-per-task est pour le multithreading , mais regardons vos commandes:

Pour votre premier exemple, le sbatch --ntasks 24 […] attribuera un travail avec 24 tâches. Dans ce cas, ces tâches ne sont que 1 CPU, mais peuvent être réparties sur plusieurs nœuds. Vous obtenez donc un total de 24 CPU sur plusieurs nœuds.

Pour votre deuxième exemple, le sbatch --ntasks 1 --cpus-per-task 24 [...] allouera un travail avec 1 tâche et 24 CPU pour cette tâche. Ainsi, vous obtiendrez un total de 24 CPU sur un seul nœud.

En d'autres termes, une tâche ne peut pas être divisée en plusieurs nœuds. Par conséquent, en utilisant --cpus-per-task veillera à ce qu'il soit alloué au même nœud, lors de l'utilisation de --ntasks peut et peut l'allouer à plusieurs nœuds.


Un autre bon Q&A : Supposons que vous ayez besoin de 16 cœurs. Voici quelques cas d'utilisation

  • vous utilisez mpi et ne vous souciez pas de l'endroit où ces cœurs sont distribués: --ntasks=16
  • vous souhaitez lancer 16 processus indépendants (pas de communication): --ntasks=16
  • vous voulez que ces cœurs se répartissent sur des nœuds distincts: --ntasks=16 and --ntasks-per-node=1 ou --ntasks=16 and --nodes=16
  • vous voulez que ces cœurs se répartissent sur des nœuds distincts et sans interférence provenant d'autres travaux: --ntasks=16 --nodes=16 --exclusive
  • vous voulez que 16 processus soient répartis sur 8 nœuds pour avoir deux processus par nœud: --ntasks=16 --ntasks-per-node=2
  • vous voulez que 16 processus restent sur le même noeud: --ntasks=16 --ntasks-per-node=16
  • vous voulez un processus pouvant utiliser 16 cœurs pour le multithreading: --ntasks=1 --cpus-per-task=16
  • vous voulez 4 processus qui peuvent utiliser 4 cœurs chacun pour le multithreading: --ntasks=4 --cpus-per-task=4
18
Tung