minpic01.jpg

PARweise

Zwei Transputer-C-Compiler für PCs im Vergleich

David Göhler

Occam ist manchem nicht geheuer, auch wenn er Programme für Transputer schreiben möchte. C dagegen ist weit verbreitet, C-Source läßt sich meist leicht portieren, heißt es. Nur mit der Parallel-Verarbeitung hapert es. Mit Inmos-C und Par-C stehen zwei Compiler zum Vergleich, die diesem Manko mit zwei verschiedenen Konzepten zu Leibe rücken.

Unterthema: Ausstattung der C-Compiler
Unterthema: Paralleles C
Unterthema: Benchmarkergebnisse
Unterthema: Ergebnisse auf einen Blick

An sich sollte man meinen, daß C-Compiler sich doch weitgehend ähneln müssen, gerade wenn sie beide auf einem PC mit mindestens einer Transputer-Karte (kompatibel zu einer TEK 4/8 oder einem B004-Board von Inmos) laufen. Doch (leider) gibt es viele Unterschiede, was Portierungen nicht eben einfach macht, insbesondere bei der Implementierung von `Parallelität´ kocht jeder seine eigene Suppe.

Gut dokumentiert ...

Inmos beeindruckt gleich zu Anfang durch drei blutrote Schuber im Format 20 × 24 Zentimeter. Im ersten befinden sich ein `Delivery Manual´, fünf 3,5- und elf 5,25-Zoll-Disketten. Der zweite Schuber enthält Beschreibungen zu allen mitgelieferten Programmen, der dritte beinhaltet Erläuterungen zu allen Library-Funktionen und Bemerkungen zum ANSI-Standard. Vorweg: Das Inmos-C hält sich vollständig an den ANSI-Standard; man findet sogar eine Liste mit Erläuterungen, wie in jedem einzelnen Fall verfahren wurde, in dem ANSI es dem Compiler-Hersteller überläßt, wie er etwas implementiert. Insgesamt bekommt man knapp 1000 Seiten, darunter noch ein kleines, `Handbook´ genanntes Heft, das auf 60 Seiten die möglichen Parameter aller Programme und alle Library-Funktionen auflistet.

Die Dokumentation ist sinnvoll gegliedert, gut zu lesen und läßt selten Fragen offen - wenn man des Englischen kundig ist. Fragen waren in der Regel schnell durch einen Blick in das passende Handbuch zu klären. Gute Dokumentation - das ist eine persönliche Auffassung - zeichnet sich auch dadurch aus, daß man schnell in ihr das findet, was man sucht. Differenzen zwischen Software und Beschreibung waren nicht festzustellen; das ist ja selbst bei Produkten dieser Preislage nicht immer der Fall.

Auch die Installation machte keine Probleme. Nach 16 Minuten des Diskettenwechselns, der Beantwortung einiger Fragen, sowie einigen Eintragungen in der autoexec.bat und config.sys, konnte mit einem Probelauf begonnen werden. Das erste `Hallo Welt´ lief sofort. Leider waren einige Fragen der automatischen Installation erst nach gründlichem Lesen des `Delivery Manuals´ zu beantworten. Man sollte den Benutzer lieber bei der Installation weniger fragen und mehr installieren. Wenn etwas fehlt, ist dies für den Anfänger nur schwer zu beheben.

Als sehr nützlich hat sich das `Handbook´ herausgestellt. Da in ihm alle Optionen und Funktionen beschrieben sind, hat es in den meisten Fällen zur Sättigung des Informationshungers ausgereicht. Eine Idee, die auch andere Hersteller aufgreifen sollten.

Großformatig

Ursprünglich wurde das Par-C von der Firma Parsec entwickelt, die inzwischen von der ebenfalls in Amsterdam ansässigen Associated Computer Experts bv (ACE) übernommen wurde. Par-C wird in einem Ordner im Leitzformat geliefert. Darin enthalten sind fünf 360-KB-Disketten, sowie knapp 700 DIN-A4-Seiten in Englisch gehaltene Dokumentation. Da sie in einem gut zu lesenden Stil verfaßt ist, läßt sie sich ebenfalls leicht lesen.

