Taktzyklus beim Prozessor?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

1/Taktfrequenz ist die Länge eines Taktzykluses. (Es gibt als Frequenz Taktzyklen je Sekunde)

Und in der Regel meint man bei einer CPU den zentralen Takt, wenn man über OPs der ISA spricht.

Die CPU bekommt im allgemeinen kein Feedback, sie geht davon aus, daß die Operation eben in einer gewissen Zeitspanne erfolgreich erledigt wurde. Entsprechend wird dann eben auch z.B. zum richtigen Zeitpunkt gelatcht. Alles andere wäre etwas unschön.

----

Speicherzugriffe sind insofern interessant, weil sie über den Speichercontroller ausgeführt werden, wie andere bereits schrieben. Natürlich asynchron und der Speichercontroller meldet sich, wenn die Daten verfügbar sind.

Und ein Speicherzugriff dauert erheblich länger als 3 Zyklen.


Usedefault 
Fragesteller
 15.08.2020, 22:24

Was ist dann der zentrale Takt?

0
Usedefault 
Fragesteller
 15.08.2020, 22:35
@KarlRanseierIII

Ja aber wenn ich eine "schnelle" CPU habe mit gleich vielen Takten pro Befehl, dann führt die mehr Takte aus pro Zeit? Aber was genau ist ein Takt? Gilt jeder einzelne Registerladebefehl usw. als Takt?

0
Usedefault 
Fragesteller
 16.08.2020, 00:44
@KarlRanseierIII

Das heißt die CPU geht einfach auf gut glück davon aus, dass z. b. die Berechnung in der ALU schon durchgeführt wurde?

Und weiß nur ich hole mir nach 3 Takten meinen Wert von dem ALU Ausgang?

Und wann die 3 Takte um sind erfährt die CPU vom Taktquarz?

Das klingt alles äußerst instabil, weil was wenn irgendwas dann doch länger braucht?

0
KarlRanseierIII  16.08.2020, 00:55
@Usedefault

Deswegen machst Du ja einen Entwurf sichtest und eleminierst/kürzt kritische Pfade etc. .

Nehmen wir mal an, mein Addiernetz habe eien Signallaufzeit von x, ferner sei der Takt meiner CPU 0.6x - dann weiß ich eben, daß nach 2 Takten mein Addiernetz fertig ist und die Werte am Ausgang stabil sind.

Das ist alles kein Hexenwerk.

0
Usedefault 
Fragesteller
 16.08.2020, 01:11
@KarlRanseierIII

Das heißt die CPU lädt 2 Werte in die Eingänge von dem Addiernetz (=ALU)?

Dann vergehen sagen wir 0,5ns bzw. 1 Takt am Taktquarz? Und da macht CPU noch nichts, weil die weiß die Zahl steht erst nach 1ns also nach 2 Takten bereit?

Und dann im 3. Takt (was eine Zeiteinheit ist eigentlich) ladet sie das Ergebnis wo hin.

Und um schneller zu sein, müssen die Arbeitsschritte schneller ausgeführt werden.

Und Arbeitsschritt kann alles sein, wie addieren, multiplitzieren, RAM Zugriff oder Register beladen und hängt z. B. davon ab wie schnell die Transistoren schalten und welche Kapazitäten befüllt werden müssen bevor Strom fließt?

Dann gibt 3 GHz Prozessor an das 3 Mrd. "Arbeitsschritte" pro Sekunde ausgeführt werden können, ohne zu definieren welche? Weil manche länger brauchen oder kürzer oder parallel bearbeitet werden können, wenn der Bus frei ist z. b.?

0
KarlRanseierIII  16.08.2020, 01:25
@Usedefault

Richtig, die Taktrate ist nur ein Baustein, die Implementierung der uArch ein weiterer.

Addiernetz ist ein Teil der ALU, prinzipiell könnte ich z.B: parallel andere Teile nutzen, wie nen Shifter, oder oder. Bei modernen CPUs ist das ganze etwas komplizierter, die haben keine einfache ALU mehr.

Im Endeffekt versucht man so viel wie möglich zu parallelisieren.

0
Usedefault 
Fragesteller
 16.08.2020, 02:00
@KarlRanseierIII

