Linpack auf dem QL

68K Power
Antworten
Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Linpack auf dem QL

Beitrag von medusa » 07.02.2013, 20:30

Hi Freax,

die Sockelleiste für mein Issue 5 Board ist noch nicht da, also habe ich den ollen PC mit dem darin nistenden QXL-Parasiten mal wieder hervorgezerrt. Als norddeutsche "Spaßbremse" bin ich in dieser Stadt im Moment unter Quarantäne und kann nicht raus. :roll:

Es ist mir schon lange ein Anliegen, den berühmten "Linpack" Benchmark auf alle meine Computer zu bekommen. Linpack war in frühen Zeiten DER Standardbenchmark für alles, was Bits schubsen konnte. Noch heute findet man für viele der berühmten Computer eine Leistungsangabe in Linpack-Megaflops. (Ok, heutzutage eher Teraflops.) Und die TOP-500 Liste der schnellsten Supercomputer wird nach wie vor mit Linpack ermittelt.
Linpack war ursprünglich mal ein FORTRAN-Programm, daß jedoch für alles was nur C spricht, umgeschrieben wurde (1988, 1993 und 1994) von Bonny Toy, Will Menninger und Jack Dongarra. Link http://www.netlib.org/benchmark/

Klar gibts auch andere Benchmarks, aber mir sagen ehrlich gesagt die Bogomips, Dhrystones oder SPECints auf dem PC überhaupt nichts. Von einem Linpack 1000 habe ich hingegen eine recht klare Vorstellung, was da passiert.

Linpack löst lineare Gleichungssysteme , es führt eine LU-Zerlegung einer quadratischen Matrix durch (na, da werden doch einige hier sich unbehaglich an die Vorlesungen in Linearer Algebra im 1.Semester erinnern?). Die Matrizen sind GROß und es wird in doppelter Genauigkeit (64 bit float) gerechnet. Das bringt so eine CPU und ihren Speicher schon ganz schön ins Schwitzen. Eine 1000x1000 Matrix belegt 8MB im RAM.

Ich hab den ersten Versuch mit dem Linpack C Quelltext auf meiner QXL-Karte unter SMSQ/E 2.90 gemacht. Hab mir für Arbeiten mit C schon vor Jahren C68 4.24f installiert.
C68 oder die QXL (oder beide) haben leider ein Problem mit dem clock() Systemaufruf, den ich nicht zum Arbeiten bekommen habe. (Wer da näheres zu weiß, immer her mit den Infos.) Als Workaround hab ich deshalb erstmal time() verwendet, der allerdings nur einen Typ time_t mit der Auflösung von einer Sekunde zurückgibt. Immerhin kann man damit Linpack zum Laufen bekommen, allerdings werden dann die Ergebnisse nur bei großen Matrizen genau, bei denen in der Ausführungszeit keine Sekundenbruchteile mehr zum Tragen kommen. Allerdings sind das auch genau die Tests, bei denen die CPU an ihre Grenzen stößt und die darum auch am interessantesten sind.
linpack_qxl.png
linpack_qxl.png (481.17 KiB) 7594 mal betrachtet
Meine QXL läuft mit 20MHz, drin ist ein 68LC040 Prozessor. Linpack gibt dafür (kompiliert nur mit -O, aber ohne architekturspezifische Optimierung) 0.022 "Megaflops" aus.
Ursprünglich war mal ein ganzer 68040 (mit FPU) in der Karte, der mir aber zu warm geworden ist. Könnte mit aktiver Kühlung jetzt wieder spannend sein, muß ich mal nach suchen. ;)

Bei Interesse stelle ich gerne mal ein *.zip mit Executables zusammen. Ich möchte vorher noch versuchen, das auf meinem originalen QL zum Laufen zu bekommen. Die Zahl wird natürlich traurig klein sein, trotzdem, ich muß es wissen...

~medusa.
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Re: Linpack auf dem QL

Beitrag von medusa » 08.02.2013, 15:52

So, hab nochmal rumprobiert. Der C68 weigert sich bei mir standhaft, Code für eine höhere Architektur als 68010 zu erzeugen. FPU-Unterstützung ist auch nicht drin. In beiden Fällen fliegt der Compiler selbst mit einem "internal compiler error" raus, also auch keine Chance, mit GWass weiterzukommen.
68010-Code bringt auf der QXL nicht viel, vielleicht 1.5% mehr Geschwindigkeit. :cry:

