Arithmetic Logic Unit ALU programmieren

Hallo !

Weiß jemand, wie man die ALU programmiert, mit ihren Stacks und Registern ?

Am besten in schlichtem C…

Dank im Voraus - Ekkehard

Hi,

leider kann ich dir dabei nicht helfen :frowning:
lg

Was möchtest du denn genau wissen?
Im allgemeinen benutzt man Assembler, wenn man sowas direkt programmieren will. Und wie das genau funktioniert ist vom Typ der ALU abhängig…
Ich bin sicher, dafür gibt es Tutorials :smile:

@ Gee

Sorry, habe mich sehr ungenau ausgedrückt. Und falsch auch noch.
Es geht mir um die FPU, nicht wirklich die ALU.

In dem Programm, an dem ich z.Zt. arbeite, muss an zentraler Stelle
das Skalarprodukt aus zwei 3D-Vektoren gebildet werden, also zu je sechs Zahlen

a1,a2,a3 und b1,b2,b3 muss

e = a1*b1 + a2*b2 + a3*b3

gerechnet werden. - Und zwar pro Durchlauf locker 5*e+10 mal; das läppert sich…

Das ich via C die FPU nicht so leicht ansprechen kann, habe ich geahnt.

Vor Jahren hatte ich mal aus irgendeiner Zeitschrift eine Assembler Routine abgetippt, die „Mandelbrote“ rechnete - fast komplett FPU-intern. Die war sehr schnell. - Leider hab’ ich sie nicht mehr, sonst könnte ich sie „umbauen“…

Ich habe wirklich lange gesucht, nach einem Tutorial oder ähnlichem…

knirschke

Falls das zum Thema noch wichtig ist : meine CPU ist AMD Phenom II

Danke trotzdem !

Ekkehard

Hallo,

das macht jeder C-Compiler völlig von selbst.

> e = a1*b1 + a2*b2 + a3*b3

Die Variablen müssen dazu natürlich als „float“ oder
„double“ deklariert sein. Falls möglich wird ein moderner
Compiler es sogar über die SSE oder AVX Einheiten parallelisiert laufen lassen, anstatt die alte FPU zu benutzen.

Dirk

Hi, danke für die Antwort.

Ich weiß, wie man so etwas in C programmiert…

Ich weiß auch dass der Compiler versucht, Abläufe zu optimieren ; das Problem ist allerdings etwas komplexer als das Beispiel oben - eine Darstellung würde den Rahmen sprengen.

Es ging darum, die FPU mit ihren Registern SO zu programmieren, dass die Berechnungen SCHNELL laufen.
Vor Jahren hatte ich mal ein Beispiel zur Hand, wo die Berechnung des „Standard-Mandelbrotes“ so programmiert war, dass die Berechnung eines Punktes mit seinen Iterationen ausschließlich in den Registern FPU stattfindet. Man kann da herrlich mit stacks und anderem operieren…

Es scheint, dass die explizite Programmierung der FPU nur noch einem ganz intimen Kreis bekannt ist.

Jedenfalls : Vielen Dank, dass Du auf meine Frage eingestiegen bist !

drs

Ok, wenn Du die FPU wirklich in Assembler programmieren willst,
dann steht alles hier:

http://www.intel.com/content/www/us/en/processors/ar…

Kapitel 8-1.

Das ganze geht dann auch prima als inline-Assembler in C.

Trotzdem: wenn Du schnell sein willst, dann schliesse ich jede Wette ab, dass der Compiler das besser optimiert :smile:
Ausserdem wirst Du mit der FPU nie schnell werden. Dafür gibt es SSE 1-4 und AVX.

Im besten Fall bringt es etwas Spass, sich als Denksportaufgabe mit der kruden Stackarchitektur rumzuschlagen :smile:

Dirk

…etwas Spass, sich als

Denksportaufgabe mit der kruden Stackarchitektur rumzuschlagen

-)

Dirk

Hi Dirk,

vielen Dank für den Link und die Info.
Offenbar bin ich weit hinter der Zeit - SSE 1-4 und AVX sagt mir nichts - werde ich mal recherchieren.

Ansonsten erinnere ich mich gut, dass ich (so anno 92 rum) lange über jenem dunklen Rebus gegrübelt habe, aber am Ende lief meine Fraktal-Rechnerei ganz schön flott.

Ich glaube Dir einfach mal - dass der Compiler besser optimiert und spare mir das ganze Handoptimieren. Per gründlicher mathematischer Analyse ist der Rechenaufwand inzwischen auch beachtlich geschrumpft.

Hier

http://www.panoramio.com/user/288998/tags/Reliefs

kannst Du sehen, was ich so so am kochen bin - Sichtbarmachung von Höhendaten {Satelliten [ASTER ( -> http://de.wikipedia.org/wiki/ASTER ) ] - Daten }

Gruß - Ekkehard

Hallo Ekkehard,

ja, um die 1992 hat man das noch von Hand optimiert.

Übrigens: Skalarprodukt mit bis zu 4-dimensionalen Vektoren
macht SSE-4 in einem einzigen Assemblerbefehl (DPPS).
Siehe auch Seite 44 hier:

http://www.inf.ethz.ch/personal/markusp/teaching/263…

Hier lohnt es sich übrigens wirklich, einen inline Assemblerbefehl zu benutzen, da es die Compiler vermutlichen nicht schaffen, dies aus dem Code selbst zu erkennen. Es muss dann ja auch das Speicherlayout angepasst werden, was meist der schwierigste Teil der Optimierung ist. Heutzutage bremst bei solchen Problemen meist die Speicherbandbreite und nicht die eigentliche Berechnung.

PS: vermute mal, du sitzt gerade am Shading für das DEM Rendering. Das könnte man übrigens auch direkt auf der GPU in einem Shader rechnen, falls Du Echtzeit im Blick hast.

Dirk

Das könnte man übrigens auch direkt auf der GPU in

einem Shader rechnen, falls Du Echtzeit…

Alldieweil das Ganze allein meinem Vergnügen dient ( endlich kann ich das programmieren, was mir Freude macht) - deshalb kommt es nicht produktionsmäßig auf professionelle Geschwindigkeit an, sondern meine Idee war, so etwas mal komplett per manum zu konstruieren, auf low level, nur mit den Standard-Libs.

( Ich seh’ mich gerade so als Marathon-Läufer, der mit einem Hinweis auf den Bus nicht so ganz glücklich ist :wink: )

Dieses wäre das Sahnehäubchen gewesen…

Danke für die Hinweise - es wird ja mal wieder Winter, dann packe ich das Projekt mal wieder aus - vielleicht…

Ekkehard