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=1) muss 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.

