[GPU] Optimale Cache-Nutzung bei Texturzugriffen
- Schrompf
- Moderator
- Beiträge: 4854
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
[GPU] Optimale Cache-Nutzung bei Texturzugriffen
Moin,
ich habe ein Shader-Programm, das pro Pixel aus x verschiedenen Rechteck-Bereichen ein- und derselben Textur lesen muss. Mit x == 8 oder höher. Die Einzel-Zugriffe sind relativ zu den Nachbarpixeln schön kontinuierlich, aber die Texturzugriffe innerhalb einer Ausführung des Shaderprogramms sind quer über die ganze Textur gestreut.
Meine Frage nun: könnte es sich lohnen, die selbe Textur an x Sampler Stages zu binden und jeden Texturzugriff über seine spezifische Sampler Stage durchzuführen? Falls jede Stage ihren eigenen Cache hat, könnte man damit die Cache-Lokalität drastisch verbessern. Die Whitepaper zu den aktuellen GPU-Architekturen lesen sich aber so, als hätte ein Threadblock nur einen einzigen L1-Cache, wodurch das ganze Manöver eh für die Katz wäre.
Ausprobieren kann ich das Ganze leider nicht so einfach, weil ich hier auf meinem Rechner immer CPU-limitiert bin. Ich wäre an euren Gedanken und Ideen interessiert, ob und wie ich das auch auf kleineren oder Laptop-GPUs optimieren könnte.
ich habe ein Shader-Programm, das pro Pixel aus x verschiedenen Rechteck-Bereichen ein- und derselben Textur lesen muss. Mit x == 8 oder höher. Die Einzel-Zugriffe sind relativ zu den Nachbarpixeln schön kontinuierlich, aber die Texturzugriffe innerhalb einer Ausführung des Shaderprogramms sind quer über die ganze Textur gestreut.
Meine Frage nun: könnte es sich lohnen, die selbe Textur an x Sampler Stages zu binden und jeden Texturzugriff über seine spezifische Sampler Stage durchzuführen? Falls jede Stage ihren eigenen Cache hat, könnte man damit die Cache-Lokalität drastisch verbessern. Die Whitepaper zu den aktuellen GPU-Architekturen lesen sich aber so, als hätte ein Threadblock nur einen einzigen L1-Cache, wodurch das ganze Manöver eh für die Katz wäre.
Ausprobieren kann ich das Ganze leider nicht so einfach, weil ich hier auf meinem Rechner immer CPU-limitiert bin. Ich wäre an euren Gedanken und Ideen interessiert, ob und wie ich das auch auf kleineren oder Laptop-GPUs optimieren könnte.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Zumindest bei NVIDIA hast du einen Texture Cache pro Multiprozessor. Ich würde mal vermuten, dass es keinen Unterschied machen wird, insbesondere da du mit x = 8 und 4 Byte pro Pixel wunderbar in eine 32 Byte Cache Line passt (Kompression mal außen vor)...
Aber who knows...es wäre wohl auf jeden Fall ein interessantes Experiment... ;)
Wer weiß, wie das Ganze bei Intel oder gar auf mobilen GPUs ausschaut, möglicherweise könnte es dort was bringen. NVIDIA Flaggschiff Desktop GPUs sind vielleicht nicht die Art von Architektur, auf der man seine Überlegungen aufbauen sollte, wenn man für eigentlich die kleinen Geschwister optimieren will, die potentiell grundlegend anders arbeiten...
Edit: Ach, das x = 8 bezog sich auf die Anzahl der Rechtecke; dachte du holst 8 Samples pro Rechteck...wie genau samplest du denn innerhalb dieser Rechtecke?
Aber who knows...es wäre wohl auf jeden Fall ein interessantes Experiment... ;)
Wer weiß, wie das Ganze bei Intel oder gar auf mobilen GPUs ausschaut, möglicherweise könnte es dort was bringen. NVIDIA Flaggschiff Desktop GPUs sind vielleicht nicht die Art von Architektur, auf der man seine Überlegungen aufbauen sollte, wenn man für eigentlich die kleinen Geschwister optimieren will, die potentiell grundlegend anders arbeiten...
Edit: Ach, das x = 8 bezog sich auf die Anzahl der Rechtecke; dachte du holst 8 Samples pro Rechteck...wie genau samplest du denn innerhalb dieser Rechtecke?
- Schrompf
- Moderator
- Beiträge: 4854
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Es ist eine Art Texturatlas, bestehend aus 8+ Quadraten von jeweils 200 bis 400 Pixeln Größe auf einer gemeinsamen Textur. Und im FragmentShader lese ich einen Texel aus jedem der 8+ Quadrate entlang der projezierten Primitive. Ich wende quasi 8+ separate ShadowMaps an, die Texturzugriffe pro Quadrat sind also schön kontinuierlich.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Ok, ich würde mal vermuten, dass es nix bringen wird; aber sicher weiß man es natürlich immer erst, wenn man es ausprobiert hat... :P
- B.G.Michi
- Establishment
- Beiträge: 163
- Registriert: 07.03.2006, 20:38
- Alter Benutzername: B.G.Michi
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Sowas halte ich für riskant. Ich bin sicher kein Experte aber da klingt schon ziemlich Hersteller- und Architekturspezifisch. Angenommen du holst 10% auf einer speziellen GPU raus, sobald du auf die nächste Architektur schaust oder der Hersteller im Treiber was rumspielt, fliegt dir die Optimierung um die Ohren und du bist bei -20%...
-
- Moderator
- Beiträge: 2112
- Registriert: 25.02.2009, 13:37
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Kannst du die Textur so speichern dass das Zugriffsmuster kontinuierlich wird?
- Schrompf
- Moderator
- Beiträge: 4854
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Nein. Wie gesagt, es sind ein Rudel Shadow Maps, die ich für die Nachverarbeitung auf einem Texturatlas gesammelt habe. Die kann man nicht einfach so interleaven.
Aber ich hätte alle auf einzelnen Texturen lassen können. Wär ne ziemliche Verschwendung gewesen, für jedes einzelne Licht die Maximalgröße zu reservieren, aber dafür hat man dann ein hübsches Array an Texturen. Und solange die Sampler reichen, kann man aus denen dann immer hübsch kontinuierlich cache-freundlich lesen.
Aber ich hätte alle auf einzelnen Texturen lassen können. Wär ne ziemliche Verschwendung gewesen, für jedes einzelne Licht die Maximalgröße zu reservieren, aber dafür hat man dann ein hübsches Array an Texturen. Und solange die Sampler reichen, kann man aus denen dann immer hübsch kontinuierlich cache-freundlich lesen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Das hätte vermutlich sogar negative Auswirkungen auf die Performance, da Texturen auf der Grafikkarte bereits so im Speicher ausgelegt werden, dass lokal benachbarte Texel auch an nicht weit voneinander entfernten Speicheradressen liegen (http://en.wikipedia.org/wiki/Z-order_curve). ;)Alexander Kornrumpf hat geschrieben:Kannst du die Textur so speichern dass das Zugriffsmuster kontinuierlich wird?
- Krishty
- Establishment
- Beiträge: 8238
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [GPU] Optimale Cache-Nutzung bei Texturzugriffen
Die nächste Architektur bringt aber dafür 50 % mehr Rechenleistung, da gleicht es sich dann aus.B.G.Michi hat geschrieben:Sowas halte ich für riskant. Ich bin sicher kein Experte aber da klingt schon ziemlich Hersteller- und Architekturspezifisch. Angenommen du holst 10% auf einer speziellen GPU raus, sobald du auf die nächste Architektur schaust oder der Hersteller im Treiber was rumspielt, fliegt dir die Optimierung um die Ohren und du bist bei -20%...
Im Kern ist es aber richtig: Man sollte immer auf AMD und Nvidia parallel testen; sonst ist es irgendwann auf der einen Architektur zehn Mal langsamer. Kommentar aus meinem FFT-Glare-Quelltext:
has proven to be slightly faster (5 %) on AMD GPUs, it also takes thrice the time to compile and performs 13.8 % worse on Nvidia GPUs.