Maple (en andere programma's) op de cluster

Opzetten van het probleem

Stel dat we, om maar een belachelijk voorbeeld te nemen, de som van de eerste n getallen willen berekenen voor n=1000, 10000, 100000, ... op de `brute force' manier. Een Maple commando hiervoor is
tot := 0;
for i from 1 to 100 do
  tot := tot + i
end do;
We loggen in op de cluster en zullen niet het meer gebruikelijke xmaple commando gebruiken om met maple te werken, maar maple. Het verschil tussen de twee is dat maple niet grafisch werkt, maar puur een tekst-interface is. Om een en ander te automatiseren zullen we de commando's niet manueel intypen maar met een echo commando aan Maple voederen:
[guest@clust0a guest]$ echo "tot := 0; for i from 1 to 100 do tot := tot + i end do;" | maple
Het resultaat is een hoop tekst met uiteindelijk
tot := 4851

tot := 4950

tot := 5050

> quit
bytes used=141776, alloc=196572, time=0.05

Het eerste dat opvalt is dat Maple automatisch een "quit" commando heeft ingevoerd; het tweede is dat we duidelijk veel te veel uitvoer krijgen. Dit valt te verhelpen als volgt:

[guest@clust0a guest]$ echo "printlevel := 0; tot := 0; for i from 1 to 100 do tot := tot + i end do; tot;" | maple
    |\^/|     Maple 7 (IBM INTEL LINUX)
._|\|   |/|_. Copyright (c) 2001 by Waterloo Maple Inc.
 \  MAPLE  /  All rights reserved. Maple is a registered trademark of
 <____ ____>  Waterloo Maple Inc.
      |       Type ? for help.
> printlevel := 0; tot := 0; for i from 1 to 100 do tot := tot + i end do; tot;
                                printlevel := 0

                                   tot := 0

                                     5050

> quit
bytes used=118520, alloc=131048, time=0.02
Hier krijgen we het resultaat, 5050, zonder al te veel extra franjes.

Het moge duidelijk zijn dat het best is eerst de juiste Maple commando's uit te zoeken in de klassieke xmaple vooraleer zo'n echo "..." | maple worst te gaan schrijven.

Paralleliseren

Het pure programmeerwerk is nu gedaan; nu moeten we enkel nog de computer zo ver krijgen verschillende Maple processen achter elkaar te draaien. We maken een bestandje, bijvoorbeeld commandos genaamd (met pico -w commandos of iets dergelijks):
echo "printlevel := 0; tot := 0; for i from 1 to 100 do tot := tot + i end do; tot;" | maple > out1 &
sleep 10
echo "printlevel := 0; tot := 0; for i from 1 to 1000 do tot := tot + i end do; tot;" | maple > out2 &
sleep 10
echo "printlevel := 0; tot := 0; for i from 1 to 10000 do tot := tot + i end do; tot;" | maple > out3 &
sleep 10
echo "printlevel := 0; tot := 0; for i from 1 to 100000 do tot := tot + i end do; tot;" | maple > out4 &
sleep 10
echo "printlevel := 0; tot := 0; for i from 1 to 1000000 do tot := tot + i end do; tot;" | maple > out5 &
sleep 10
De & aan het eind van elk commando zorgt ervoor dat het programma in kwestie in de achtergrond zal lopen en de computer zal dus direkt voortgaan met het volgende commando, sleep 10. Dat commando wacht 10 seconden, daarna wordt weer een Maple in de achtergrond gestart enz. Na een kleine minuut zullen er dus vijf Maples draaien (in de ietwat pessimistische veronderstelling dat de eerste nog niet klaar zou zijn). De reden dat we telkens 10 seconden wachten is dat de cluster nogal onstabiel kan reageren als er te snel te veel programma's ineens worden gestart (het gebruikelijke symptoom is dat er vijf minuten lang helemaal niets gebeurt waarna alles ineens weer in gang schiet; er crasht dus niet echt iets maar het is toch wel verwarrend).

De >out1 bij elk Maple commando zorgt ervoor dat de uitvoer (en dus het resultaat van de berekening dat we zo graag zouden willen weten) in een bestand met naam out1 wordt bewaard.

Deze methode werkt uiteraard enkel als je maar een tiental programma's tegelijk wil draaien (aangezien we maar 15 processoren hebben). Als je meer programma's wil draaien, contacteer de systeembeheerder (er zijn oplossingen aanwezig die schalen tot duizenden programma's).

We starten de boel met

./commandos
Helaas krijgen we permission denied; we moeten met
chmod a+x commandos
aangeven dat commandos uitvoerbaar is. Dan werkt het wel: we krijgen een 50-tal seconden niets te zien, waarna we weer de commandoprompt terugkrijgen. Met mtop kunnen we het verloop van onze verrichtingen in de gaten houden:
Hier zien we drie mserver commando's (Maples dus) die respectievelijk 82, 46 en 46 procent van de processortijd krijgen. Samen is dat meer dan 100%; de verklaring is natuurlijk dat niet alle drie de Maples op dezelfde processor lopen. In de N# kolom kan je zelfs zien op welke computer het programma in kwestie op dat ogenblik aan het draaien is: een Maple zit op computer 3 en de andere twee zitten op onze computer (aangeduid door een 0).

Nu is er nog een klein probleempje: van zodra we uitloggen worden al onze Maples gestopt. (In de praktijk blijven ze soms toch doordraaien ... strange) Als we onze commando's doen draaien met

nohup ./commandos &
dan zullen ze zeker blijven doordraaien, ook als we uitloggen. Later kunnen we dan komen kijken naar de out1, out2, ... bestanden.

Tips & truuks