Leider ließ das Werk die Klarheit und Ausführlichkeit des Inmos-Handbuchs vermissen. Einige beschriebene Optionen kannte der Compiler nicht (man mußte die Änderungen einem Readme-File entnehmen). Nicht selten war mir nur noch in Erinnerung, etwas gelesen zu haben; zu finden war es dann erst nach längerem Suchen.

Auch die Beschreibung der Installation war nicht vollständig. Ein Hinweis fehlte, was alles in die autoexec.bat einzutragen ist. Dementsprechend gelang die komplette Installation nicht auf Anhieb. Einem kundigen PC-Benutzer sollte sie jedoch keine Schwierigkeiten machen. Nach sechs Minuten war der Compiler in der Lage, sein `Confidence testing´ erfolgreich zu durchlaufen.

Sehr ausführlich und gut gelungen sind die Beschreibungen zu den Erweiterungen von C, die Parsec für die Implementation der Parallelität in C eingefügt hat. (Die Firma nennt die so erweiterte Sprache `Parallel C´, und ihr `Par C´ die erste Implementation dieser Sprache). Die in diesem Kapitel angewandte Sorgfalt sollte Parsec/ACE auf alle Kapitel legen. Da beide Compiler keine Online-Hilfen bieten, sind die Handbücher die einzige Informationsquelle bei Fragen, Fehlern und Unklarheiten.

Wie die vielen Disketten schon vermuten lassen, sollte man etwas größeres als einen XT mit Floppy besitzen, um die Compiler benutzen zu können. Das Inmos-C benötigt gute sieben Megabyte Plattenplatz, Par-C begnügt sich mit zwei Megabyte. Beiden gemeinsam ist, daß ein schneller Rechner nicht schaden kann. Er braucht nicht viel Speicher zu haben (ein MByte reicht), aber flott sollte er sein. Der Test-Rechner war ein 386er mit 25 MHz Taktfrequenz; damit läßt sich arbeiten.

Der Compiler allein macht es nicht. Heutzutage benötigt man für eine zügige Entwicklung neben dem Übersetzer noch diverse Hilfeprogramme, die die Arbeit erleichtern, Fehler verhindern und finden helfen. Besonders wichtig sind hierbei ein Debugger und ein Make. Wer schon einiges entwickelt hat, weiß, daß er diese beiden Tools neben dem Compiler am häufigsten braucht. Weiter hilfreich sind ein Editor, der auf den Compiler abgestimmt ist, ein separater oder integrierter Assembler, ein Librarian (Library-Verwaltungsprogramm), ein Profiler, Cross-Referenz-Tools, Object-Analyse-Programme, ein Programm zur Volltextsuche (grep zum Beispiel) und eventuell eine Oberfläche (wie bei Borlands Turbo-Familie).

Leicht bekleidet

Hier ist der erste große Unterschied zwischen den beiden Produkten zu finden. Par-C ist ein Compiler und sonst nichts. Es fehlt fast alles: Der Debugger, das Make, ein Editor, ein Librarian, die Oberfläche und sonstige nützliche Tools. Lediglich ein RUN2ROM (zum Erzeugen vom ROM-fähigen Code) sowie ein MODRUN (zum Verändern bootfähiger Programme) liegen dem Quartett Compiler/Assembler/Linker/Server bei. Der Linker vermag zumindest noch Symbol- und Cross-Referenz-Listen zu erzeugen. Ein Profiler und der Server (teilweise) werden als Source mitgeliefert.

Wie kann man einen Compiler dieser Preisklasse so `nackt´ verkaufen? Damit lassen sich zwar Programme erzeugen, aber kaum entwickeln, wenn man unter diesem Begriff zumindest noch das Debuggen faßt. Da es sich bei den produzierten Programmen um solche für Transputer handelt, kann man auch nicht auf andere (PD-)Tools zurückgreifen; gar nicht zu denken an bestimmt auftretende Probleme in einem Transputer-Netz.