Also ist der Taktquarz eine zeitliche "Orientierungshilfe" für die CPU um zu wissen, wann es weitergeht?

Und die Aussage 3 GHz Prozessor quasi ein Maximumwert, der davon abhängt was überhaupt gemacht werden soll und was parallel geht?

0
KarlRanseierIII  16.08.2020, 02:12
@Usedefault

Naja, ein Takt ist ein Takt - Man könnte meinen, Du hast noch nie etwas von Musik gehört.

Der Takt gibt schlichtweg vor, wann bestimmte Dinge passieren, nicht mehr und nicht weniger.

0
Usedefault 
Fragesteller
 16.08.2020, 02:32
@KarlRanseierIII

Was ist dann mit dem Übertakten gemeint? Dass ich den Takterzeuger auf schneller drehe und dafür das Risiko in Kauf nehme, dass gewisse Operation eben noch nicht ausgeführt wurden u. a. weil z. B. bei Hitze ein Transistor länger braucht oder so?

Ist meine Annahme 3 GHz sei eine oberflächliche Kennzahl korrekt weil es nicht angibt was da in der Zeit gemacht wird?

0
Usedefault 
Fragesteller
 16.08.2020, 02:36
@Usedefault

Gibt wenn die zweite Zahl 2 GHz ist also der äußere Takt, das bloß an, dass ein 2 Mrd. RAM Zugriffe pro Sekunde ausgefuehrt werden können?

0
KarlRanseierIII  16.08.2020, 02:56
@Usedefault

Ja, genau das, ich schraube über die vom Hersteller angegebene Grenze, bei der alles reibungslos bei Tests klappte, und hoffe es bleibt stabil.

Und ja, die Frequnz gibt nur an, wie häufig 'Schaltzustände' geändert werden, was aber in diesem Zeitabschnitt genau passiert, hängt von der Implementierung ab.

Einfaches Beispiel: Ich kann in jedem Taktschritt ein Bit addieren, indem ich über die Operanden shifte. Somit benötige ich n Takte für n-Bit zahlen (Und lediglich ein 1-Bit Addierer).

Oder:

Ich addiere alle Bits zeitgleich, muß aber zusehen, daß der Übertrag berücksichtigt wird (stelle Dir schriftliches addieren vor). Ich reiche den Übertrag durch (Carry Ripple) - meine Addition ist also fertig, sobald sich das Carry durchs gesamte Netz fortgepflanzt hat. Das geht schneller als die vorige serielle Variante.

Ich kann auch z.B. sagen, ich schaffe 1 Byte je Taktzyklus, dann könnte ich mit einem 8-Bit Addierer arbeiten und z.B. binnen 4 Takten 32 Bits addieren.

Oder, oder oder

D.h. die 'Implementierung' definiert, wie schnell eine Operation fertig ist, und somit wieviel Takte sie braucht.

0
Usedefault 
Fragesteller
 16.08.2020, 14:37
@KarlRanseierIII

In einem YouTube Video haben von innerem und äußerem Takt geredet.

Wie ist das eigentlich mit dem ausführen von Maschinenworten?

Also angenommen mein Programm macht einen JMP dann setzt es EIP auf die neue Adresse und als nächsten wir der Maschinenbefehl decodiert.

Aber woher weiß die CPU wie lang das Maschinenwort ist? Oder haben alle Befehle immer 32 Bit? Oder gibt es Befehle die nur 2 Bytes lang sind wie eben JMP eax? Also woher weiß die CPU dass der Befehl zu Ende ist? Weil es könnte auch stehen JMP ADRESSE was 5 Bytes wären, was jetzt am OpCode ja nicht zu erkennen ist?

Oder ist 4 Byte die maximale Länge die ein Maschinenbefehl haben kann? Wodurch dieser auch 4 Bytes im RAM braucht und sich über 4 Adressen erstreckt?

Und am Rande: Kann man davon ausgehen wenn ein OpCode ein Byte hat wie E9 für Call, dass es dann 256 OpCodes gibt? Entspricht die Anzahl der OpCodes zugleich dem Befehlssatz der CPU?

0
KarlRanseierIII  16.08.2020, 22:36
@Usedefault

