Explizites Cache Prefetch (?)
-
Hat hier jemand auf x86 schon mal mit expliziten "cache prefetch"s gearbeitet? so, wie ich das verstanden habe, soll es möglich sein, dem CPU cache schon mal "vorzuwarnen", was als nächstes angefordert werden könnte. Wenn das jemand schon ausprobiert hat, könnte er sich ja mal hier melden und ein paar Tipps geben.
Ich habe hier im Moment mit relativ einfachen aber speicherintensiven Berechnungen zu tun und konnte entweder die Speicherbandbreite oder die Cache Misses als Bremse ausmachen. Darauf hin habe ich das Layout meiner Daten im Speicher optimiert und Schleifen entsprechend in ihrer Schachtelung umsortiert, so dass Speicherzugriffe möglichst linear (aufeinanderfolgende Adresse) erfolgen. Das hat schonmal etwa den Faktor 3 in der Geschwindigkeit ausgemacht. Ich würde jetzt noch gerne testen, ob "explizites prefetch" etwas bringt -- am liebsten als Inline-Assembler für'n GCC. Nur sowas hab ich noch nie gemacht ... :p
TIA,
kk
-
Habe gerade das hier gefunden:
http://gcc.gnu.org/projects/prefetch.html
(bin noch am Lesen, scheint aber interessant zu sein)
-
Cache Prefetching bringt es tatsächlich, allerdings sollte man das einige Takte vor dem eigentlich Datenzugriff tun.
Falls du Ergebnisse "abspeichern" willst, die nicht mehr benötigt werden, würde ich noch "uncached memory write back" und "cache-pollution" als Thema empfehlen.
-
nurf schrieb:
Falls du Ergebnisse "abspeichern" willst, die nicht mehr benötigt werden, würde ich noch "uncached memory write back"
Das klingt gut. Ja, die Ergebnisse schreibe ich in ein riesiges Array linear rein -- Element für Element. Davon muss eigentlich nichts im Cache bleiben (passt eh nicht rein, da es typischerweise mehrere Hunderte von Megabytes sind).
nurf schrieb:
und "cache-pollution" als Thema empfehlen.
Ich denke, ich weiß, was Du damit meinst. Man sollte vermeiden, dass "unnütze" Daten im Cache landen und damit andere "wichtige" Daten aus dem Cache verdrängt werden.
Wie es aussieht, scheinen die "cache managemant instructions" aus der SSE/3Dnow Ecke zu kommen. Hat da jemand nen Tipp für ne nette Befehlsreferenz, die von einem "SIMD-Anfänger" verstanden werden kann?
kk
-
Assembler muss man (beim GCC zumindest) nicht dafür benutzen. Es gibt da nämlich seit GCC 3.1.1 (falls ich das richtig sehe), die Builtin-Funktion
__builtin_prefetch
.
-
allerdings haben neuere CPUs alle auch automatisches prefetching, man sollte also genau wissen was man macht, sonst koennte es langsammer werden.