Reichlich gedeckt

Inmos dagegen hat sein Produkt mit vielen Tools flankiert. Dazu gehört ein (Source-Level-)Debugger, der sowohl interaktiv als auch als Postmortem-Debugger eingesetzt werden kann, ein Librarian, einige Programme zum Inspizieren von Object-Modulen, ein Simulator (der in der PC-Version allerdings einen Transputer benötigt!?), einen einfach zu bedienenden Makefile-Generator, der Makefiles für gängige Make-Programme erzeugt, und ebenfalls ein Programm zum Erzeugen von EPROM-fähigem Code. Leider fehlt ein Make und ein Editor (auf Wunsch liefert Inmos einen PD-Falten-Editor sowie ein PD-Make mit).

Der Source-Level-Debugger sucht seinesgleichen. Er hat diverse Funktionen, die auch die Suche nach Fehlern im Netz stark vereinfachen. So kann er beispielsweise Breakpoints verteilt über viele Prozessoren setzen, und stets die Source zu einem erreichten Breakpoint präsentieren. Hat man nur einen Transputer, so muß man allerdings mit dem Postmortem-Modus vorlieb nehmen, da der Debugger immer einen Transputer für sich beansprucht. Hierzu existiert ein Programm namens `idump´, das auf Wunsch auch das komplette Netz in ein Postmortem-File verwandelt, das anschließend entwanzt werden kann.

Obgleich auf dem PC-Sektor Entwicklungsoberflächen nicht selten sind (und Inmos mit dem TDS keinen schlechten Wurf getan hatte), lassen sich alle - sowohl die Inmos- als auch die Parsec-Tools - nur über den COMMAND.COM `bedienen´. Bedienungskomfort erhält man erst nach dem Schreiben diverser Makefiles und Batch-Dateien.

Auch in der Art, wie ein Programm auf mehrere Transputer aufgeteilt wird, unterscheiden sich die beiden Kandidaten. Inmos wählt den konventionellen (statischen) Weg, eine Konfigurationsdatei zu erstellen, die ein Transputer-Netz und die darauf zu verteilenden Prozesse beschreiben. Dafür hat man extra eine einfache, C-ähnliche Sprache entwickelt, um trotz der statischen Beschreibung möglichst flexibel zu bleiben.

Nach dem Linken ist noch ein Konfigurations- und Sammeldurchlauf vonnöten, wobei für jeden Transputer angegeben werden muß, welche Prozesse auf ihm laufen, welche Verbindungen nach außen wie heißen, und so weiter. Nach dem Konfigurieren sind alle gebundenen und konfigurierten Dateien zu einem bootfähigen Programm zusammenzuholen: das erledigt das mitgelieferte Programm `icollect´. Das Konfigurieren kann entfallen, wenn man nur einen Transputer hat.

Die innovative Art

Parsec erledigt diese Aufgabe gänzlich anders - und auf eine pfiffige Weise: Das auszuführende Programm wird auf alle Transputer geladen. Bevor es jedoch gestartet wird, hat ein `Schnüffel´-Programm vorher das komplette Netz ausgelotet und auf jedem Transputer eine immer vorhandene Datenstruktur gefüllt. So kann jedes Programm jederzeit `nachfragen´, auf welchem Transputer es läuft, wieviele es insgesamt gibt, wieviele Nachfolger es hat, über welches Link es gebootet wurde und ähnliches. Mit diesem Wissen kann der Programmierer das Programm so schreiben, daß erst zur Laufzeit entschieden wird, welcher Transputer welchen Code ausführt.

Diese Methode ist weitaus flexibler als die von Inmos, da man vor dem Start des Programms schnell noch ein paar Karten hinzustecken kann, um einer Problemlösung Beine zu machen. Sie hat aber auch einen Nachteil: auf jedem Transputer muß eine Kopie des gesamten Programms vorhanden sein. Wird das Programm zu groß, muß man alle Transputer mit mehr RAM versorgen.

Gemächliche Renner

Zu Transputern fällt den meisten befragten Personen zuallererst `hohe Geschwindigkeit´ ein. Recht haben sie, gehört der T800 doch in die Leistungsklasse, in der die Gespanne 68030/68882 und 80386/80387 zu finden sind. Aus diesem Grund sollte man erwarten, daß auch Compiler und Kompilate flott sind - weit gefehlt.