Implementierungsabhängig. Meist haben die Opcodes fixe Länge, ein prominentes Gegenbeispiel ist Thumb.

Wenn wir 8-Bit Opcodes haben, dann gibt es natürlich maximal 256 verschiedene Befehle in der ISA.

Und der Befehlsdekoder weiß nach einlesen des Opcodes, wieviele Parameter (und welche Breite sie besitzen) noch folgen.

0
Usedefault 
Fragesteller
 17.08.2020, 00:55
@KarlRanseierIII

Das heißt es ist nicht festgelegt, dass jeder Befehl immer 32 bit hat sondern ein Befehl kann auf 2 Byte haben und der Prozessor erkennt die Größe am Op Code?

Bedeutet ISA dass es sich um x86 handelt?

Ist der Befehlssatz gleich mit der Anzahl OpCodes?

0
Usedefault 
Fragesteller
 17.08.2020, 15:03
@KarlRanseierIII

Was meinen die eigentlich mit die Adresse die gespeichert werden soll ist auf PC+1?

Zeigt der PC auf genau 1 Byte als einen OpCode? Und beim dekodieren wird implizit dann über PC+1 die folgende Speicherzelle angesprochen?

Der EIP zeigt also eigentlich auch immer auf ein Byte oder noch genauer auf 1 Bit?

Ist EIP und PC dasselbe?

Und:

Bedeutet Befehlssatz jetzt diese 256 OpCodes? Kann der Prozessor quasi nichts außer diese 256 Befehle ausführen und somit jedes Programm mal nur aus diesen 256 Befehlen implentiert sein?

0
KarlRanseierIII  17.08.2020, 15:51
@Usedefault

Der EIP zeigt immer auf eine Adresse - Speicher ist byteweise adressierbar. Je nach Architektur muß der PC 'aligned' sein (dann gibt es ein entsprechendes Contraint).

Bei x86 haben Opcodes verschiedene Länge.

Wäre nur 1 BYte der Opcode, dann gäbe es nur 256 verschiedene Befehle.

Und ja, kleinere CPUs haben deutlich weniger verschiedene Opcodes (wobei man darüber diskutieren muß, ob verschiedene Varianten eines BEfehls getrennt gezählt werden sollen/müssen.

0
Usedefault 
Fragesteller
 17.08.2020, 17:22
@KarlRanseierIII

1.) Also ist der EIP dasselbe wie PC?

2.) Byte adressiert heißt, dass ich immer nur 8 Bit aufeinmal ansprechen bzw. laden aber nicht ein einzelnes bit?

3.) Wenn die Befehle unterschiedlich lang sind und das Befehlsregister eine Größe von 32 Bit hat, dann werden einfach z. B. nur 16 Bitlines vom BUS verwendet und der Rest ist das waa vorher dort war, weil es nicht relevant iat für die CPU?

4.) Entspricht der Befehlssatz nun allen OpCodes und damit allem was die CPU ohne Schnittstellen machen kann?

Wobei gewisse Befehle nur das System ausführen kann, wegen Systembit?

Haben die Intels quasi alle denselben Befehlssatz, nur ist Hardware anders gestaltet?

0
KarlRanseierIII  17.08.2020, 17:45
@Usedefault

EIP ist ein Register, Instruction Pointer bzw. Programm Counter sind abstrakte Begriffe.

2) Ja, es kann nur auf Bytebene adressiert und geholt werden -je nach Arch kann ein Fetch aber auch auf Worte beschränkt sein

3) Das Register hat mit dem Bus erstmal nichts zu tun. Was ins Befehlsregister geholt wird und wie legt die Implementierung fest. Im übrigen ist der OPCODE immer nur ein Teil des Befehls.

4) Die Summe aller Opcodes ist der Befehlssatz. Schnittstellen sind ein anderes Themengebiet - Ohne Schnittstelle kann die CPU aber nichtmal einen Befehl holen, das sollte klar sein.

-----

Wenn Du Fragen zu einer spezifischen ISA hast, dann lies deren Dokumentation, dafür ist sie da.

Und nein, selbst die x86 CPUs eines Herstellers haben unterschiedliche Befehlssätze, wobei die neueren abwärtskompatibel sind.

