====== Matlab ======
{{description>Matlab est un langage de haut niveau et un environnement interactif pour le calcul numérique, la visualisation et la programmation.}}
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.
* Site web : http://www.mathworks.fr/products/matlab/
* Versions installées :
* 2007b
* 2008a
* R2014a
* R2017b
* R2019b
CALI ne dispose pas de licences Matlab. Vous devrez donc utiliser des licences flottantes de votre laboratoire pour pouvoir exécuter ce logiciel.
===== Utilisation =====
==== Sélection de la version ====
Pour sélectionner la version voulue : utiliser les [[..:modules]]
Par exemple :
module load matlab/R2014a
==== Indiquer votre gestionnaire de licences ====
Pré-requis :
- Votre laboratoire doit disposer d'un //gestionnaire de licences flottantes//
- Vous devez connaître le //nom DNS// de ce gestionnaire de licences, et le //numéro de port// utilisé
- L'accès réseau au gestionnaire doit être ouvert depuis CALI
Une fois ces conditions remplies, positionnez une variable d'environnement dans votre terminal connecté à CALI :
export MLM_LICENSE_FILE @
en remplaçant '''' par le numéro de port réseau, et '''' par le nom DNS (ou l'adresse IP) de votre serveur de licences.
==== Travailler avec slurm en mode séquentiel ====
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''
- Préparation du script matlab, dans le fichier ''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;
- Préparation du job slurm (fichier ''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"
- Soumission du travail
sbatch matmul.sbatch
:!: Notez que :
* l'option ''-singleCompThread'' demande à matlab de n'utiliser qu'un seul //thread//, car nous avons demandé dans les réservation slurm une seule CPU
* la commande ''exit'' 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"
* la quantité de mémoire demandée, et le temps prévisionnel d'exécution, sont à adapter pour votre script. N'oubliez pas que slurm tuera le job si la consommation de mémoire ou la durée excédent ce qui est demandé
* vous devez choisir la partition en fonction de vos besoins (voir l'article sur [[:slurm:les-bases | les base de slurm]])
==== Execution sous slurm en multi-threadé ====
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.
* Solution 1 : vous réservez un noeud entier et vous laissez matlab utiliser tous les threads
* Solution 2 : vous indiquez dans slurm une réservation de N coeurs et vous faites appel à la fonction matlab ''maxNumCompThreads'' pour limiter le nombre de thread matlab
Pour reprendre l'exemple précédent :
- Script ''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;
- Script ''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"