Nachdem der Hardware-Zusammenbau recht problemlos verlief und die ersten kleinen Softwaretest sehr vielversprechend waren, musste natürlich en kleines System entwickelt werden:
Auf dem PC erfragt ein Turbopascalprogramm einen Endwert und sendet diesen an Transputer A.
Dieser startet mit dem Wert 0, addiert eins dazu und sendet diesen Wert an Transputer C
Transputer C erhöht den Wert um eins und sendet diesen Wert an Transputer D.
Transputer D erhöht den Wert um eins und sendet diesen Wert an Transputer B.
Transputer B erhöht den Wert um eins und sendet diesen Wert an Transputer C.
Transputer C erhöht den Wert um eins und sendet diesen Wert an Transputer B.
Transputer B erhöht den Wert um eins und sendet diesen Wert an Transputer A.
Transputer A erhöht den Wert um eins und sendet diesen Wert an Transputer D.
Transputer D prüft, ob der Endwert erreicht wurde und sendet die verbrauchte Zeit an das Turbopascalprogramm zurück und sagt den anderen Transputern bescheid, die Schleife zu beenden.
Wahrlich kein wirklich sinnvolles Programm, aber damit lässt sich die gesamte Hardware und ein kleiner Teil des Softwareinterfaces testen.
Das Turbopascalprogramm fällt recht kurz aus:
program ring; uses LinkLib; var Endwert:longint; Zeit:single; begin writeln('Ringleitung:'); writeln(' Es wird ein Wert solange herumgeschickt'); writeln(' und um eins erhöht, bis der Endwert erreicht ist!'); Endwert:=0; repeat write('Endwert (1.000 ... 10.000.000) ?'); readln(Endwert); until (Endwert>=1000)and(Endwert<=10000000); writeln('+++ Es geht los +++'); Int32ToLink(Link1,Endwert); writeln; Int32FromLink(Link2, Endwert); Real32FromLink(Link2, Zeit); write('Ringlaufzeit :'); write(' Dauer:',Zeit:6:2,' Sekunden., '); write(Endwert ,' Wörter.'); writeln(' Rate :',Endwert*4/Zeit:10:2,' Bytes pro Sekunde.') end.
Auch die Occamprogramme sind nicht wirklich aufwändig:
PROC PlusEins(CHAN OF INT LOUT, LIN) INT Wert: SEQ LIN ? Wert LOUT ! Wert LIN ? Wert WHILE Wert >= 0 SEQ LOUT ! Wert + 1 LIN ? Wert LOUT ! Wert :
Auf den Transputern B und C laufen jeweils zwei "+1"-Prozesse:
#USE "PlusE000.tsr" PROC PlusEinsTwice(CHAN OF INT LOUT1, LIN1, LOUT2, LIN2) PAR PlusEins(LOUT1, LIN1) PlusEins(LOUT2, LIN2) :
Der Code für Transputer A:
#USE "PlusE000.tsr" PROC Anfang(CHAN OF INT LOUT2, LIN2, LOUT1, LIN1) CHAN OF ANY FromHost: CHAN OF ANY ToHost: PLACE FromHost AT 4: PLACE ToHost AT 0: INT Wert: INT Ende: PAR SEQ ToHost ! (BYTE 0) ToHost ! (BYTE 7) ToHost ! (BYTE 0) ToHost ! (BYTE 0) ToHost ! (BYTE 0) Wert := 0 FromHost ? Ende LOUT1 ! Ende LIN1 ? Wert WHILE Wert >= 0 SEQ LOUT1 ! Wert + 1 LIN1 ? Wert LOUT1 ! Wert PlusEins(LOUT2, LIN2) :
Der Code für Transputer D:
#USE "PlusE000.tsr" PROC Ende(CHAN OF INT LOUT2, LIN2, LOUT1, LIN1) PAR CHAN OF ANY ToHost: PLACE ToHost AT 0: TIMER Uhr: INT Start: INT Stop: INT Wert: INT Ende: SEQ Wert := 0 LIN1 ? Ende Uhr ? Start Wert := 0 WHILE Wert < Ende SEQ LOUT1 ! Wert + 1 LIN1 ? Wert LOUT1 ! -1 (INT) Uhr ? Stop ToHost ! Ende ToHost ! (REAL32 ROUND ((Stop - Start) * 64)) / 1000000.0(REAL32) PlusEins(LOUT2, LIN2) :
Konfiguration der Transputerumgebung:
[8] CHAN OF INT Link: PLACED PAR PROCESSOR 1 T8 PLACE Link[ 0] AT 1: PLACE Link[ 5] AT 7: PLACE Link[ 6] AT 2: PLACE Link[ 7] AT 6: Anfang(Link[6],Link[5],Link[0],Link[7]) PROCESSOR 2 T8 PLACE Link[0] AT 5: PLACE Link[1] AT 3: PLACE Link[3] AT 4: PLACE Link[4] AT 2: PlusEinsTwice(Link[1],Link[0],Link[4],Link[3]) PROCESSOR 3 T8 PLACE Link[2] AT 5: PLACE Link[3] AT 0: PLACE Link[4] AT 6: PLACE Link[5] AT 3: PlusEinsTwice(Link[3],Link[2],Link[5],Link[4]) PROCESSOR 4 T8 PLACE Link[1] AT 7: PLACE Link[2] AT 1: PLACE Link[6] AT 6: PLACE Link[7] AT 2: Ende(Link[2],Link[1],Link[7],Link[6])
In Action sieht das ganze dann so aus:
Kaum zu glauben, wie kompakt man früher gearbeitet hat:
Das Transprogramm ist für alle 4 Transputer zusammen kompiliert und gelinkt ganze 2392 Byte und das Turbopascalprogramm 17280 Byte groß (Achtung Byte, nicht Megabyte).