Bei x86 bestehen alle Befehle aus optionalem Prefix, 1-2 Bytes Opcode, 1 Byte mode/reg, optionalem Scale Index Byte, 0-4 Bytes displacement und 0-4 Bytes für immediates.

Es nennt sich nicht umsonst CISC.

0
Usedefault 
Fragesteller
 17.08.2020, 17:53
@KarlRanseierIII

Also ist der EIP die "Repräsentation" des Programmcounters? Und sobald der nächste OpCode dekodiert wird, steigt PC um 1 und damit EIP um 1? Bzw. der PC um 1 und der EIP um soviel Bytes wie der Befehl lang war? Oder wie hängt das zusammen?

Weil wenn der Befehl auf einer Speicherzelle anfangend 4 Bytes lang ist, dann muss der PC ja um 4 Bytes erhöht werden?

Und warum heißt das Counter wenn es ein Pointer ist?

0
KarlRanseierIII  17.08.2020, 19:58
@Usedefault

Siehe den PC als abstraktes Kontrukt. Der wird mit jedem Befehl um 1 erhöht. Ende.

EIP ist ein Register, das im Endeffekt die Adresse des Befehls enthält (also eine Referenz). Um wieviel die Adresse erhöht wird, hängt in letzter Konsequenz vom Befehl ab.

0
Usedefault 
Fragesteller
 17.08.2020, 21:42
@KarlRanseierIII

Und warum greifen die in der Vorlesung die ich heute auf Youtube geschaut habe über PC+1 auf das zu, was über der Adresse vom PC steht? Interessiert das nur die CPU was mit dem PC ist, weil das beim Dekodieren oder so gebraucht wird?

Zeigt der EIP dann also immer vor einen OpCode? Und nie auf etwas anderes, wie das was dann in einen Register geschrieben wird?

Während der PC auf alles zeigt, weil bei ASM Befehl alles gemeint ist was die CPU dann in Folge tut, während bei PC Befehl auch jeder Schritt gemeint ist der hierbei von der CPU implizit azsgeführt wird?

Wenn die CPU den nächsten Befehl im Programm einliest, nimmt die dann zuerst den OpCode und dann sagen wir 16 buffer Bits? Weil wenn das nicht fedtgelegt ist könnte es ja sein dass schon der nächste Befehl miteingelesen wird?

Und: Bedeutet Addressieren soviel wie ein Byte an eine bestimmte Stelle schreiben? Wobei Stelle sein kann: RAM oder Register?

0
KarlRanseierIII  17.08.2020, 21:57
@Usedefault

Kenne ich den Inhalt der Vorlesung?

EIP zeigt immer auf den nächsten Befehl.

Wie Hersteller X die x86 implementiert hat, weiß nur der Hersteller.

Adressieren beudetet die Quelle/das Ziel angeben.

0
Usedefault 
Fragesteller
 17.08.2020, 22:46
@KarlRanseierIII

https://youtu.be/Lbwnb9DXBpI

Da schreibens immer PC+1?

Interessiert den ASM Programmierer der PC überhaupt oder ist das etwas damit sich die CPU auskennt beim Befehl dekodieren?

Also ändert ein Callbefehl oder Jump implizit den EIP?

Ich dachte x86 ist was von Intel?

0
KarlRanseierIII  17.08.2020, 23:11
@Usedefault

x86 war originär von Intel. AMD hat allerdings auch einiges beigesteuert.

Naja, der Callbefehl hat ja eine Adresse (oder von mir aus nen Symbol) .. daraus wird dann der Opcode + Operand generiert und die CPU ändert dann den EIP entsprechend. Explizit kann ich EIP gar nicht manipulieren - man könnte jetzt diskutieren, ob ein JMP eine explizite Änderung ist, aber unter explizit würde ich ein MOV EIP, <addr> verstehen. Und das sollte (hoffentlich) auf keiner Architektur gehen, nur das Steuerwerk sollte EIP ändern können.

Ein JMP ist also eine Anweisung, die das Steuerwerk dazu veranlasst den eigenen inneren Zustand (durch Aktualisierung von EIP) zu ändern.

Würde ich keine symbolischen Werte nutzen, dann interessiert es mich insofern, als daß ich ggf. schreiben würde: JMP EIP+<offset>. D.h. wenn ich relativ adressiere.