Die gute Nachricht ist, das Linpack Executable läuft auch auf einem QL im Originalzustand. Dabei kommt dann ziemlich genau 1 kFlop/s raus, wenn genug Speicher da ist. Naja, 64bit große Double Float über einen 8bit schmalen Datenbus zu schleifen tut halt so richtig weh.
Ich hab auf dem Weg "back to the roots" das Executable auch auf ein Microdrive kopiert (es hat 66 Blöcke aka 33k, paßt also). Auch auf einem komplett nackten QL lädt und läuft es, allerdings ist dann kaum noch Speicher für die Matrix übrig, mehr als 40x40 kann man nicht rechnen. Immerhin geht es überhaupt.

~medusa.
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Re: Linpack auf dem QL

Beitrag von medusa » 28.11.2013, 21:11

So, ich muß diesen alten Thread noch mal aus der Mottenkiste zerren...

Wieder beim Warten auf andere Projekte im Schwange hab ich an meiner QXL rumgebastelt und ihr mal einen 50MHz Quarz und eine 25MHz CPU spendiert. Linpack ergibt damit einen Wert von knapp unter 30kFlop/s.
Die CPU ist übrigens eine EC040 aus der J-Serie, die auch ohne Kühlkörper betrieben werden kann. Selbst nach 15min Matrixinversionsarbeit kann man sie noch ohne Probleme anfassen.

~medusa.
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
tofro
User
Beiträge: 1033
Registriert: 14.06.2012, 16:45

Re: Linpack auf dem QL

Beitrag von tofro » 28.11.2013, 21:37

Medusa,

stellst du deine Benchmarks irgendwo zur Verfügung? Es wäre spannend, die originale Hardware mal gegen Eine Gold- oder Supergold-Karte zu vergleichen und sowas mal einem QL-Emulator gegenüberzustellen.

Gruß
Tobias
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo

Benutzeravatar
Peter
User
Beiträge: 445
Registriert: 17.09.2013, 10:54

Re: Linpack auf dem QL

Beitrag von Peter » 29.11.2013, 01:09

Medusa, ich hab Dir mal Sourcen für qdos-gcc und Anleitung zum Crosscompilieren unter Linux geschickt, damit Du mehr Performace aus dem QL rausbekommst. :D Falls Du Lust hast, kannst ja mal den Unterschied zu C68 posten.

Allerdings FPU Support und 68040 Code geht leider nicht, weil der AS68 verwendet. Ich habe zwar einen m68k-coff GCC, mit dem ich sowas machen kann, und eigenen Bootcode. Läuft aber logischerweise nur auf Bare Metal, und bei einer QXL wüsste ich dann nicht, wie Bildschirmausgabe erzeugen.

Ich hätte auch Interesse an den QL-angepassten Linpack Sourcen.

Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Re: Linpack auf dem QL

Beitrag von medusa » 29.11.2013, 13:32

@tofro:
das hatte ich auf dem Treffen bei QLObi schon gemacht, siehe
viewtopic.php?f=9&t=1035

hier zum sofortigen Nachlesen:
GoldCard 5.5 kFlop/s
SuperGoldCard 14.7 kFlop/s

Wie gesagt, das ist mit C68 erzeugter reiner 68000 Code. Der Kommandozeilenaufruf ist oben auf dem Photo sogar noch zu sehen.
Das verpackte Executable lade ich am Wochenende hier mal hoch, kannst Du gerne selber mit "spielen"

@Peter
hab ich schon gesehen, vielleicht hab ich am WE Zeit dafür. Mein Fix am Source Code beschränkt sich auf den Aufruf der Timer-Routine, die hat der C68 nämlich nicht komplett implementiert. Deshalb gibt es nur ganze Sekunden und bei kleinen Matrizen und kurzen Laufzeiten entsprechend grobe Ergebnisse.

Mein Tip an alle ist: füllt den Speicher maximal mit der Matrix aus. Über den Daumen braucht sie Größe * Größe * 8 Bytes im RAM. Die Eingabe "1000" in Linpack versucht also 1000*1000*8 Byte = 8MB RAM anzusaugen. Die Rechenzeit wird dabei ziemlich groß, das kann schonmal anderthalb Stunden dauern. Also nicht gleich denken daß die Büchse abgeschmiert ist. :)

~medusa.
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
Peter
User
Beiträge: 445
Registriert: 17.09.2013, 10:54

