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.
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
--ntasks=16
--ntasks=16
--ntasks=16 and --ntasks-per-node=1
ou --ntasks=16 and --nodes=16
--ntasks=16 --nodes=16 --exclusive
--ntasks=16 --ntasks-per-node=2
--ntasks=16 --ntasks-per-node=16
--ntasks=1 --cpus-per-task=16
--ntasks=4 --cpus-per-task=4