Die Tabellenwerte zeigen, daß beide Compiler recht lange brauchen (das Inmos-C fällt beim Linken kleiner Dateien besonders unangenehm auf). Der Flaschenhals - so könnte man vermuten - sei hierbei das 8-Bit-Link-Interface zum Transputer. Doch bis auf den Compiler und den Debugger des Inmos-C habe ich in diesem Test nur die PC-gestützten Tools verwendet, die ausschließlich auf dem PC laufen. Zwar liefert Inmos alle Programme auch in einer für Transputer ausführbaren Form aus, diese sind jedoch noch viel langsamer. So gelang es nicht, mit dem Linker für den Transputer ein leeres Programm unter 36 Sekunden zu linken (einem Inmos-Mitarbeiter gelang dies nach eigener Aussage sehr wohl, doch das ist eine andere Geschichte).

Entgegen einiger Andeutungen im Handbuch laufen alle Programme des Par-C ohne Transputer. Beim Linken merkt man dies besonders. Der Linker arbeitet recht flott. Er hat auch keine 1,2 MByte große Library zweimal zu beackern wie der Inmos-Linker, denn alle Libraries des Par-C-Compilers machen zusammen nicht einmal 100 KByte Code aus. Hier kann man sehen, was ein paar Optimierungen bringen können.

Die Programmgrößen gehen in Ordnung, denn der Transputer wird als CPU ohne Betriebsystem genutzt. In jedem Programm muß das komplette Server-Protokoll zwischen Transputer und Host-PC eingebaut sein. Wenn da noch ein `printf()´ und ein paar kleinere Routinen zusammenkommen, sind 20 KByte nicht zuviel. Ein `Hello World´ auf einer Sparc `wiegt´ dagegen 105 KByte. Wer will sich da noch beklagen?

Setzt man jedoch die 680 Zeilen der Whetstone-Source in Beziehung zu den 25 Sekunden, die es vom Source zum ausführbaren Programm braucht, so läßt das erahnen, wie viel Zeit man an einem PC mit Warten verbringen muß, wenn man an größeren Projekten arbeitet. Auf meinem 68030-System benötigt ein Compiler-Durchlauf inklusive Linken 7 Sekunden, Turbo-C läuft da noch einiges schneller. Wo bleibt die Zeit?

Die Ausführungszeiten sind leider nicht so, wie die langen Arbeitszeiten der Compiler vermuten lassen. Insbesondere die Dhrystone-Werte machen stutzig: Für eine 32-Bit-CPU bei 25 MHz sollten schon 6000 bis 7000 Steinchen drin sein. Auch die kWhetstones sind nicht überragend. In einem Werbeblatt zum Par-C-Compiler waren bessere Zeiten zu finden, doch trotz des Verlegens von Code und Data ins interne RAM ließ sich der Wert nicht über 1000 kWhetstones bringen.

Auch Inmos vermeldete weit bessere `Stone-`Ergebnisse. Nun haben Hersteller sicher die Möglichkeit und auch die Neigung, sich optimale Konfigurationen hinzustellen und zu nutzen, so daß auch Benchmarks die besten Ergebnisse liefern.

Ungereimtheiten

Beim Programm `Ackermann´, das teuflisch rekursiv ist, zeigte sich ein Fehler im Par-C. Die Ackermann-Funktion benötigt als Parameter zwei Argumente, die der Größe wegen als `long int´ deklariert waren. Das fertige Programm verweigerte aber die Arbeit. Schon bei `ackerman(3,1)´ gab es Speicherprobleme, bei kleineren Werten kamen unsinnige Zeiten heraus. Bei Variablen des Typs `int´ lief es einwandfrei. `long ints´ haben beim Par-C eine Länge von 64 Bit.

