Jammer-Thread

Hier kann über allgemeine Themen diskutiert werden, die sonst in kein Forum passen.
Insbesondere über Szene, Games, Kultur, Weltgeschehen, Persönliches, Recht, Hard- und Software.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Jammer-Thread

Beitrag von eXile »

Schrompf hat geschrieben:Der Vorschlag klingt gut! Und was tun wir, wenn der Typ gar nichts davon liest, weil er nur hauptberuflich hunderte Foren wie unseres zumüllt, ohne irgendwo mitzulesen?
Bei dem ersten Verstoß eine PM schicken (da geht ja eine Benachrichtigung an die hinterlegte E-Mail-Adresse), bei dem zweiten Verstoß sperren. Auch ich bin es Leid, diese ganzen Threads jedes mal als gelesen zu markieren.

Nachtrag:
CodingCat hat geschrieben:Das ist richtig übel, bis eben dachte ich, auf modernen GPUs wäre Flow Control nur eine Frage des Ausmaskierens einzelner Threads.
Ja, aber warum ist das so übel? Ich meine, im ersten Fall wird die for-Schleife übersprungen, im zweiten Fall wird die for-Schleife nach einer weiteren Abfrage übersprungen; von den Laufzeiten her sollte das doch keinen Unterschied machen. Ich verstehe es nicht.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ich kriege meine Quaternions nicht hin. Egal, was ich mache – immer ist irgendwas negiert.

Wenn ich alle Multiplikationen in der falschen Reihenfolge (also von links nach rechts; ich weiß, dass Quaternion-Multiplikationen verdreht sind) durchführe, funktioniert alles. Obwohl es eindeutig nicht darf.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

eXile hat geschrieben:Nachtrag:
CodingCat hat geschrieben:Das ist richtig übel, bis eben dachte ich, auf modernen GPUs wäre Flow Control nur eine Frage des Ausmaskierens einzelner Threads.
Ja, aber warum ist das so übel? Ich meine, im ersten Fall wird die for-Schleife übersprungen, im zweiten Fall wird die for-Schleife nach einer weiteren Abfrage übersprungen; von den Laufzeiten her sollte das doch keinen Unterschied machen. Ich verstehe es nicht.
Das ist es ja. Das Einzige, was im Diff der Assemblercodes für die continue-Variante anders ist, ist folgender Zusatz:

Code: Alles auswählen

 if_nz r0.w
   continue 
Damit wächst die Ausführungszeit mit zunehmender Anzahl übersprungener Schleifendurchgänge ins Unermessliche. Und ja, in der anderen Variante wird weiter unten in der for-Schleife auch einfach übersprungen. Ich verstehe es selbst nicht.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Ich bin in einer Sackgasse. Es macht keinen Unterschied, ob ich meine Strahlbeschreibungen (Orig + Dir, 6 floats!) während der Schnitttests inkohärent indiziere oder perfekt kohärent und kompakt lese (3 uints). Die Dekodierung (Trigonometrie, Wurzeln, Divisonen) kostet mich offenbar gerade die 40 ms, die ich beim Speicherzugriff spare.

Obendrein macht es keinen Unterschied, ob ich das Ergebnis meiner Schnitttests überhaupt verwende (inkohärente Atomic Updates!) oder einfach verwerfe. Bin ich mir dieser Masse von Speicherzugriffen ernsthaft ALU-Limitiert?!
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Schnell:

Code: Alles auswählen

if (rayCount != 12512)
	return;

if (!hit)
	return;
Langsam:

Code: Alles auswählen

if (!hit)
	return;

if (rayCount != 12512)
	return;
Die rayCount-Bedingung ist nur eine Art, den Shader zu beenden, ohne dass der Compiler alles danach (oder davor) wegoptimieren kann.

Sieht mal wieder nach einen massiven Branching-Problem aus. Das ganze liegt in einem Pixel Shader, und hit kann naturgemäß sehr inkohärent sein. :evil:
Zuletzt geändert von CodingCat am 18.09.2012, 17:17, insgesamt 1-mal geändert.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

clip spart im angegebenen Testfall beim Branching 15 ms, führt aber zu Treiberreset sobald danach auch nur ein UAV mit Atomics angerührt wird.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Ich verbringe 80 ms 15 ms damit, für jeden Pixel Shader das passende Dreieck aus dem Speicher zu laden. Verschieben in nointerpolation-Register sprengt aber offenbar ein internes Limit, das die Anzahl der gleichzeitig ausgeführten Pixel Shaders ebenfalls extrem dezimiert.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Das Ganze zeigt mal wieder, WIE vorsichtig man beim Durchmessen sein muss. Das, was ich vorhin als Branching-Overhead gemessen hatte, war tatsächlich einfach nur ein Extremfall von Compiler-Optimierung, in dem der Shader-Compiler ganze Zweige in Abhängigkeit ihrer Beziehung untereinander mal weit nach vorne gezogen hat, mal aber auch nicht.

