verteiltes Rechnen
Bash
Besonders geeignet, wenn die Berechnung sich leicht verteilen
lässt und keine Kommunikation zwischen den Knoten
notwendig ist.
- Beispiel: Raytracing einer Animation mit Povray
- jeder Knoten berechnet nacheinander jeweils ein Bild
- zur Synchronisation dient ein Lockfile
- das Jobfile (clicjob.pbs)
#!/bin/sh
#PBS -l walltime=1:00:00,nodes=10
#PBS -A URZ
#PBS -M thpo@hrz.tu-chemnitz.de
DIR=/afs/tucz/project/cluster/clic-kurs/Povray
cd $DIR
# checkpointing
if [ ! -f frame.txt ]; then
echo 0 > frame.txt
fi
pbsdsh $DIR/nodejob.sh
- das eigentliche Programm als Shell-Skript (nodejob.sh)
#!/bin/sh
DIR=/afs/tucz/project/cluster/clic-kurs/Povray
NUMFRAMES=100
cd $DIR
while true; do
lockfile frame.lock # kritischen Bereich schützen
read FRAME < frame.txt
let FRAME++
echo "$FRAME" > frame.txt
rm -f frame.lock # Ende Lock
# Abbruchbedingung
if [ $FRAME -gt $NUMFRAMES ]; then break; fi
# Aufgabe bearbeiten
echo "$HOSTNAME $FRAME"
CMD="./povray +SF${FRAME} +EF${FRAME} +KFF${NUMFRAMES} povray.ini "
#echo $CMD
$CMD &> $HOSTNAME.log
done
echo "$HOSTNAME exit"
- nun kann das Programm mittels qsub auf dem CLiC gestartet werden
$ qsub -A URZ -I -l nodes=10,walltime=1:00:00
$ sh clicjob.pbs
oder
$ qsub clicjob.pbs
MPI
- Message Passing Interface, eine standardisierte Programmierschnittstelle für den Nachrichtenaustausch auf Parallelrechnern
- viele Kommunikationsoperationen, aber kaum Fehlertoleranz
- statisches Prozessmodell
- ein kleines Beispielprogramm
#include <stdio.h>
#include "mpi.h"
int main(int argc, char* argv[])
{
int myrank = 0, commsize;
MPI_Init(&argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
MPI_Comm_size( MPI_COMM_WORLD, &commsize);
MPI_Barrier( MPI_COMM_WORLD );
printf("Hello I am %d\n", myrank);
fflush(NULL);
MPI_Finalize();
return 0;
}
MPI mit LAM
- MPI-Programme mit LAM übersetzen
[thpo@clic4l32]$ mpicc -Wall -o mpibsp mpibsp.c
- LAM starten
[thpo@clic4l32]$ export LAMBHOST=${PBS_NODEFILE}.lam.eth1
[thpo@clic4l32]$ echo $LAMBHOST
/var/spool/pbs/aux/39843.clic0a1.hrz.tu-chemnitz.de.lam.eth1
[thpo@clic4l32]$ lamboot -v
LAM 6.5.6/MPI 2 C++/ROMIO - University of Notre Dame
Executing hboot on n0 (clic4l326 - 1 CPU)...
Executing hboot on n1 (clic4l316 - 1 CPU)...
Executing hboot on n2 (clic4l236 - 1 CPU)...
Executing hboot on n3 (clic4l216 - 1 CPU)...
Executing hboot on n4 (clic4l136 - 1 CPU)...
Executing hboot on n5 (clic4l126 - 1 CPU)...
Executing hboot on n6 (clic4l116 - 1 CPU)...
Executing hboot on n7 (clic4a325 - 1 CPU)...
Executing hboot on n8 (clic4a315 - 1 CPU)...
Executing hboot on n9 (clic4a125 - 1 CPU)...
topology done
[thpo@clic4l32]$ lamnodes
n0 clic4l326.hrz.tu-chemnitz.de:1
n1 clic4l316.hrz.tu-chemnitz.de:1
n2 clic4l236.hrz.tu-chemnitz.de:1
n3 clic4l216.hrz.tu-chemnitz.de:1
n4 clic4l136.hrz.tu-chemnitz.de:1
n5 clic4l126.hrz.tu-chemnitz.de:1
n6 clic4l116.hrz.tu-chemnitz.de:1
n7 clic4a325.hrz.tu-chemnitz.de:1
n8 clic4a315.hrz.tu-chemnitz.de:1
n9 clic4a125.hrz.tu-chemnitz.de:1
- MPI-Programm starten
[thpo@clic4l32]$ mpirun -np 10 mpibsp
Hello I am 0
Hello I am 9
Hello I am 4
Hello I am 1
Hello I am 8
Hello I am 2
Hello I am 6
Hello I am 5
Hello I am 3
Hello I am 7
- LAM beenden
[thpo@clic4l32]$ lamclean
[thpo@clic4l32]$ lamhalt -v
LAM 6.5.6/MPI 2 C++/ROMIO - University of Notre Dame
Shutting down LAM
LAM halted
Nach Job-Beendigung LAM beenden!
MPI mit MPICH
- MPI-Programm analog zu LAM
- Umgebungsvariablen für MPICH setzen
[thpo@clic4l32]$ export MPIHOME=/usr/local/packages/mpich-ch_p4-1.2.4
[thpo@clic4l32]$ export CC=${MPIHOME}/bin/mpicc
- Programm übersetzen
[thpo@clic4l32]$ $CC -Wall -o mpibsp-mpich mpibsp.c
- Programm starten
[thpo@clic4l32]$ ${MPIHOME}/bin/mpirun -np 10 \
-machinefile ${PBS_NODEFILE}.mpich.eth1 mpibsp-mpich
Hello I am 0
Hello I am 6
Hello I am 4
Hello I am 8
Hello I am 2
Hello I am 7
Hello I am 3
Hello I am 5
Hello I am 1
Hello I am 9
PVM
- PVM benötigt eine spezielle Verzeichnisstruktur
[thpo@odoaker]$ tree $HOME/pvm3
/afs/tu-chemnitz.de/home/urz/t/thpo/pvm3
|-- bin
| `-- LINUX
| |-- hello
| `-- hello_other
|-- include -> /usr/share/pvm3/include
`-- lib -> /usr/share/pvm3/lib
[thpo@odoaker]$ chacl -R $HOME/pvm3 urz:clicnodes read
- Programm übersetzen
[thpo@odoaker]$ qsub ...
[thpo@clic2a33]$ cd ~/pvm3/bin/LINUX
[thpo@clic2a33]$ gcc -static -L/usr/share/pvm3/lib/LINUX \
-I/usr/share/pvm3/include -o hello_other \
/usr/share/pvm3/examples/hello_other.c -lpvm3
[thpo@clic2a33]$ gcc -static -L/usr/share/pvm3/lib/LINUX \
-I/usr/share/pvm3/include -o hello \
/usr/share/pvm3/examples/hello.c -lpvm3
- Programm ausführen
[thpo@clic2a33]$ export PVM_ROOT=$HOME/pvm3
[thpo@clic2a33]$ pvm -n$(head -1 ${PBS_NODEFILE}.lam.eth1) \
${PBS_NODEFILE}.lam.eth1
pvm> conf
conf
10 hosts, 1 data format
HOST DTID ARCH SPEED DSIG
clic2a332 40000 LINUX 1000 0x00408841
clic2a322 80000 LINUX 1000 0x00408841
clic2a312 c0000 LINUX 1000 0x00408841
clic2a232 100000 LINUX 1000 0x00408841
clic2a222 140000 LINUX 1000 0x00408841
clic2a212 180000 LINUX 1000 0x00408841
clic2a132 1c0000 LINUX 1000 0x00408841
clic2a122 200000 LINUX 1000 0x00408841
clic2a112 240000 LINUX 1000 0x00408841
clic1l432 280000 LINUX 1000 0x00408841
pvm> ps -a
ps -a
HOST TID FLAG 0x COMMAND
pvm> quit
quit
Console: exit handler called
pvmd still running.
[thpo@clic2a33]$ ${PVM_ROOT}/bin/LINUX/hello
i'm t40002
from t80001: hello, world from clic2a32.hrz.tu-chemnitz.de
- PVM beenden
[thpo@clic2a33 thpo]$ echo "halt" | pvm
pvmd already running.
pvm> halt
Beendet
Eine detaillierte Einführung in das Parallele Rechnen mit MPI bietet die Vorlesung "Parallele Programmierung" bei Prof. Rünger.
Inhalt