Re: Linpack auf dem QL

Beitrag von Peter » 30.11.2013, 16:00

Hier ein mit GCC compiliertes Linpack Executable für QL:
linpack_gcc.zip
(20.26 KiB) 180-mal heruntergeladen
Die Leistungssteigerung gegenüber C68 scheint bei etwa 5% zu liegen.

Hinweis zum Compilieren: Linpack benötigt mit GCC keine Mathe-Library, was bei mir zur Einbindung eines printf() ohne Fliesskomma-Unterstüzung führt, welches dann zur Laufzeit meckert. Die -lm Option an der üblichen Stelle anzugeben blieb wirkungslos, da es keine offenen Referenzen in die Mathe-Library gab. Lediglich ganz hinten in der Commandline funktionierte, z.B.

qdos-gcc -O2 -o linpack.exe linpack.c -lm

Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Re: Linpack auf dem QL

Beitrag von medusa » 07.12.2013, 17:27

Sehr trüben Quellen zufolge soll ein Q40 übrigens mit dem C68-kompilierten Linpack Executable ungefähr 80kflop/s bringen.
8) 8) 8) 8) 8)
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
Peter
User
Beiträge: 445
Registriert: 17.09.2013, 10:54

Re: Linpack auf dem QL

Beitrag von Peter » 07.12.2013, 18:37

... da ist möglicherweise noch der COPYBACK Cache aus. :wink:
Für optimale Geschwindigkeit entweder genau das richtige SMSQ/E oder dieses Tool:

http://www.dilwyn.me.uk/qx0/cachemodes.zip

Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Re: Linpack auf dem QL

Beitrag von medusa » 08.12.2013, 10:36

Bei kleinen Matrizen hilft das, bei großen sicher nicht. Die Basisoperation ist ja Zeile*Spalte. Da muß schon ordentlich Cache vohanden sein, um soviele 64bit double reinzupacken. Deshalb muß man im Zeitalter der Caches auch immer fair bleiben und angeben, ob man "Linpack 100" oder "Linpack 1000" gerechnet hat. Der Linpack1000 Wert für den Q40 bleibt sicher so in der Größe. Aber wer weiß, Versuch macht kluch. Für die Tests mit den anderen Q'ies hatten wir das Problem ja bisher nie... :mrgreen:

Das größte, was ich je hab rechnen lassen, war übrigens ein Linpack10000 (yep, das sind vier Nullen) auf meiner 500MHz DEC Alpha LX164. 800MB Speicher für die Matrix. Da half der Alpha-CPU kein Cache mehr, die Performance ist gnadenlos eingebrochen...

~medusa.
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
medusa
User
Beiträge: 267
Registriert: 13.01.2013, 19:34
Wohnort: Köln

Re: Linpack auf dem QL

Beitrag von medusa » 16.01.2014, 13:30

Hab ich ganz vergessen, in den Weihnachtsferien hat meine ominöse trübe Quelle mal wieder einen Wert ausgespuckt...

Linpack auf dem Q60 gibt 228 kFlop/s. 1000x1000 Matrix, C68-kompilierter Code ohne besondere Tricks, unter SMSQ/E 2.98.
Bei sehr kleinen Matrizen kommt der Cache richtig zum tragen, das geht teilweise bis über 500.

~medusa.
PDP-11: 012700 176500 012760 000100 000000 000777.
68000: 4E71?
VAX: D450 908051 11FB!
Alpha: 47E8404 A4240000 A4440008 40220400 B404000C...

Benutzeravatar
Peter
User
Beiträge: 445
Registriert: 17.09.2013, 10:54

Re: Linpack auf dem QL

Beitrag von Peter » 17.01.2014, 09:57

Wenn Du möchtest, kannst Du nochmal ausdrücklich Copyback Cache einschalten, mit HIlfe dieser Extension:
http://www.dilwyn.me.uk/qx0/cachemodes.zip

Wenn vorher alles in Ordnung war, sollte sich kein Unterschied ergeben.

Benutzeravatar
Peter
User
Beiträge: 445
Registriert: 17.09.2013, 10:54

Re: Linpack auf dem QL

Beitrag von Peter » 21.10.2017, 11:40

Auf dem Q68 liefert Linpack derzeit 22.9 KFLOPS mit der Standard Array Größe von 200 X 200.
Wäre somit etwa 50% schneller als die SuperGoldCard und ähnlich der 20 MHz QXL.

Antworten