Software > Matlab

Matlab

Beschreibung

Matlab ist ein programmierbar interaktives Programmsystem zum numerischen und symbolischen Rechnen mit umfangreiche Visualisierungsmöglichkeiten.  Es ist auch möglich C/C++ - und Fortran-Routinen einzubinden.

Verfügbar auf:

Ansprechpartner

Benutzung auf dem RRZN-Clustersystem

Um dieses Paket auf dem RRZN-Clustersystem zu benutzen, muss man das Modul laden.  Dies macht man so: 

module load matlab

Falls Sie die Fehlermeldung "module: command not found" bekommen, müssen Sie dieses Kommando eingeben (im normalen Fall ist das "module" Kommando bereits vorhanden): 

source /usr/share/Modules/init/`basename $SHELL`

Dokumentation und Beispiele

Serielles Matlab-Programm

Folgend ist ein Batchskript um Matlab-Programm (hello.m) auf einem Prozessor laufen zu lassen.  Wichtig in diesem Beispiel ist, dass da man nur einen Prozess angefordert hat (#PBS -l nodes=1:ppn=1muss die -singleCompThread Option zu Matlab eingeben werden.

#!/bin/bash -login
#PBS -N seriellMatlab
#PBS -M ich@meine.email.adresse
#PBS -j oe
#PBS -l nodes=1:ppn=1
#PBS -l walltime=00:10:00
#PBS -l mem=3600mb
#PBS -q all


# initialise the modules environment
source $MODULESHOME/init/bash


# load the relevant modules
module load matlab

 

# change to work dir:
cd $PBS_O_WORKDIR

# log file name

LOGFILE=$(echo $PBS_JOBID | cut -d"." -f1).log
 

# the program to run
matlab -nodesktop -singleCompThread < hello.m > $LOGFILE 2>&1

Paralleles Matlab-Programm

Um Matlab im parallelen Modus zu benutzen muss man aufpassen, dass die angefordeten Anzahl an Threads (parallele Prozesse) auch an Matlab übergeben wird.  Dies ist besonders wichtig auf einem System wie das RRZN-Clustersystem wo man Rechenknoten mit anderen Nutzern teilt.  Um die Anzahl an Threads übergeben zu können, benutzt man im Batchskript die Zeile

export NUM_THREADS=$(wc -l $PBS_NODEFILE | cut -d" " -f1)

Diese Zeile stelle eine Umgebungsvariable mit dem Namen "NUM_THREADS" ein.  Diesen Wert liest man (von Matlab aus) mit dem folgenden Matlab-Code:

num_threads = str2num(getenv('NUM_THREADS'));

Danach erstellt man die benötigten Anzahl an Threads innerhalb Matlab mit dem Kommando:

matlabpool open num_threads

Am Ende des Matlab-Skriptes muss man folgendes schreiben:

matlabpool close

Hier ist ein Beispiel in dem ein Matlab-Programm vier (4) CPU-Kerne benutzt.  Hier werden vier Threads (auch: parallele Prozesse) gestartet.  Zuerst das Batchskript:
 

#!/bin/bash -login
#PBS -N parallelMatlab
#PBS -M ich@meine.email.adresse
#PBS -m ae
#PBS -j oe
#PBS -l nodes=1:ppn=4
#PBS -l walltime=00:10:00
#PBS -l mem=3600mb
#PBS -q all

# show which computer the job ran on
echo "Job ran on:" $(hostname)

# initialise the modules environment
source $MODULESHOME/init/bash

# load the relevant modules
module load matlab

# change to work dir:
cd $PBS_O_WORKDIR

# work out the number of threads
export NUM_THREADS=$(wc -l $PBS_NODEFILE | cut -d" " -f1)

# log file name
LOGFILE=$(echo $PBS_JOBID | cut -d"." -f1).log

# the program to run
matlab -nodesktop < lin_solve.m > $LOGFILE 2>&1

 Und dann das Matlab-Programm (auch Matlab-Skript benannt) namens "lin_solve.m":

% program: lin_solve.m
clear

%%%% the following three lines should be copied to the beginning
%%%% of your matlab program
% use the number of threads we requested in batch script
num_threads = str2num(getenv('NUM_THREADS'));
matlabpool open num_threads

%%%% now run our actual matlab program %%%%
% set up the matrix to solve
n = 7000;
A = rand(n);
y = rand(n,1);

% solve the matrix
x = A\y;
fprintf('Done!\n')

% close the matlabpool
matlabpool close

 

Textausgabe vom Matlab-Skript

Es gibt zwei Methoden um Textausgabe von einem Matlab-Skript zu erzeugen und zu bekommen.  Entweder speichert man die Ausgabe von Matlab in einem Logfile direkt im Batchskript, oder man schickt eine Mail direkt an sich vom Matlab-Skript aus.  Hier werden beide Möglichkeiten beschrieben.

Ausgabe vom Matlab als Logfile

In den Beispiel-Batchskripten oben wurde den direkten Weg Ausgabe von Matlab zu bekommen dokumentiert.  Dies ist auch der empfohlene Weg solche Information zu bekommen.  Wie in den Beispielen oben ist es hilfreich, aber nicht unbedingt nötig, einen Logdateinamen automatisch von der Job-ID zu erzeugen.  Dieser Automatismus hilft um zu vermeiden, dass die Logdateien von vorherigen oder gleichzeitiglaufenden Batchjobs nicht überschrieben werden.

Man erzeugt im Batchskript eine Umgebungsvariable von der einzigartigen Job-ID:

LOGFILE=$(echo $PBS_JOBID | cut -d"." -f1).log

Dann, nach dem Aufruf zu Matlab, leitet man beide die Standard- und Fehlerausgaben von der Konsole in die Logdatei weiter:

matlab -nodesktop < matlab_script.m > $LOGFILE 2>&1

Während der Job läuft, kann man die Ausgabe überpüfen in dem man die Logdatei in einem Editor oder mittels des "more" Kommandos darstellt.

Ausgabe als Mail von Matlab

Man kann sich eine Mail mit beliebigem Text zuschicken lassen und sich somit über den Stand der aktuellen Rechnung informieren lassen. Das funktioniert im Matlab-Skript folgendermaßen:


 setpref('Internet','SMTP_Server','smtpserver.rrzn.uni-hannover.de');
 setpref('Internet','E_mail','absender@email.adresse');
 message = 'irgend-ein-String';
 sendmail('ich@meine.email.adresse','Meine Info',message);


"Meine Info" ist dabei der Betreff der Nachricht und "ich@meine.email.adresse" der Empfänger.

Vielen Dank an Herrn Lutz vom Institut für Baumechanik und Numerische Mechanik für diese Dokumentation.

Speicherung Datenmengen über 2GB

Beim Verwenden des Matlab Kommandos 'save()' zum Abspeichern der Werte von Variablen wird normalerweise ein Format verwendet, das nur Variablen mit der Größe bis zu 2GB verarbeiten kann. Wenn man versucht größere Dateien zu speichern, bekommt man eine Fehlermeldung ähnlich wie folgende:

Warning: Variable 'xxxxxx' cannot be saved to a MAT-file whose version is
older than 7.3. To save this variable, use the -v7.3 switch. Skipping...

Um größere Datenmengen zu erlauben, und den obengenannten Fehler zu beheben, muss vom per default eingestellten Dateiformat v7 auf das neuere v7.3 umgestellt werden. Dies erreicht man entweder durch den Schalter '-v7.3' in jedem 'save()' des Quelltextes, oder durch das generelle Unstellen des Dateiformates auf die neue Version über File > Preferences > General > MAT-Files.

Letzte Änderung: 25.04.2012
 
Verantwortlich RRZN