Zu diesem Zeitpunkt gab mir der Leiter eine Aufgabe zur Überwachung der Perf-Hardware. Während ich Perf verwendete, gab ich die Befehlsleiste ein Ich habe die folgenden Informationen gesehen:
Meine Aufgabe ist es, dafür zu sorgen, dass diese Cache-Ereignisse normal zählen, aber der Schlüssel ist, ich weiß überhaupt nicht, was diese misses
、loads
bedeuten.
Ich weiß nur, dass es sich bei beiden um Caches handelt, aber diese Namen sind sehr ähnlich, was ist der Unterschied?
Aus diesem Grund hielt ich es für notwendig, etwas über Cache zu lernen, und mein Verständnis von Cache, Leistung usw. begann damit.
Das Folgende sind einige grundlegende konzeptionelle Kenntnisse, die ich beim Studium des Caches zusammengefasst habe. Ich glaube, dass sie für Leute hilfreich sein werden, die die zugrunde liegende Ebene oder den Cache nicht verstehen.
Grundsätzlich werde ich jeden in Form von Fragen und Antworten anleiten, da ich es einmal mit vielen Fragen durchgegangen bin.
Zunächst müssen wir wissen, dass die CPU nicht direkt auf den Speicher zugreift, sondern zuerst den Cache durchsuchen muss. Warum?
Ursache: Die Daten in der CPU werden in Registern gespeichert. Die Zugriffsgeschwindigkeit auf Register ist sehr hoch, aber die Registerkapazität ist gering. Die Speicherkapazität ist groß, aber die Geschwindigkeit ist langsam. Um das Problem der Geschwindigkeit und Kapazität zwischen CPU und Speicher zu lösen, wird Cache eingeführt.
Der Cache befindet sich zwischen der CPU und dem Hauptspeicher. Wenn die CPU auf den Hauptspeicher zugreift, greift sie zunächst auf den Cache zu, um festzustellen, ob sich solche Daten im Cache befinden Gibt es an die CPU zurück; wenn sich keine Daten im Cache befinden, und greift dann auf den Hauptspeicher zu.
Im Allgemeinen gibt es nicht nur einen Cache, sondern mehrere, also mehrstufige Caches.
Grund: Der CPU-Zugriffscache ist auch sehr schnell. Wir können jedoch keine vollständige Kompatibilität zwischen Geschwindigkeit und Kapazität erreichen. Wenn die Geschwindigkeit der CPU, die auf den Cache zugreift, der Geschwindigkeit der CPU entspricht, die auf das Register zugreift, bedeutet dies, dass der Cache sehr schnell, die Kapazität jedoch sehr gering ist Eine kleine Cache-Kapazität reicht nicht aus, um unsere Anforderungen zu erfüllen, daher wurde ein mehrstufiger Cache eingeführt.
Mehrstufiger Cache unterteilt den Cache in mehrere Ebenen L1, L2, L3 usw.
In der Reihenfolge der Geschwindigkeit ist die Reihenfolge L1>L2>L3.
Je nach Speicherkapazität ist die Reihenfolge L3>L2>L1.
L1 ist der CPU am nächsten und L3 dem Hauptspeicher am nächsten.
Normalerweise ist L1 in den Befehlscache unterteilt (ICache
)和data cache(DCache
),并且L1 cache是cpu私有的,每个cpu都有一个L1 cache。
命中:CPU要访问的数据在cache中有缓存,称为“命中”,即cache hit
缺失:CPU要访问的数据在cache中没有缓存,称为“缺失”,即cache miss
cache hit
🎜🎜🎜missing🎜: Die Daten, auf die die CPU zugreifen soll, werden nicht im Cache zwischengespeichert heißt „fehlend“, also . cache line
:高速缓存行,将cache平均分成相等的很多块,每一个块大小称之为cache line
。
cache line也是cache和主存之间数据传输的最小单位.
当CPU试图load一个字节数据的时候,如果cache缺失,那么cache控制器会从主存中一次性的load cache line大小的数据到cache中。例如,cache line大小是8字节。CPU即使读取一个byte,在cache缺失后,cache会从主存中load 8字节填充整个cache line。
CPU访问cache时的地址编码,通常由tag、index和offset三部分组成:
tag
(标记域):用于判断cache line缓存的数据的地址是否和处理器寻址地址一致。- index
(索引域):用于索引和查找地址在高速缓存中的哪一行
offset
Cache-Zeile ist auch die kleinste Einheit der Datenübertragung zwischen Cache und Hauptspeicher Wenn die CPU versucht, ein Datenbyte zu laden und der Cache fehlt, lädt der Cache-Controller auf einmal Daten in Cache-Zeilengröße aus dem Hauptspeicher in den Cache. Die Cache-Zeilengröße beträgt beispielsweise 8 Byte. Selbst wenn die CPU ein Byte liest, lädt der Cache nach dem Fehlen des Caches 8 Bytes aus dem Hauptspeicher, um die gesamte Cache-Zeile zu füllen.
tag
(tag field)🎜: wird zur Bestimmung des Cache-Zeilen-Cache verwendet Ob die Adresse der Daten mit der Adressierungsadresse des Prozessors übereinstimmt. 🎜🎜🎜🎜- index
(Indexfeld) 🎜: Wird zum Indizieren und Finden der Zeile im Cache verwendet, in der sich die Adresse befindet 🎜offset
🎜 (offset) 🎜: Offset in der Cache-Zeile. Der Inhalt der Cache-Zeile kann durch Wort oder Byte adressiert werden 🎜🎜🎜🎜Die Beziehung zwischen Cache-Zeile und Tag, Index, Offset usw. ist wie in der Abbildung dargestellt: 🎜Wir wissen, dass die CPU nicht direkt auf den Speicher zugreift, sondern die CPU eine virtuelle Adresse ausgibt, die dann von der MMU in eine physische Adresse umgewandelt wird, und dann werden die Daten entsprechend der physischen Adresse aus dem Speicher abgerufen . Greift der Cache also auf eine virtuelle oder eine physische Adresse zu?
A: Nicht unbedingt. Dabei kann es sich entweder um eine virtuelle Adresse, eine physische Adresse oder eine Kombination aus virtuellen und physischen Adressen handeln.
Weil der Cache über mehrere Organisationsmethoden im Hardware-Design verfügt:
VIVT
Virtueller CacheVIVT
虚拟高速缓存:虚拟地址的index,虚拟地址的tag。PIPT
物理高速缓存:物理地址的index,物理地址的tag。VIPT
物理标记的虚拟高速缓存:虚拟地址的index,物理地址的tag。歧义(homonyms
: der Index der virtuellen Adresse, das Tag der virtuellen Adresse.
VIPT</ Code><strong style=" color: black>Virtueller Cache des physischen Tags 🎜: Index der virtuellen Adresse, Tag der physischen Adresse.
Alias (alias
):多个虚拟地址映射到了相同的物理地址(多个虚拟地址被称为别名)。例如上述VIVT方式就会存在别名问题,那VIVT、PIPT和VIPT那个方式更好呢?
PIPT
其实是比较理想的,因为index和tag都使用了物理地址,软件层面不需要任何维护就能避免歧义和别名问题。
VIPT
的tag使用了物理地址,所以不存在歧义问题,但index是虚拟地址,所以可能也存在别名问题。
而VIVT
: Viele virtuelle Adressen werden derselben physischen Adresse zugeordnet (mehrere virtuelle Adressen werden Aliase genannt). Bei der oben genannten VIVT-Methode tritt beispielsweise ein Alias-Problem auf. Welche Methode ist besser, VIVT, PIPT oder VIPT?
.
Andambiguity and Alias-Probleme bestehen. Tatsächlich wird in der Hardware derzeit grundsätzlich PIPT oder VIPT verwendet. VIVT hat zu viele Probleme, es ist Geschichte geworden und niemand wird es nutzen. Darüber hinaus gibt es die PIVT-Methode nicht, da sie nur Mängel und keine Vorteile aufweist. Sie ist nicht nur langsam, sondern es bestehen auch Mehrdeutigkeits- und Aliasing-Probleme. Die Organisation des Caches sowie Mehrdeutigkeits- und Alias-Probleme sind relativ große Inhaltsteile. Hier müssen Sie nur wissen, dass die Adresse, auf die der Cache zugreift, entweder eine virtuelle Adresse, eine physische Adresse oder eine Kombination aus einer virtuellen Adresse und einer physischen Adresse sein kann. Und unterschiedliche Organisationsmethoden werden Mehrdeutigkeits- und Alias-Probleme haben.
🎜🎜🎜7. Cache-Zuweisungsstrategie? 🎜🎜 🎜🎜🎜🎜 bezieht sich darauf, wie der Cache zugewiesen wird, wenn ein Cache-Fehler auftritt. 🎜🎜Zuordnung lesen: Wenn cache
fehlt, dieses In In allen Fällen ein CPU
读数据时,发生cache
缺失,这种情况下都会分配一个cache line
缓存从主存读取的数据。默认情况下,cache
都支持读分配。
写分配:当CPU写数据发生cache
缺失时,才会考虑写分配策略。当我们不支持写分配的情况下,写指令只会更新主存数据,然后就结束了。当支持写分配的时候,我们首先从主存中加载数据到cache line
中(相当于先做个读分配动作),然后会更新cache line
Standardmäßig ist Schreibzuweisung: tritt auf, wenn die CPU Daten schreibt: rgba(27, 31, 35, 0.05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: break-all ;color: rgb(239, 112, 96);"> Die Schreibzuweisungsstrategie wird nur berücksichtigt, wenn der Cache
fehlt. Wenn wir die Schreibzuweisung nicht unterstützen, aktualisiert der Schreibbefehl nur die Hauptspeicherdaten und endet dann. Wenn die Schreibzuweisung unterstützt wird, laden wir zunächst Daten aus dem Hauptspeicher in Daten in der Cache-Zeile
.
8. Cache-Update-Strategie?
bezieht sich darauf, wie der Schreibvorgang die Daten aktualisieren soll, wenn der Cache erreicht wird.
🎜Passthrough schreiben🎜: Wenn die CPU den Speicherbefehl ausführt und der Cache trifft, aktualisieren wir die Daten im Cache und die Daten im Hauptspeicher. 🎜Die Daten im Cache und im Hauptspeicher sind immer konsistent🎜. 🎜Schreiben Sie zurück : aktualisiert, wenn CPU
执行store
指令并在cache
命中时,我们只更新cache
中的数据。并且每个cache line
中会有一个bit
位记录数据是否被修改过,称之为dirty bit
。我们会将dirty bit
置位。主存中的数据只会在cache line
被替换或者显示的clean
in Betrieb ist. Daher können die Daten im Hauptspeicher unveränderte Daten sein, während die geänderten Daten im Cache liegen . Die Daten im Cache und im Hauptspeicher sind möglicherweise inkonsistent.
Endlich
Über Cache sowie TLB, MESI, Speicherkonsistenzmodell usw. ist es etwas, das Niederschlag und Zusammenfassung erfordert, um es wirklich zu beherrschen.
Aber viele Leute nutzen es möglicherweise nicht. Nur wenn es um Leistungsprobleme geht und Sie die Cache-Trefferquote verbessern müssen, werden Sie wissen, wie wichtig dieses Wissen ist.
In Bezug auf das in diesem Artikel besprochene Wissen habe ich eine Mindmap des Grundwissens zum Cache zusammengefasst:
Das obige ist der detaillierte Inhalt vonNachdem ich dem Unternehmen beigetreten war, verstand ich, was Cache ist.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!