PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [S] Informationen über Texturspeicher Layout und Texture Cache


ScottManDeath
2005-06-18, 02:14:33
Ich hatte mal irgendwo gelesen wie die Texturen in Tiles im Videoram gespeichert werden, allerdings hab ich beim googeln und auf der NVIDIA developer Seite alles mögliche gefunden, nur dass nicht. :(

Texturen werden ja in der Regel nicht linear abgespeichert, sondern verwurstelt, so dass z.B. 4 benachbarte Texel (fürs Biliineare filtern) linear hintereinander liegen und so einfach in den Texture Cache geladen werden können.

Gibt es Informationen wie groß der On ChipTexure ist. Insbesondere interessiere ich mich für die genannten Informationen für den NV 40 :)

micki
2005-06-18, 06:12:09
afaik werden sie in kacheln von 16x16 pixel gehalten, bei nvidia liegen dort nur entpackte texturen, also z.b. keine dxt1. es sollen nur ein paar KB sein. wobei ich nicht weiß ob das insgesammt "ein paar KB" sind oder pro texture. ich würde auf ein maximum von 64kb tippen, wahrscheinlich sind es ca 4kb oder 8kb. mehr macht nicht wirklich sinn, da es bei texturen eher selten einen localen reuse gibt. wichtig ist der cache wie du schon sagtest fürs interpolieren und bei distortion effekten wie EMBM.

MfG
micki

ScottManDeath
2005-06-18, 12:31:38
afaik werden sie in kacheln von 16x16 pixel gehalten, bei nvidia liegen dort nur entpackte texturen, also z.b. keine dxt1. es sollen nur ein paar KB sein. wobei ich nicht weiß ob das insgesammt "ein paar KB" sind oder pro texture. ich würde auf ein maximum von 64kb tippen, wahrscheinlich sind es ca 4kb oder 8kb. mehr macht nicht wirklich sinn, da es bei texturen eher selten einen localen reuse gibt. wichtig ist der cache wie du schon sagtest fürs interpolieren und bei distortion effekten wie EMBM.

MfG
micki

Hat das NV irgendwo zum öffentlichen Nachlesen gemacht?

Neomi
2005-06-18, 14:27:06
afaik werden sie in kacheln von 16x16 pixel gehalten, bei nvidia liegen dort nur entpackte texturen, also z.b. keine dxt1. es sollen nur ein paar KB sein. wobei ich nicht weiß ob das insgesammt "ein paar KB" sind oder pro texture. ich würde auf ein maximum von 64kb tippen, wahrscheinlich sind es ca 4kb oder 8kb. mehr macht nicht wirklich sinn, da es bei texturen eher selten einen localen reuse gibt. wichtig ist der cache wie du schon sagtest fürs interpolieren und bei distortion effekten wie EMBM.

Genaue Größenangaben habe ich auch nicht, aber deine Zahlen sind recht realistisch. Es müßten allerdings schon 8 KB pro Texture Stage sein. Ein Block von 16x16 Texeln brauch bei 32 Bit ja exakt 1 KB, bei der Interpolation über Blockgrenzen hinaus kommen bei trilinearer Filterung genau 8 Blöcke zusammen.

Der Vollständigkeit halber noch eine schnelle Skizze vom üblichen Swizzling, also der Reihenfolge der einzelnen Blöcke im Speicher...

http://img17.echo.cx/img17/741/swizzle7nu.gif (http://www.imageshack.us)

Demirug
2005-06-18, 14:34:26
Genaue Größenangeben habe ich auch nicht, aber deine Zahlen sind recht realistisch. Es müßten allerdings schon 8 KB pro Texture Stage sein. Ein Block von 16x16 Texeln brauch bei 32 Bit ja exakt 1 KB, bei der Interpolation über Blockgrenzen hinaus kommen bei trilinearer Filterung genau 8 Blöcke zusammen.

Der Vollständigkeit halber noch eine schnelle Skizze vom üblichen Swizzling, also der Reihenfolge der einzelnen Blöcke im Speicher...

http://img17.echo.cx/img17/741/swizzle7nu.gif (http://www.imageshack.us)

Das Diagramm zeigt nicht die Aufteilung der Daten im Speicher sondern das ist ein Linewalker aus einem der nVidia Chips.

Fragt man nVidia nach der größe des Caches ist die Antwort meist "Kleiner als die meisten denken".

Aktuelle nVidia chips sind so gebaut das im Cache nur eine Texture liegen muss und nicht alle Texturen die für den Pass benötigt werden.

