Autor Beitrag
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 30.03.05 19:01 
Der Prozessor braucht ja für einige Befehle länger als 1 Clock cycle. Wenn die nächste Instruktion das ergebnis weiterverwendet sollte er also warten.

Wird dies automatisch getan oder fügt der Compiler NOP (non operation instructions) ein oder muss man dies selbst tun?
Wenn ja kennt hier jemand eine Seite, wo die alle clock cycles für alle assemblerbefehle aufgelistet sind?

Vielen Dank schon einmal!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 30.03.05 19:17 
fast alle assembler befehle brauchen mehr als einne takt
z.b. braucht glaub ich nen cmp reg, reg 7 takte
aber der prozessor führ immer den gesamten befehl aus nicht immer nur einen takt

hab anenr uni nen buch gefudnen wo alle drinstehen aber im inet hab cih das noch net gesehen
aber was willst du überhaupt machen?

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Allesquarks Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 30.03.05 19:54 
Schreibe an einem Taschenrechner.
Plane Zahlen beliebig genau zu berechnen. Dazu muss ich aber die Verwaltung der Zahlen selbst übernehmen, da Delphi leider gerne selbst eingreift. Gibt Zahlen z.B. 43538E89 zurück. Dann sind aber 85 stellen verlorengegangen.

Deshalb müsste ich wissen, ob der Prozessor weiterrechnet wenn die FPU aktiv ist, oder anhält. Entsprechendes gilt für imul (integermultiplikation), wenn das Ergebnis noch nicht vorliegt könnte man mit der CPU ja entweder auf das Ergebnis warten oder aber andere Schritte ausführen, die das Ergebnis nicht brauchen.

Da zweiteres performancetechnisch viel sinnvoller wäre würde ich sagen, dass ich nops einfügen muss. Aber der Delphi-Compiler erkennt ja auch belanglosen Code, so dass es ja auch möglich wäre, dass er erkennt ob man das Resultat braucht und den Assemblercode entsprechend angepasst compiliert.

Im speziellen brauche ich dafür eigentlich nur die Ausführungslänge derarithmetischen Grundoperationen auf FPU, CPU sowie FPush, Fpop etc..
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Mi 30.03.05 20:02 
Abgesehen davon, dass dir mal eine intensive Auseinandersetzung mit Rechnerarchitektur allgemein guttun würde, würde es deinem Verständnis auch schon helfen, wenn du dich mal über die Darstellung von Kommazahlen in einem Rechner informierst: Suche in: Delphi-Forum, Delphi-Library IEEE 754, Suche in: Delphi-Forum, Delphi-Library GLEITKOMMA* ;)

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Allesquarks Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 30.03.05 20:19 
Nicht bös gemeint aber ich glaube du hast mich missverstnden. Ich weiß recht gut wie der Computer von innen aussieht, weiß auch wie ich das implementieren muss, weiß bloß wenig über Delphi.

Weiß nicht ob ich uall@ogc richtig verstanden hab, dass der Prozessor sowieso immer auf die Berechnungsbeendigung wartet. Dann wäre alles paletti!

Wenn es aber anders geht wäre es nur um einiges schneller und speziell bei dieser Anwendung von Vorteil. Und um dich zu beruhigen. Habe schon etliche Internetseiten über Computerarchitektur gewälzt plus Bücher. Bloß leider behal#ndeln die das Thema Befehle eigentlich immer nur qualitativ.
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Mi 30.03.05 20:49 
Nun, es macht halt den Eindruck, dass du nicht wirklich weißt, wie Gleitkommazahlen dargestellt werden.

Die Sache ist nur die, dass immer nur ein Befehl gleichzeitig abgearbeitet wird, egal, wie viele Takte der braucht, egal, ob er in der ALU, FPU oder sonstwo abgearbeitet wird. Während dieser Zeit mag die CPU zwar Sachen wie OpCode-Prefetching durchführen, darauf hast du als Programmierer aber keinen Einfluss.

Und selbst wenn es da eine Möglichkeit gäbe, wäre es äußerst unwahrscheinlich, dass du das mit einem Windows-Programm im User-Mode schaffst.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 30.03.05 21:34 
Ja, du hast uall richtig verstanden: Die CPU wartet auf die Beendigung der vorherigen Befehle.

Allerdings gibt es dort einige Ausnahmen, die mit
1. Prefetching
2. Befehlstypen zu tun haben
3. Der verarbeitenden Einheit \ Folgebefehl zu tun haben.

Allerdings hast Du auf 1 keinen Einfluss, die BEfehle von 2 darf man im Realmode nicht ausführen und alles was in 3 rein fällt, kümmert sich die CPU drum.

Von daher kannst Du diesen ganzen Zusatz hier vergessen und dir den ersten Satz dieses Postings merken.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 30.03.05 22:05 
Die CPU berechnen schon mal Sachen parallel, obwohl sie seriell im Maschinencode stehen. Es gibt auch kompliziertere Sachen wie Branch Prediction: Bei einer Verzweigung im Code wählt die CPU einen der beiden Wege aus und rechnet schon mal voraus. Falls der Prozessor den falschen Weg getippt hat macht er das dann wieder rückgängig. Fast noch unglaublicher: Die CISC Befehle, also der normale Maschinencode, wird intern in RISC umgewandelt, weil dieser besser parallel ausgeführt werden kann. Der Maschinencode wird also zuerst in eine interne vereinfachte Sprache übersetzt und dann erst ausgeführt ;)
Aber das muss man alles gar nicht wissen, da man nichts davon mitbekommt. Einzig bei der FPU, da muss man vor Speicherzugriffen ein wait machen. Das liegt, wenn ich mich nicht täusche, daran, dass die FPU keinen direkten Zugriff auf die CPU hat (früher war der Co-Prozessor noch ein separater Chip).

user profile iconAllesquarks hat folgendes geschrieben:
Dann sind aber 85 stellen verlorengegangen.

Äh, 85 Stellen??
Die E-Notation wird von floattostr generiert und hat mir der Floatingpointzahl an sich nicht viel zu tun. Die Floatingpointzahl hat immer eine Mantisse + Exponent. Eine 4 wird intern als 1*2^2 gespeichert, von floattostr aber als "4" dargestellt.
Man hat bei einer Floatingpointzahl immer gleich viele Nachkommastellen, deswegen auch der Name Gleitkommazahl (Man gibt die Zahl + die Position des Kommas an...)
Wenn du mit 85 Nachkommastellen rechnen willst, wirst du dein eigenes Format und eigene Rechenroutinen schreiben müssen.
Allesquarks Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Mi 30.03.05 22:10 
genau dieses eigene Zahlenformat schreibe ich ja. Dann natürlich binär direkt mit mantisse und exponent. Ist wirklich mit strtofloat. Hab das mit dem E geschrieben, weil das meinen Plotter immer zum Absturz bringt. Ändert aber nichts, dass auch bei extended die mantisse nicht die STellenanzahl hat, die der Exponent erlauben würde hab das Beispiel halt nur dezimal gemacht.

Jedenfalls danke für eure Erklärungen haben sehr geholfen.