Nein, ich schaue mir jetzt kein youtube video an.

0
Also nach welchen Bedingungen zählt man 1 Taktzyklus? Ist das eine konstante Zeit die mit dem Taktquarz zu tun hat?

Mehr oder weniger, moderne CPU können Ihre Taktfrequenz anpassen. Ein Taktzyklus ist dabei die Zeit eines Takt. Bekannter dürfte den Meisten die Taktfrequenz sein, z.B. 3,6 Ghz heißt es sind 3.600.000.000 Taktzyklen pro Sekunde. Zu beachten ist, das moderne CPU gleich mehrere Takte haben, so ist insbesondere der Speicher separat getaktet.

Also wie bekommt die CPU Feedback ob etwas schon ausgefühet wurde und die nächste Sequenz ausgeführt werden kann?

In den meisten Fällen bekommt die CPU kein Feedback, sondern weiß wieviel Takte sie jeweils braucht. Beim Lesen aus den Speicher ist es aber in der Tat etwas komplizierter, da die Zeit stark variieren kann. Hierfür gibt es einen separaten Memorycontroler, der sich aber auch auf der CPU befindet. Der RAM selbst hat wiederum festgelegte Timings.

Woher ich das weiß:Berufserfahrung

Usedefault 
Fragesteller
 15.08.2020, 21:20

Ja und was gilt es jetzt als Takt? Oder ist Takt wirklich nur eine statische Zeitangabe?

Bzw. was gilt als Operation die in die Frequenz mitreinfließt? Weil wenn durch geschicktes Timing Sachen parallel ausgefuehrt werden steigen ja auch die Operationen pro Zeit?

Und ist jetzt das ladet eines Wertes in einen Register schon ein Befehl?

Und der Taktquarz misst was?

Oder was geschieht bei der CPU, dass der Takt um 1 erhöht wird?

0

Die Taktfrequenz (= Taktzyklen pro Sekunde) einer CPU misst man in Gigahertz.

1 Ghz entspricht hierbei 1 Milliarde Zyklen.

Somit ist 1 Taktzyklus so lange wie 1 geteilt durch Taktfrequenz des Prozessors. Also eine konstante Zeit.

Und der Compiler der jeweiligen Sprache teilt die Befehle schon genau so ein, dass die CPU immer zum richtigen Zeitpunkt das richtige macht.

Woher ich das weiß:Studium / Ausbildung – Bachelor in Informatik 👨🏻‍🎓

Usedefault 
Fragesteller
 15.08.2020, 21:24

Also sollte man beim Kompiler immer die Target CPU auswählen oder macht Visual Studio das von alleine?

Und was geschieht auf der CPU um den Takt um 1 zu erhöhen?

0
MrAmazing2  15.08.2020, 21:55
@Usedefault

Wird alles von alleine gemacht, du musst da garnix auswählen oder machen.

Die CPU hat eine Clock, und die sendet abwechselt ein High und Low Signal. Sieht ca. so aus:

https://www.plantation-productions.com/Webster/www.artofasm.com/Windows/HTML/images/SystemOrganization10.gif

Ein "Takt" beginnt wenn ein High kommt, und dauert bis zum nächsten zum nächsten High. Siehe Bild.

Die Clock (sowie die meisten anderen Komponenten auch) wird durch einen 14,318-MHz-Oszillator (also einen "Taktquarz" wie du es nennst) betrieben, dessen Takt durch ein PPL angepasst wird.

Ein Programm hat einen Programm Counter, in dem steht, an welcher Stelle des Codes es gerade ist. Jeden Takt erhöht der sich um 1 (außer bei einem Sprung-Befehl, da wird er komplett neu gesetzt).

Hier noch paar Wiki-Seiten:

https://de.wikipedia.org/wiki/Taktgenerator_(Computer)

https://de.wikipedia.org/wiki/Phasenregelschleife#Frequenzsynthese

https://de.wikipedia.org/wiki/Taktsignal

https://de.wikipedia.org/wiki/Befehlsz%C3%A4hler

0
Usedefault 
Fragesteller
 15.08.2020, 22:32
@MrAmazing2

Der EIP hat mit dem Programmcounter dann aber nur bedingt zu tun?

