Hallo Forum!
Ich habe gehört dass es drei unterschiedliche Speicherklassen gibt:
- Registerobjekte
- Hauptspeicherobjekte
- Cacheobjekte
Diese Speicherklassen würden durch den Compiler beeinflusst werden. Wie kann man diese Speicherklassen grundsätzlich beschreiben und welchen Einfluss haben sie auf die Laufzeit?
Registerobjekte werden sicher in Register der CPU geladen und lassen sich schnell verarbeiten und abrufen. Dazu zählen sicherlich Zählvariablen in Schleifen. Wie ist das eigentlich wenn ich 3 Schleifen ineinander verschachtelt habe (mit 3 Zählvariablen)? Z.b.
Wird dann beim Eintritt in eine untere Schleife die Zählvariable irgendwo zwischengelagert während die Zählvariable der unteren Schleife in das Register geladen wird?
Die Hauptspeicherobjekte finden sicherlich im Hauptspeicher platz. Gibt es da etwas zu beachten was die Laufzeit betrifft? Ich habe gehört, dass es günstig ist, wenn die Zieladresse des Sprungs an den Anfang durch 32 teilbar ist. Warum ist das so?
Ich kann mir noch nicht so richtig vorstellen wie das mit dem Pufferspeicher (Cache) funktioniert. Das ist also ein Zwischenspeicher auf dem schneller zugegriffen werden kann als auf den Hauptspeicher. Es wird immer ein bestimmter Teil geladen (Cacheline?) auf den zugegriffen werden kann. Wird jedoch mehr Cache benötigt, dauert das ganze länger, weil ja erst wieder Cache aus dem Hauptspeicher geholt werden muss. Es gäbe da angeblich soetwas wie prefetching wo man gleich mehr Cache anfordern kann. Wird das vom Compiler erledigt oder kann das der Programmierer z.B. in c selbst übernehmen?
Gibt es für mich eine Möglichkeit festzustellen welche Variablen von meinem Programm welcher Speicherklasse zugeordnet werden? Werden z.B. arrays grundsätzlich als Hauptspeicherobjekte behandelt? Kann ich in der Programmiersprache C darauf Einfluss nehmen welche Variable in den Hauptspeicher kommt oder als Zählvariable in ein Register oder macht das ausschließlich der Compiler?
Nun zu dem zweiten Teil meiner Frage, dem Pipelining. Was gibt es da bei der Programmierung zu beachten? Ich habe z.B. folgenden Quelltext:
Hier hätte der Compiler doch ersteinmal kein Problem mit den Werten von m1. Beispielweise wird m1[0] verändert und es muss auch nicht mehr damit gearbeitet werden. Also kann der Compiler ohne probleme den nächsten Befehl laden. Aber wie ist das mit der Zählvariable a? Diese muss ja immer um 1 erhöht werden und das Ergebnis wird auch gleich wieder benötigt (m1[a]).
Welche grundsätzlichen Möglichkeiten habe ich zur Verfügung in dieser Hinsicht besseren Code zu schreiben?