Oft stößt man im Handbuch zum Par-C auf den Begriff ANSI-C. Doch leider sind nur der Preprocessor und die Libraries (fast) ANSI-C-kompatibel. Der Compiler ist es nicht. Er unterstützt keine Prototypes und erlaubt auch nicht die Angabe der Parameter-Typen direkt hinter dem Funktionsnamen vor den Parameter-Bezeichnern. In der Library sind aber keineswegs alle ANSI-C-Funktionen zu finden. Wie so viele Hersteller hat sich Par-C die `locale´-Funktionen gespart; setjmp.h mit den Deklarationen zweier Rücksprungfunktionen fehlt ebenfalls.

Aus diesem Grund mußten einige Test-Programme an Par-C angepaßt werden. ANSI-C war und ist ein wichtiger Schritt in die richtige Richtung und sollte von keinem C-Compiler-Hersteller mehr mißachtet werden. Es ist nicht klar, warum Parsec dies noch nicht berücksichtigt hat.

Das Inmos-C dagegen glänzt durch absolute Kompatibilität und unterstützt darüber hinaus auch 16-Bit-Transputer. Dies macht das Inmos-C besonders für Maschinensteuerungen interessant, da in einer genormten Hochsprache programmiert werden kann.

Fazit

Die Erweiterung der Sprache C um drei neue Schlüsselwörter ist die elegantere Lösung, C Parallelität beizubringen. Es ist nicht nur intuitiver, es entbindet den Programmierer in vielen Fällen auch davon, sich Gedanken über die gleichzeitige Nutzung von einmaligen Ressourcen zu machen. So erlaubt Par-C dem Benutzer, 35 parallel laufende Prozesse zu starten, die alle gleichzeitig auf `stdout´ schreiben.

Die Idee ist faszinierend, aber die Implementierung noch nicht. Par-C mangelt es an manchem: an umgebenden Tools, an noch besserer Dokumentation, an ANSI-C-Konformität, an Fehlerfreiheit. Auch so Kleinigkeiten wie das Fehlen einer Meldung, wenn das Transputer-Errorflag gesetzt ist - das Transputer-Programm steht und es passiert nichts -, zeigen, daß an diesem Produkt noch gearbeitet werden muß.

Inmos-C dagegen ist bieder, aber gut. Es ist nicht schnell, bietet auch nicht alles, was man gerne hätte - aber das, was man bekommt, ist grundsolide, funktionell und bestens beschrieben; etwas mit dem man arbeiten und auf das man sich verlassen kann. Man sollte sich in England dazu durchringen, noch ein Make mitzuliefern und dem Linker ein wenig Beine zu machen. Sonst bleibt wenig an dem Produkt auszusetzen.