ScottManDeath
2005-06-18, 14:43:04
Ich nutze RGBA fp32 Texturen (macht 16 byte pro texel) und iteriere im Shader (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=228961)dann in x Richtung durch 2 Texturen durch, lesen je einen Texel und addiere dann das Produkt der Differenz auf. Allerdings ist das ganze recht langsam da ich anscheinend nicht den Texture Cache, bzw dessen spatielle Kohärenz, richtig ausnutze. Deswegen würde ich gerne mein Zugriffmuster/Anordnung der Daten in meinen Texturen optimieren, um die Leistung zu erhöhen.

Ich hab durch über/untertakten festgestellt, dass ich Speicherbandbreitenlimitiert bin.

Demirug
2005-06-18, 14:48:25
Kannst du die RGBA FP32 Texture auf 4*R FP32 aufteilen?

Der NV40 mag es lieber wenn man Texturen nur jeweils mit 32 Bit ausliest.

Neomi
2005-06-18, 15:09:43
Das Diagramm zeigt nicht die Aufteilung der Daten im Speicher sondern das ist ein Linewalker aus einem der nVidia Chips.

Das auch, aber so sieht eben auch das performantere Speicherformat für ungepackte Texturen aus. Bei der XBox werden die ungepackten Texturen so abgelegt (wenn man nicht explizit ein lineares Format wählt), beim PC werden sie (zumindest bei nVidia) entsprechend vom Treiber angepaßt (falls keine Flags z.B. für Locking dagegen sprechen).

Xmas
2005-06-18, 15:50:14
Ich hab durch über/untertakten festgestellt, dass ich Speicherbandbreitenlimitiert bin.
Selbst bei optimaler Cache-Ausnutzung bist du bei >= 32bit/Texel fast immer bandbreitenlimitiert (außer Magnification).

NV4x hat einen zweistufigen Cache. Im L1-Cache liegen die Texel unkomprimiert, AFAIK in sehr wenigen 4x4-Blöcken. Im größeren L2-Cache werden DXTC-Texturen noch komprimiert gehalten, hier ist die Blockgröße wahrscheinlich von der Speichergranularität abhängig (z.B. 64bit/Channel mal Burst Length 4).

ScottManDeath
2005-06-18, 21:38:58
Kannst du die RGBA FP32 Texture auf 4*R FP32 aufteilen?

Der NV40 mag es lieber wenn man Texturen nur jeweils mit 32 Bit ausliest.

Jups das würde gehen. Kann man abschätzen wieviel das bringen kann?

Dann mach ich mal aus meinen 2 * 4x FP32 jetzt 8 * 1xFP32. Hab heute schon lang genug am Text schreiben gesessen, jetzt darf ich auch wieder coden ;)


OT:
Mhmm komisch, eigentlich hab ich das Thema abonniert. Hab bis jetze keine mail bekommen, deswegen seh ich das erst jetzt.

ScottManDeath
2005-06-24, 22:31:30
Ich habe von 4 Kanal Texturen auf 1 Kanaltexturen und MRT umgestellt. Es ist dadurch langsamer geworden, zwischen 0 und 10 % :(

Demirug
2005-06-24, 23:15:03
Ich habe von 4 Kanal Texturen auf 1 Kanaltexturen und MRT umgestellt. Es ist dadurch langsamer geworden, zwischen 0 und 10 % :(

Als ich das vorgeschlagen ging ich davon aus das du dein Verfahren so umstellst das du ohne MRTs auskommst. Vorallem 4 MRTs mag der NV40 nicht.

ScottManDeath
2005-06-24, 23:21:05
Mhmm dann gucke ich mal wie das ohne MRT läuft. Thx anyways :)

aths
2005-06-24, 23:48:36
Als ich das vorgeschlagen ging ich davon aus das du dein Verfahren so umstellst das du ohne MRTs auskommst. Vorallem 4 MRTs mag der NV40 nicht.NV schreibt was von 3 MRTs = sweet spot. Hast du eine Ahnung, warum NV40 mit 4 MRTs nicht so gut zurecht kommt? Ob der G70 hier eine bessere Performance bietet wollte mit der NV-Techniker übrigens nicht sagen.

ScottManDeath
2005-06-25, 00:25:54
Ich habe Leonidas meinen Benchmark gegeben. Wenn er Zeit hat, ihn auf der 7800 Testkarte laufen zu lassen, sehen wir ob der G70 besser ist =)