Dennoch, nach meiner ganzen Messerei müsste der Shader nach Adam Ries(e) mindestens die vierfache Zeit dessen in Anspruch nehmen, was ich am Ende tatsächlich an Gesamtlaufzeit erhalte. Ein Paradebeispiel für die außerordentliche Fähigkeit der GPU, Latenzen zu verstecken.

Leider bin ich deshalb jetzt trotz einiger Optimierungen auch noch immer keinen Deut schneller
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Code: Alles auswählen

float azimuth = compactAzimuth / (float) MaxShortUInt * (2.0f * PI) - PI;
Daraus macht mir fxc Assembler Dump:

Code: Alles auswählen

mad r2.w, r2.w, l(0.000096), l(-3.141593)  // azimuth<0:[-3.14159f,3.14159f]>
Zwei Dezimalen. Ich kann nur hoffen, dass das nur die Assembler-Ausgabe zu Debug-Zwecken betrifft.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ich finde in meinem Release-C++ ständig

    mulss xmm#, dword ptr [__real@3F800000]

(lies: Multiplikation mit 1.0f).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: Jammer-Thread

Beitrag von kaiserludi »

Krishty hat geschrieben:Ich finde in meinem Release-C++ ständig

    mulss xmm#, dword ptr [__real@3F800000]

(lies: Multiplikation mit 1.0f).
Sowas kannst du als Compiler auch nur in der Release-Version generieren. In der Debug Config kannst du dich schließlich nicht drauf verlassen, dass ein guter moderner Coder das für dich rausoptimiert. :D
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Kann ich eine Quaternion-Rotation invertieren, indem ich w negiere? Ich hatte eine Quelle gefunden, die die Imaginärteile negiert, aber mit w geht es auch und es sind zwei Operationen weniger … scheint zu klappen; ich weiß nur nicht, ob ich auf der sicheren Seite bin …

?

Obligatorisches Gejammer: Mein Handy scheint einen Garbage Collector zu nutzen. Jedes Mal, wenn ich 31 Kurznachrichten gelöscht habe, friert es beim Löschen der 32. für zwei Minuten (!) ein. Scheint O(n²) zu sein, denn 500 SMSen früher waren es etwa acht Minuten.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Jörg »

Invertieren: Schau dir nochmal die Achse-Winkel-Darstellung an, und welche Eigenschaften sin/cos bzgl. 0-Punkt-Symmetrie haben...
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Bei Achse-Winkel ist der Fall eindeutig – man kann entweder die Achse invertieren oder den Winkel. (Beides invertieren bedeutet, die Transformation unverändert zu lassen – das nutzen ja bspw. Crytek, um Quaternions in drei statt vier Zahlen zu speichern.)

Sinus/Kosinus: Ich weiß, dass der Realteil das Kosinus beherbergt und die Imaginärteile das Sinus; und dass (sin, -cos) bzw. (-sin, cos) 90-Grad-Rotationen eines Vektors sind; und dass Quaternions mit Sinus und Kosinus des halbierten Winkels arbeiten. Hier werden Sinus und Kosinus aber nicht vertauscht, sondern nur eins invertiert. Liege ich richtig, dass dadurch die Rotation gespiegelt wird, und das der Invertierung gleichkommt?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Bwargh.