Daß Inmos das andere Konzept bei der Implementation von Parallelität gewählt hat, ist auf den zweiten Blick auch nicht so bedeutsam. Denn Parallelität auf einem einzigen Transputer macht wenig Sinn, und bei mehreren ist auch beim Par-C-Konzept die Eleganz dahin. Dann nämlich reicht das `par´-Statement allein auch nicht mehr aus und man muß mit geeigneten Programmkonstruktionen (if, for ...) entscheiden, auf welchem Prozessor gerade welcher Code laufen soll. Und damit bleibt letztendlich doch alles am Programmierer hängen, egal welches C er nun benutzt - auch wenn es ihm im einen Fall leichter gemacht wird. (bb)

Literatur
[1] Mark Williams Company, ANSI C, A Lexical Guide, Prentice Hall, 1988

[2] David Göhler, C-Zaren, Lattice 5.0 und Aztec 5.0 für den Amiga im Vergleich, c't 5/90, S. 92

Kasten 1


Während Inmos seinen C-Compiler mit einer nahezu vollständigen Tool-Sammlung umgeben hat, fehlt beim Par-C von Parsec so einiges.

Ausstattung der C-Compiler

Par-C 1.31 Inmos-C 1.42f
Compiler
Kommando-Zeile++
integrierte Oberfläche--
ruft Linker+-
Inline-Assembler++
T2-Support-+
FPU-Direkt-Support++
Assembler-Output++
ANSI-kompatibel-+
Editor--
separater Assembler+-
Cross-Referenz-Lister++
Librarian-+
Assembler-Debugger-++
Source-Level-Debugger-++
Make - - 2)
Objekt/Library-Analyse-+
weitere Analyse-Programme-+
Profiler + 1)-
Hilfsprogramme wie grep,diff...--
Installations-Programm++
Dokumentation+-++
in Deutsch--
Bibliotheken ANSI-kompatibel-+

- nicht vorhanden,

+ vorhanden

++ vorhanden und sehr gut

+- vorhanden, aber mit Mängeln

1) im Source zum Übersetzen

2) es existiert jedoch ein Makefile-Generator

Kasten 2


Paralleles C

Um Parallelität in C zu implementieren, gibt es zwei Möglichkeiten: Entweder man fügt den Libraries Funktionen hinzu, die parallellaufende Prozesse starten, terminieren und mit Prioritäten versehen, oder man erweitert die Sprache C um einige Anweisungen.

Inmos ging den ersten Weg, Parsec mit Par-C den zweiten. Der Erstgenannte hat den Vorteil, den Pfad der Tugend - des reinen C - nicht zu verlassen, dafür aber den Nachteil, so manche Verrenkung beim Programmieren in Kauf nehmen zu müssen. Was in Occam eine einfache Anweisung war, führt in C jeweils zu einem Funktionsaufruf. Dies ist häufig nicht nur schlechter zu lesen, es zwingt den Programmierer oft, selbst Ressourcen zu allozieren, zu testen, ob er sie erhalten hat, und zuletzt wieder freizugeben. In Occam war das nie ein Thema.

Par-C dagegen ist die Implementierung von `Parallel C´ - ein Standard-C mit drei Erweiterungen: der `par´-Anweisung, dem Datentyp `channel´ und der `select´-Anweisung. Sie entsprechen weitgehend den Occam-Äquivalenten.

par

Die par-Anweisung gibt es in zwei Ausführungen: In der einfachen Form folgt ihr eine öffnende geschweifte Klammer, danach beliebig viele Anweisungen und eine schließende geschweifte Klammer. Die Anweisungen in den geschweiften Klammern werden alle (quasi-)parallel ausgeführt.

Möchte man bei einer Anweisung keine Funktion aufrufen, sondern mehrere Anweisungen nacheinander ausführen lassen - jedoch parallel zu allen anderen innerhalb des par-Blocks -, so ist, wie in C üblich, ein Block mit geschweiften Klammern zu benutzen. Ein Beispiel:

par
{
 lieswas(ein, zwei);
 tuwas();
 { i = 5;
   j = i + 5;
 }
 schreibwas(drei);
}
In der komplizierten Form hat das par die Syntax der for-Anweisung. Dieses Beispiel erzeugt acht parallele Prozesse, die alle die Funktion `BerechneSpalte´ aufrufen:

par (i=0; i <8; i++)
{
 { BerechneSpalte(array,i);
 }
}
Jeder Prozeß bekommt aber sein eigenes `i´. Die Kompatibilität zum for geht sogar soweit, daß ein

par (;;) 
erlaubt ist, was aber stets zu einem Runtime-Error führt - wer hat schon unendlich viel Speicherplatz?

channel

Mit dem channel -Datentyp kann man Kanäle vereinbaren.

channel reinraus; 
Nun kann man die Variable `reinraus´ wie bei jedem anderen elementaren Datentyp (wie int, long, char ...) auch in Zuweisungen und Funktionsaufrufen benutzen. Steht `reinraus´ links in einer Zuweisung, wird der Wert der Zuweisung in den Kanal geschrieben, steht sie rechts, wird sie aus dem Kanal gelesen. Es lassen sich auch Felder aus Kanälen definieren, oder Kanäle in Strukturen unterbringen. Es geht alles, was mit einem elementaren Datentyp zu machen ist.

Eine mögliche Kette von parallellaufenden Prozessen, die verzahnt Daten weiterreichen, sieht so aus:

channel feld[10];
int i;
par
{
 berechne_irgendwas(0, 0L, feld[0]);
 par (i = 1; i <= 9; i++)
 {
  berechne_irgendwas(i, feld[i-1], feld[i]);
 }
 berechne_irgendwas(9, feld[9], 0L);
}

select

Als drittes implementiert die select-Anweisung das Äquivalent zum `ALT´ von Occam, nur etwas flexibler und komplizierter. Damit lassen sich Multiplexer bauen und Programme oder Prozesse schreiben, die an vielen Eingabe-Kanälen auf Eingaben horchen.

