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 ...
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.
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?
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.
_________________ Kilo Byte=1000,Kilobyte=1024 ANSI/IEEE Standard 1084-1986 rapso
-Mod im Spiele-/Grafikprogrammierung|rapsoo@hotmail.com| #dionysos irc.quakenet.org |amazon stole my PS3
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.