D3D11: ERROR: ID3D11DeviceContext::CSSetUnorderedAccessViews: The UnorderedAccessView at slot 2 overlaps with the UnorderedAccessView at slot 3. It is not possible to write to the same Subresources at the same time. [ STATE_SETTING ERROR #2097403: DEVICE_CSSETUNORDEREDACCESSVIEWS_INVALIDVIEW ]

D3D11: ERROR: ID3D11DeviceContext::CopySubresourceRegion: Cannot invoke CopySubresourceRegion when the source and destination Subresource are same Subresource of the same Resource. [ RESOURCE_MANIPULATION ERROR #281: COPYSUBRESOURCEREGION_INVALIDSOURCE ]

D3D11: WARNING: ID3D11DeviceContext::CSSetUnorderedAccessViews: Resource being set to CS UnorderedAccessView slot 1 is still bound on input! [ STATE_SETTING WARNING #2097355: DEVICE_CSSETUNORDEREDACCESSVIEWS_HAZARD ]
D3D11: WARNING: ID3D11DeviceContext::CSSetUnorderedAccessViews: Forcing CS shader resource slot 0 to NULL. [ STATE_SETTING WARNING #2097317: DEVICE_CSSETSHADERRESOURCES_HAZARD ]
The thread 'Win32 Thread' (0x838) has exited with code 0 (0x0).
D3D11: WARNING: ID3D11DeviceContext::CSSetShaderResources: Resource being set to CS shader resource slot 1 is still bound on output! Forcing to NULL. [ STATE_SETTING WARNING #2097317: DEVICE_CSSETSHADERRESOURCES_HAZARD ]


In den Speicherbereichen überlappt sich rein gar nichts. Wie zur Hölle soll man da speichereffizient programmieren, das kostet mich bis zu 24 MiB extra!
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Darum hat mein Glare ja auch um die 600 MiB VRAM verbraucht. Ein Hoch auf unsere Helden beim Direct3D-Team!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

VC++ 2012 hat noch nicht mal implizite Move-Konstruktoren. Und wenn Herb Sutter so locker sagt, das Fehlen von make_unique in C++11 sei ein "Oversight" gewesen, frage ich mich manchmal schon, wann C++ eigentlich brauchbar werden soll.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Schrompf »

NVidia NSight mag ein nettes Tool sein, ist aber immer gerade dann nicht genau genug, wenn ich wirklich mal Details bräuchte. Und noch dazu zeigt es ein paar hundert Geister-DrawCalls an, die ich nie gemacht habe. Und wenn ich die anzeigen lassen will, crasht Visual Studio.

Diese Geister-DrawCalls sind übrigens als Einzige Shader-limitiert... alle anderen DrawCalls ersticken im Input Assembler an Millionen kleinen Voxel-Flocken. Was kann man da noch machen? Das ist evtl. eine Frage für einen eigenen Thread.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Ja, NSight hat mir bis jetzt auch genau kein Mal geholfen. Crashes ohne Ende und es zeigt nie das, was man braucht. Zu den Voxelflocken bräuchte man in der Tat mehr Details.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Es wird SO Zeit für Unified Addressing; ich muss mit einem riesen Rechenaufwand Morton Codes zusammensetzen und auf der anderen Seite wieder zerlegen, nur um dort eine 3D-Textur addressieren zu können.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Jammer-Thread

Beitrag von eXile »

CodingCat hat geschrieben:Ja, NSight hat mir bis jetzt auch genau kein Mal geholfen. Crashes ohne Ende und es zeigt nie das, was man braucht. Zu den Voxelflocken bräuchte man in der Tat mehr Details.
Mir hat NSight sehr wohl geholfen, vorausgesetzt, man hab mal eben zwei Rechner rumstehen (Direct3D Shader Debugging).
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Fun Fact: Es funktioniert mit DX11 und mit CUDA, aber nicht für DX11 und CUDA zusammen. Für mich funktioniert es also überhaupt nicht mehr.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Jammer-Thread

Beitrag von eXile »

CodingCat hat geschrieben:Fun Fact: Es funktioniert mit DX11 und mit CUDA, aber nicht für DX11 und CUDA zusammen. Für mich funktioniert es also überhaupt nicht mehr.
:|

Für mich sieht es gerade fast so aus, als ob ich hier einen Direct3D-OpenGL-Interop probieren müsste. Grund: Bindless Textures. Das kann doch nur schief gehen.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Jammer-Thread

Beitrag von Artificial Mind »

Vier neue Goodgame Jobs innerhalb von 9 Minuten.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Schrompf »

Artificial Mind hat geschrieben:Vier neue Goodgame Jobs innerhalb von 9 Minuten.
Fünf sogar. Habe soeben (ohne Rücksprache mit den anderen Mods, Sorry dafür) eine PN verschickt.
PN hat geschrieben:Hallo Goodgame Studios,

bitte fasse alle Mitarbeiter-Gesuche eines Monats in einem einzelnen Beitrag zusammen. Die bisherigen Massen-Postings belästigen die aktiven Nutzer des Forums und sind daher bitte in Zukunft zu unterlassen.

Mit freundlichen Grüßen

Thomas Schulze
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Danke.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Bedenklich: Meine Shaders werden bei Besuch besonders wenig aufwändiger Kamerapositionen nochmal eine ganze Ecke schneller. Sieht etwas danach aus, als würde der Treiber auf die Entdeckung hin, dass es sich um eine Echtzeitanwendung handelt, nochmal eine Optimierungsstufe hochschalten. :o
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Jörg »

Quaternions: ja - auch wenn das kein Grund zum Jammern ist ;)
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: Jammer-Thread

Beitrag von kaiserludi »

Irgendein Template führt zu einem fürchterlichen Code Bloat in in einem meiner Sourcefiles, aber ich weiß nicht, welches Template das Problem ist und bei allen, die ich im Verdacht hatte, hat ein Durchzählen der Instantierungen (globale Variable als Counter und im Template eine static dummy Variable, die mit dem return Value einer Funktion initalisiert wird, welche den globalen Counter inkrementiert) nur seh überschauliche Zahlen gegeben, die nicht das Problem sein können.
Templight habe ich auch versucht, drüber laufen zu lassen, der scheint aber mit dem Projekt überhaupt nicht klar zu kommen, findet die Includes nicht, mag manche Syntax nicht, usw., mit den Samples habe ich ihn zum Laufen bekommen, mit meinem Code nicht.

Noch igendwer Ideen, wie ich mit möglichst wenig Aufwand raus finde, welches Template wie oft instantiiert wird?
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Schrompf »

Ein Blick in die Debug Database oder das Map-File? Ist nur geraten, aber ich denke, da könnten alle verwendeten Symbole auftauchen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten