Wie cache funktioniert?
Heute, als ich in computer Organisation, Klasse, Lehrer Sprach über etwas, das interessant für mich. Wenn es darum geht zu reden, Warum der cache-Speicher funktioniert, er sagte:
for (i=0; i<M; i++)
for(j=0; j<N; j++)
X[i][j] = X[i][j] + K; //X is double(8 bytes)
ist es nicht gut, ändern Sie die erste Zeile mit der zweiten. Was ist Ihre Meinung dazu? Und warum ist es so?
- Dies ist die Dritte grundlegende Hausaufgaben-Typ Frage, die ich gesehen habe von dir in den letzten paar Tagen. Wenn Sie kämpfen, möchten Sie vielleicht mieten Sie einen tutor.
- hey, Mann! dies ist keine Hausaufgabe... ich stolperte über diese in der Klasse! Weil Lehrer Sprach in Chinesisch, ich habe nicht wirklich das bekommen, was er redete. Deshalb möchte ich Sie bitten, alle...
- Allerdings, wenn es Hausaufgaben, ich kann 'Hausaufgaben' tag von mir selbst; wie ich es bei einigen meiner letzten Fragen, bevor...
- Sorry. Hatte nicht die Absicht, Sie zu beleidigen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lokalität der Referenz. Da die Daten gespeichert sind, indem Sie Zeilen für jede Zeile die j-Spalten in den angrenzenden Speicher-Adressen. Das Betriebssystem wird in der Regel das laden einer gesamten Seite aus dem Speicher in den cache und den angrenzenden Adresse verweist, wird wahrscheinlich finden, dass die gleiche Seite. Wenn Sie erhöhen, indem Sie die Zeile index der inneren Schleife ist es möglich, dass diese Zeilen werden auf verschiedenen Seiten (seit Sie getrennt sind von j verdoppelt) und der cache möglicherweise ständig bringen und wegwerfen-Seiten-Speicher, wie es verweist auf die Daten. Dies wird als Prügel und ist schlecht für die performance.
In der Praxis und bei größeren, modernen caches, die Größe der Zeilen/Spalten würde müssen Recht groß vor, dies würde ins Spiel kommen, aber es ist noch immer gute Praxis.
[BEARBEITEN] Die obige Antwort ist spezifisch für C und kann unterschiedlich für andere Sprachen. Die einzige, die ich kenne unterscheidet, ist FORTRAN. FORTRAN speichert Dinge in column major order (die oben ist die Zeile major) und es wäre korrekt, ändern Sie die Reihenfolge der Anweisungen in FORTRAN. Wenn Sie wollen/müssen Effizienz, ist es wichtig zu wissen, wie Ihre Sprache implementiert die Speicherung der Daten.
Es ist ein sehr gutes Papier von Ulrich Drepper von Red Hat und glibc Ruhm, Was Jeder Programmierer Wissen Sollte, Über Das Gedächtnis. Ein Abschnitt erörtert caches im detail. Zum Beispiel, es sind cache-Effekte in SMP-Systemen, wo CPUs kann am Ende Prügel Besitz eines modifizierten cache-Zeile hin und her, stark zu schädigen Leistung.
Ist es so becauses caches wie Lokalität. Die gleiche Anzahl von Speicher zugegriffen, aber räumlich weiter entfernt voneinander, auf verschiedenen "Linien" des cache, oder vielleicht sogar miss der cache insgesamt. Es ist deshalb gut, wenn Sie die Wahl haben, zum organisieren von Daten, so dass Zugriffe, die sind wahrscheinlich in der Nähe, um einander in der Zeit, auch im Raum. Dies erhöht die Wahrscheinlichkeit eines cache-hit, und gibt Ihnen mehr Leistung.
Natürlich gibt es eine fülle von Informationen zu diesem Thema finden Sie zum Beispieldieser wikipedia-Eintrag über die Lokalität der Referenz. Oder, denke ich, Ihren eigenen Kurs-text-Buch. 🙂
C -, n-dimensionale Matrizen Zeilen-Dur, d.h. der Letzte index in der matrix repräsentiert die angrenzenden Räume im Speicher. Dies ist anders als einige andere Sprachen, FORTRAN zum Beispiel, die Spalte major. In FORTRAN ist es effizienter, Durchlaufen ein 2D-matrix wie diese:
Cache-Speicher ist sehr schnell und sehr teuer ist Speicher, der sitzt in der Nähe der CPU. Anstatt Holen ein kleines Stück von Daten aus dem Arbeitsspeicher jedes mal, die CPU holt sich eine Menge Daten und speichert Sie im cache. Die Wette ist, dass, wenn Sie nur Lesen, byte für byte, dann das nächste byte liest du wahrscheinlich Recht, nachdem es. Wenn dies der Fall ist, dann kann es aus dem cache.
Durch das Layout der Schleife, wie Sie es haben, Sie Lesen die bytes in der Reihenfolge, die Sie im Speicher gespeichert werden. Dies bedeutet, dass Sie im cache und können sehr schnell gelesen werden, die durch die CPU. Wenn Sie vertauscht um Linien 1 und 2, dann würden Sie Lesen alle "N" - bytes jedes mal um die Schleife. Die bytes, die Sie Lesen, sind nicht mehr hintereinander im Speicher, und so können Sie nicht in den cache. Hat die CPU zu Holen, Sie von den (langsameren) RAM und so Ihre Leistung sinkt.