Wie in Occam ist es möglich, mehrere Kanäle gleichzeitig abzuhorchen. Kommt etwas an irgendeinem Kanal an, verzweigt select in die passende Routine, die die ankommenden Daten entgegennimmt. Anders als in Occam wird hierbei jedoch das Byte, welches den Kanal aktiviert und die select-Anweisung dazu bringt, in eine bestimmte Funktion zu verzeigen, nicht von der select-Anweisung geschluckt. Es muß von der aufgerufenen Funktion gelesen werden. Dies ist aber in den meisten Fällen von Vorteil, da ein verschicktes Byte meist auch eine auszuwertende Bedeutung hat.

Auf ein Beispiel müssen wir hier verzichten, da die Syntax und die Funktion von select zu viele Erklärungen erfordern würde.

Kasten 3


Eigentlich hätte man kürzere Übersetzungszeiten und bessere Benchmark-Werte von Transputer-Compilern erwartet.

Benchmarkergebnisse

Inmos Transputer-C

NameSourceComp-ZeitObjectLink-Zeit1)Code
Leer2142741420393
Hello7153451424517
Ackermann82077451629877
Quicksort1028712171530564
Dhrystone17717 262)77942041235
Whetstone156261544221433342

Laufzeiten
Ackermann (3,9)40,12
QuickSort (50000)8,80
kWhetstones1218
Dhrystones 2.13225

1) Zeiten für `ilink´ und `icollect´

2) Compiler zweimal gestartet (für dhry_1 und dhry_2)

Parsec Par-C

NameSourceComp-ZeitObjectLink-Zeit1)Code
Leer1736431161
Hello714104314723
Ackermann7095612420968
Quicksort11446878421632
Dhrystone17717216358426186
Whetstone156262011876425097

Laufzeiten
Ackermann (3,9)107,0
(83,5) 1)
QuickSort (50000)15,1
(12,1) 1)
kWhetstones906
Dhrystones 2.13030

1) mit Code und Data im internen RAMGrößenangaben in Byte, Zeiten in Sekunden; Dhry- und Whetstones in Durchläufen (höhere Werte = besseres Ergebnis)Host-Rechner: 25 MHz AT mit 80386, DOS 3.3, VGA 16 Bit, 4 MByte RAM

Transputer: TEK4/8 mit T800, 25 MHz, 1 MB RAM (120 ns)

Kasten 4


Ergebnisse auf einen Blick

Inmos ANSI-C-Toolset

[ + ] volle ANSI-C-Implementierung

[ + ] sehr gute Dokumentation

[ + ] unterstützt T2-Transputer

[ + ] zuverlässig

[ + ] viele Tools inklusive Debugger

[ + ] Server auch als Source

[ - ] langsam

[ - ] Make fehlt

[ - ] Bedienungskomfort

Parsec/ACE Par-C

[ + ] gutes Sprachkonzept

[ + ] flotter Linker

[ + ] geringer Platzbedarf (kleine Libraries)

[ + ] separater Assembler

[ + ] Server auch als Source + Library

[ - ] diverse Entwicklungstools inklusive Debugger fehlen

[ - ] nicht ANSI-C-kompatibel

[ - ] Bedienungskomfort

[ - ] keine T2-Unterstützung

[ - ] Dokumentation etwas unübersichtlich