Weil angenommen der EIP zeigt auf 0x401000 dann führt die CPU das aus, was dort steht.

Und da steht dann mov eax, Adresse

Dann wird um den Befehl auszuführen der Programmcounter z. b. 5 mal erhöht? Wieder auf 0 gesetzt? Und EIP um 1 erhöht oder bei JMP oder CALL komplett geändert?

Und das heißt mov reg, speicherzelle braucht 5 Takte und was anderes könnte 20 Takte brauchen?

Und wann genau wird der Programmcounter erhöht? Quasi immer wenn "irgendwas passiert", wie einen Wert von Register in ALU laden?

Das mit dem High und Low verstehe ich nicht was das mit dem Programm zu tun hat und mit der Taktfrequenz?

Und was ich noch nicht verstehe ist, dass ich dachte Maschinenbefehle sind immer 32 bit lang. Oder ist das dann mit 0 gepaddet? Sodass auf einer 32 bit adresse immer ein 4 byte befehl steht? Wie mov eax, ecx -> 4 Bytebefehl?

Was meinen die mit Win32 Api oder Win64? Bloß dass die virtuellen Adressen aus 4 Byte oder 8 abyte bestehen und sonst nix?

0
MrAmazing2  15.08.2020, 22:54
@Usedefault

Naja, kommt drauf an. Wir haben in der Uni über "Pipelining" gelernt, das ist wie folgt. Da braucht der Prozessor dann z.B. 5 Zyklen um was aus dem Speicher zu holen, und macht währenddessen (also während grad ausm Speicher geholt wird) schon mit den nächsten Befehlen weiter. Diese müssen natürlich komplett unabhängig sein. Die Einteilung der Befehle macht der Compiler. Falls es nichts unabhängiges gibt, wird einfach ein paar Takte lang, bis eben das Ergebnis des Speichers da ist, ausgesetzt (ProgrammCount bleibt da gleich). Der Programm Count wird immer um 1, nicht um 5 oder so. Der zeigt ja nur an, an welcher Stelle im Programm man grad is. Da welche zu überspringen wär fatal. Ausser natürlich bei JMP, ja, da wird er neu gesetzt.

Und das heißt mov reg, speicherzelle braucht 5 Takte und was anderes könnte 20 Takte brauchen?

Jep. Aber in den anderen 4 Takten können meist wegen Pipelining andere Befehle abgearbeitet werden. Wobei das Schreiben in einer Speicherzelle normal eh kein Problem ist, da müssen die Daten nur mal kurz einen Takt anliegen. Und ich kenn jz nich das 20 Takte braucht, aber ja, kann sein.

Und wann genau wird der Programmcounter erhöht? Quasi immer wenn "irgendwas passiert", wie einen Wert von Register in ALU laden?

Der Programmcounter sagt ja nur, an welcher Stelle des Codes man grad ist. Von demher: Ja, der wird nach jedem Befehl erhöht.

Das mit dem High und Low verstehe ich nicht was das mit dem Programm zu tun hat und mit der Taktfrequenz?

Is egal, musst nich verstehen. Denn Sinn haben wir auch nicht gelernt, ist halt einfach so. Wollte dir nurmal zeigen wie so ein Takt aussieht.

Und was ich noch nicht verstehe ist, dass ich dachte Maschinenbefehle sind immer 32 bit lang. Oder ist das dann mit 0 gepaddet? Sodass auf einer 32 bit adresse immer ein 4 byte befehl steht? Wie mov eax, ecx -> 4 Bytebefehl?
Was meinen die mit Win32 Api oder Win64? Bloß dass die virtuellen Adressen aus 4 Byte oder 8 abyte bestehen und sonst nix?

Da kenn ich mich jetzt weniger aus. Aber die Daten- und Adressregister einer modernen CPU haben 64 Bit Bitbreite.

Und jo, ich denke genau das meinen sie. Deshalb kann man 32Bit Programme auf einem 64-bit cpu laufen lassen, aber andersrum nicht. Weil 4 in 8 passt, aber 8 nicht in 4. Ob das sonst noch irgend einen Unterschied macht weiß ich jetzt nicht, wüsste auch nur den mit den Adressbreiten.

0