MATLAB® est un logiciel commercial développé par la société Mathworks. Matlab est un langage de haut niveau et un environnement interactif pour le calcul numérique, la visualisation et la programmation.
Pré-requis :
Une fois ces conditions remplies, positionnez une variable d'environnement dans votre terminal connecté à CALI :
export MLM_LICENSE_FILE <PORT>@<NOM_SERVEUR_LICENCES>
en remplaçant <PORT>
par le numéro de port réseau, et <NOM_SERVEUR_LICENCES>
par le nom DNS (ou l'adresse IP) de votre serveur de licences.
Le principe consiste à préparer un fichier de commande matlab, puis à lancer dans le job slurm le logiciel matlab en lui demandant d'exécuter ce fichier de commandes.
Ci-dessous un exemple qui calcule la produit de deux matrices et sauve la résultat dans un fichier de sortie au format matlab out.mat
matmul.m
% Creation de deux matrices aleatoires 100x100 A=rand(100); B=rand(100); % Produit matriciel AB=A*B; disp(sprintf('Somme de tous les elements de AB : %12.5f', sum(AB(:)))); % Sauvegarde du resultat dans "out.mat" save out.mat AB;
matmul.sbatch
) #!/bin/bash # #SBATCH --partition=rapide #SBATCH --ntasks=1 #SBATCH --mem-per-cpu=1000 #SBATCH --time=00:30:00 module load matlab matlab -nojvm -nosplash -nodisplay -singleCompThread -r "matmul, exit"
sbatch matmul.sbatch
Notez que :
-singleCompThread
demande à matlab de n'utiliser qu'un seul thread, car nous avons demandé dans les réservation slurm une seule CPUexit
est nécessaire dans les commandes matlab pour quitter le logiciel à la fin de l'exécution de matmul. En l'absence de cette commande, matlab resterait en attente de commande, sans “rendre la main”
Sans l'option -singleCompThread
, matlab utilisera tous les coeurs disponibles sur la machine. On peut également utiliser la commande (obsolète) maxNumCompThreads
pour limiter le nombre de threads matlab.
Il faut alors que votre réservation slurm corresponde au nombre de threads utilisés par matlab.
maxNumCompThreads
pour limiter le nombre de thread matlabPour reprendre l'exemple précédent :
matmul.m
cpus=str2num(getenv('SLURM_CPUS_PER_TASK')) maxNumCompThreads(cpus); disp(sprintf('Max number of threads : %d', maxNumCompThreads)); % Creation de deux matrices aleatoires 100x100 A=rand(100); B=rand(100); % Produit matriciel AB=A*B; disp(sprintf('Somme de tous les elements de AB : %12.5f', sum(AB(:)))); % Sauvegarde du resultat dans "out.mat" save out.mat AB;
matmul.sbatch
#!/bin/bash #SBATCH --partition=rapide #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem-per-cpu=1000 #SBATCH --time=00:30:00 module load matlab echo "Nombre de cpu : $SLURM_CPUS_PER_TASK" matlab -nojvm -nosplash -nodisplay -r "matmul, exit"