====== 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"