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
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Jammer-Thread

Beitrag von CodingCat »

Krishty hat geschrieben:Denn normalerweise sind die Dreieckskanten leicht verwaschen wenn man Multisampling benutzt, wegen den UV-Koordinaten, die für alle Samples eines Pixels identisch sind. Also benutzt man Centroid Sampling. Dann sind die Dreieckskanten leicht verwaschen weil die GPU das Mip Level falsch berechnet.
In meiner Erinnerung war Centroid Sampling eine beliebige Koordinate eines beliebigen bedeckten Samples im Gegensatz zur Koordinate am Pixelmittelpunkt. Im Idealfall will man dann kein Centroid Sampling, weil benachbarte Dreiecke am Pixelmittelpunkt dieselbe Texturkoordinate aufweisen. In Realität hat man da natürlich leicht unterschiedliche Koordinaten, weil die UV-Parametrisierung benachbarter Dreiecke auf normaler gekrümmter Geometrie nie ganz die gleiche ist. In wieweit dagegen Centroid Sampling hilft, ist mir allerdings gerade nicht ersichtlich; in beiden Fällen vermischt man dann leicht unterschiedliche Texel, aber ohne Centroid Sampling deckt man wenigstens den Idealfall korrekt ab?!
Krishty hat geschrieben:Hübsch! Aber jetzt möchte ich nochmal an die Feinarbeit. Für die Anzeige kann man in Vergrößerung (Magnification) doch sicher Point Sampling benutzen, damit die Interpolation nicht das Pixelmuster verwischt, oder?
[...]
Erst so: FUCK YEA!
Dann rausgezoomt. Der Übergang Minification -> Magnification ist nicht weich, nein. Das würde in diesem Randphänomen ja 0,1 % mehr Befehle kosten! Jetzt läuft eine schöne Trennlinie zwischen den beiden Filtern entlang, wie hier:
Schlimmer als die Trennlinie ist doch vmtl. das instabile Point-Resampling sobald die Textur nicht perfekt bildschirmachsenausgerichtet ist? Ich fürchte Point Sampling ist einfach nicht das was du da willst.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

CodingCat hat geschrieben:In meiner Erinnerung war Centroid Sampling eine beliebige Koordinate eines beliebigen bedeckten Samples im Gegensatz zur Koordinate am Pixelmittelpunkt.
Oh ja, da hast du recht. Sonst müsste der Shader auch plötzlich mit Sample Frequency laufen, was Quatsch wäre.
Im Idealfall will man dann kein Centroid Sampling, weil benachbarte Dreiecke am Pixelmittelpunkt dieselbe Texturkoordinate aufweisen. In Realität hat man da natürlich leicht unterschiedliche Koordinaten, weil die UV-Parametrisierung benachbarter Dreiecke auf normaler gekrümmter Geometrie nie ganz die gleiche ist. In wieweit dagegen Centroid Sampling hilft, ist mir allerdings gerade nicht ersichtlich; in beiden Fällen vermischt man dann leicht unterschiedliche Texel, aber ohne Centroid Sampling deckt man wenigstens den Idealfall korrekt ab?!
Ich hatte da das D3D-SDK-Beispiel im Kopf, wo sie ein Schachbrettdreieck rotieren und dann zeigen, dass die Textur an den Kanten plötzlich halbwegs korrekt ist. Daraus habe ich dann abgeleitet, dass man im Fall von MSAA automatisch bessere (passender auf den tatsächlichen Texeln liegende) Texturkoordinaten erhält.

Zumindest bin ich jetzt mal auf diese Erklärung eines AMD-Menschen gestoßen, der genau sagt, wofür jetzt Centroid und wofür nicht:
When should you consider using centroid?
  1. When using an extrapolated value could lead to undefined results. Pay particular attention to the built-in functions that say “results are undefined if!”
  2. When using an extrapolated value with a highly non-linear or discontinuous function. This includes for example specular calculations, particularly when the exponent is large, and step functions.
When should you not consider using centroid?
  1. When you need accurate derivatives (explicit or implied, such as with mipmapped or anisotropic texture fetches). The shading language specification considers derivatives derived from centroid varings to be so fraught with inaccuracy that it was resolved they are simply undefined. In such a case, strongly consider at least adding:
    centroid varying float myMixer; // beware of derivative!
    varying float myCenterMixer; // derivative okay
  2. With tessellated meshes where most of the quad or triangle boundaries are interior and well defined anyway. The easiest way to think about this case is if you have a triangle strip of 100 triangles, and only the first and last triangle might result in extrapolations, centroid will make those two triangles interpolate but at the tradeoff of making the other 98 triangles a little less regular and accurate.
  3. If you know there might be artifacts from undefined, non-linear, or discontinuous functions, but the resulting artifacts are nearly invisible. If the shader is not attacking (much), don't fix it!
Das erklärt auch genau, dass es nichts für mich ist ;)
CodingCat hat geschrieben:Schlimmer als die Trennlinie ist doch vmtl. das instabile Point-Resampling sobald die Textur nicht perfekt bildschirmachsenausgerichtet ist? Ich fürchte Point Sampling ist einfach nicht das was du da willst.
Naja; das äußert sich dann als Aliasing und Geflimmer. Aber zumindest nur kurz bevor man die Pixeltextur erkennen kann. Point Sampling brauche ich schon, damit ich garantieren kann, dass jeder leuchtende Punkt auf der Pixeltextur mit der selben Farbe gefüllt wird.

Um es vorweg zu klären: Die perfektionistische Lösung wäre, die Anzeigentextur ohne Interpolation auf die vierfache Breite und Höhe hochzurechnen, das Raster bereits dort über die Pixel zu legen, und das dann anzuzeigen. Ist mir nur ein Bisschen zu aggressiv im Speicherverbrauch :) Ich probiere es jetzt nochmal mit einer größeren Pixeltextur, die mehrere Pixel zusammenfasst. Idealerweise kann ich damit bereits Griesel bewirken, bevor das Umschalten auf Point Sampling erfolgt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Mit dem Point Sampling bin ich noch nicht weiter (bin kurz davor, einfach die Seitenlängen der Ursprungstextur zu verdoppeln), dafür aber mit dem Look ohne extremen Zoom. Ich nutze jetzt diese Textur für die Pixel (ohne sRGB und mit manuell erzeugten Mip Maps):
lcd.png
lcd.png (113 Bytes) 8700 mal betrachtet
Dass sie mehrere Pixel abdeckt und manuell Unregelmäßigkeit erzwungen wurde hat die Wirkung, dass der Griesel nicht schlagartig verschwindet, sondern dass selbst aus einiger Entfernung noch ein ganz leichtes regelmäßiges Muster auf der Anzeige liegt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TheBenji
Establishment
Beiträge: 129
Registriert: 07.01.2011, 17:59

Re: Jammer-Thread

Beitrag von TheBenji »

Krishty, arbeitest du an einem flight sim?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

So ähnlich – ich will die Schnittstellen meiner Engine aufpolieren indem ich mal ein Fahrzeug und ein Flugzeug einbaue, mit allem drum & dran :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TheBenji
Establishment
Beiträge: 129
Registriert: 07.01.2011, 17:59

Re: Jammer-Thread

Beitrag von TheBenji »

achso, wenn es weiter nichts ist...

:o
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ich habe auch vergessen zu zeigen, wie es mit den manuellen Mip Maps aussieht:
Bild

Hier sehen wir jetzt Level [1]. Mit automatischen Mip Maps wäre das völlig glatt und man könnte keine Rasterung erahnen. Mit den selbstgemalten Mip Levels ist eine Rasterung drin, die zwar doppelt so groß ist wie eine Reale, aber dem Auge reicht hier der Eindruck, dass da überhaupt eine feine Struktur ist, ohne exakte Größe. So setzt sich der Effekt dann fort und wird immer schwächer, bis er bei rund einem Drittel dieses Zooms völlig verschwindet.

Die schwarzen Balken oben und die weißen unten sind exakt gleich dick, aber die sRGB-Filterung verträgt sich nicht mit linearer Interpolation, und darum werden helle Flächen bevorzugt und erscheinen dicker. Wahrscheinlich muss ich deshalb sRGB für sowas komplett abschalten.

Dem geneigten Betrachter fällt vielleicht auch auf, dass das Schwarz nicht wirklich schwarz ist. Scheinbar sind wir von unseren Monitoren immernoch hohe Schwarzwerte gewohnt, jedenfalls sehen die Anzeigen damit gleich viel realistischer aus.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
DerAlbi
Establishment
Beiträge: 269
Registriert: 20.05.2011, 05:37

Re: Jammer-Thread

Beitrag von DerAlbi »

Mach noch fettige Fingerabdrücke drüber, wenn du Realismus willst. Da ist das LCD-Raster fast unwichtig :-)
Außerdem darf es nicht Blinkwinkelstabil sein und bei Umbegungslicht muss der Bildschirminhalt unleserlich werden.

Außerdem: wenn es ein LCD ist, dann strahlt es polarisiertes Licht ab. Drehst du das simulierte Display um 90°, kommt aus dem LCD des PCs quasi nichts mehr raus :-D
sry ;-)
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

So weit musste ich bisher noch nicht gehen, weil die Anzeigen in Flugzeugen wohl absichtlich so positioniert werden, dass keine Sonne draufscheint. Auch die Blickwinkelabhängigkeit ist noch nicht wichtig so lange man im Cockpit eingezwängt ist. Für die Geräte am Boden werde ich’s aber einbauen, sobald sie Aufmerksamkeit genießen, bestimmt :)

Und das mit der Umgebungshelligkeit ist längst erledigt – Schwarzlevel und Leuchtdichte sind parametrisiert; den Rest erledigt Herr Phong ;-)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Jonathan
Establishment
Beiträge: 2545
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Jonathan »

nVidia nSight Download. Welches *** macht bei nVidia eigentlich die Webseiten?

Ich suche mir also den Link raus. Erste Seite ist die hier, sieht auch direkt gut aus. Die hat ja auch direkt einen großen grünen Download Button.

- Ich klicke auf "Download", eine neue Seite öffnet sich
- Ich klicke auf "Downloads", eine neue Seite öffnet sich
- Ich klicke auf "Download", eine neue Seite öffnet sich
- Ich wähle unter "Downloads" den richtigen Eintrag aus, eine neue Seite öffnet sich
- jetzt muss ich mich registrieren.
- Persönliche Daten reichen nVidia nicht, man muss auch noch eine längere Umfrage ausfüllen
- Endlich fertig, warten auf die EMail
- Passwort raussuchen, dass die nervigen Bedingungen erfüllt
- Mein Link ist längst kaputt, also nochmal ganz von vorne anfangen.
- 4 mal auf "Download" klicken (s.o.)
- Anmelden, eine neue Seite öffnet sich
- mein neuer Account ist nicht gut genug, ich muss mich als registrierter Entwickler registrieren
- eine neue Seite öffnet sich. Diesmal gibt es keinen großen Knopf zum drauf klicken sondern nur viel Text. Ich bin verwirrt und weiß nicht was ich machen soll.
- Irgendwo steht eine "Status Message". Scheinbar hab ich mich durch den Klick automatisch registriert? Na gut, immerhin
- Link ist wieder kaputt. Vertraue ich dem Zurück-Button oder fange ich WIEDER von vorne an?
- Zurück-Button funktioniert nicht. Also wieder von vorne. Weiß jetzt ja, wo ich klicken muss.
- Geht immer noch nicht. Soll mich schon wieder irgendwie besser registrieren. Ich finde irgendwo eine Option für das "Game Developer Programm"
- Man muss wieder einen Fragebogen ausfüllen. Aber 7 zufällige Klicks gehen zum Glück schnell.
- eine neue Seite öffnet sich. Sie ist schwarz / weiß und sagt wenig mehr als "Access Denied"
- Ich klicke mich wahllos durch die Seite. Irgendwann lande ich bei meinem Account. Ich finde einen neuen Link für das Gamedeveloper Programm, fülle den Fragebogen nochmal aus.
- Diesmal funktioniert es, ich bin jetzt approved. Für irgendwas.
- Hab keine Ahnung mehr, wo ich bin. Gebe im Suchfeld "nsight" ein und lande wieder bei Schritt 2.
- 2 klicks weiter und der Download startet.
- Wehe die Installation nervt!

(jetzt mal ehrlich. Ich habe bei Schritt 4 angefangen diesen Eintrag zu schreiben. Damals wusste ich noch nicht, wie abartig diese Liste werden würde. Hoffe meine Misere hat sich gelohnt und jemand von euch musste zumindest schmunzeln).
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Jonathan
Establishment
Beiträge: 2545
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Jonathan »

Und das alles nur, weil einem, wenn man nach "OpenGL Debuggen" sucht immer noch "glGetError" vorgeschlagen wird. Ich habe wirklich jedes Tool aus jeder OpenGL-Debugger-Liste ausprobiert, und die meisten sind mies. Eigentlich alle. Aber nSight ist das einzige, was nicht hundert Jahre alt. Meine bisherigen Erfahrungen damit waren eher so Mittel, ich habe noch lange nicht raus, wie man wirklich gezielt Fehler findet, und vieles was er anzeigt ist Tatsächlich einfach Quatsch (weils immer noch komplett falsch aussieht, wenn das Programm schon längst wieder richtig läuft), was das Fehlersuchen natürlich nicht leichter macht. Naja, mal sehen wies diesmal wird.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 5048
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Schrompf »

Ja, der Download bei NVidia ist episch dumm. Aber wenn Du einen der Fake Accounts von bugmenot.com genommen hättest, wäre die Liste nur ein Drittel so lang gewesen. Hier Gleichnis vom ehrlichen Bürger einfügen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
joggel

Re: Jammer-Thread

Beitrag von joggel »

Wut, Hass, Schmerz!!!
Es kotzt mich an!!! So endlos...
Meine Grafiikarte hat den Geist aufgegeben!!!!!
Und das am Monatsende!!! Schlimmer geht es eigentlich nicht.
Ich hab mit OpenGl und Shader rumhantiert, aber nix exotisches gemacht.
Dann kam immer mal "lost driver. Error 3" nvidia..." oder so ungefähr.
Und dann kam nur schwarz.
Pc aus... dann wieder an, und seit dem spinnt die grafik. Also es werden falschfarben und fragmente angezeigt.
Ich verstehe es nicht...

Wenn also jemand hier aus Dresden günstig eine grafikkarte abzugeben hat wäre mir sehr geholfen...
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ich hatte letztens noch eine übrig … aber die Lautstärke hätte ich keinem ZFXler angetan ;)

————

Warum hat C keinen ANDNOT-Operator?! Grrrrngh
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
DerAlbi
Establishment
Beiträge: 269
Registriert: 20.05.2011, 05:37

Re: Jammer-Thread

Beitrag von DerAlbi »

if (a && !b)

???
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

DerAlbi hat geschrieben:if (a && !b)

???
Nein, bitwise!

Teile vier Gleitkommazahlen in Vorzeichen und Betrag auf:

  __m128 f;
  static __m128i const signMask = { 0x80000000, 0x80000000, 0x80000000, 0x80000000 };
  auto signs = f & signMask;
  auto abs = f & ~signMask;


Wie funktioniert ~signMask? Es gibt kein bitweises NOT in SSE. Man muss also den Wert mit einem Vektor voller Einsen XORen. Einen Vektor voller Einsen kann man nicht einfach so erzeugen, weil … es kein bitweises NOT gibt. Man erhält ihn, indem man einen Vektor mit sich selber vergleicht. Dabei muss man aber die char-Version nutzen, weil sie rund drei Mal so schnell ist wie die float-Version:

  __m128 operator ~(__m128 f) {
    return _mm_xor_ps(f, (__m128 const &)_mm_cmpeq_epi8((__m128i const &)f, (__m128i const &)f));
  }


Okay. An diesem Punkt erhalten wir für den Betrag die Befehlsfolge

  auto abs = _mm_and_ps(f, _mm_xor_ps((__m128 const &)signMask, (__m128 const &)_mm_cmpeq_epi8(signMask, signMask));

Obwohl es mit einem ANDNOT viel einfacher wäre:

  auto abs = _mm_andnot_ps(f, (__m128 const &)signMask);

Aber das kann man halt nicht als Operator realisieren, weil C++ keinen operator &~ kennt.

————

Ganz gewiefte Strategen erkennen oben, dass der Speicherzugriff auf die Konstante 80000000 unnötig ist:

  __m128 floatx4SignMask() {
    // Erzeuge FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
    auto zeroes = _mm_setzero_si128();
    auto ones = _mm_cmpeq_epi8(zeroes, zeroes);
    auto mask = _mm_slli_epi32(ones, 31); // FFFFFFFF << 31 == 80000000
    return (__m128 const &)mask;
  }
Zuletzt geändert von Krishty am 23.07.2015, 18:43, insgesamt 3-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
DerAlbi
Establishment
Beiträge: 269
Registriert: 20.05.2011, 05:37

Re: Jammer-Thread

Beitrag von DerAlbi »

Ist das rumgemoschel mit SSE hier wirklich so vorteilhaft? Wenn man das der Pipeline ordentlich zuführt sollte das doch mit einer 64bit ALU fast ohne Stalls funktionieren...
(ich rate nur, sollte vermutlich einfach ruhig sein. X86 ist blöd. daf ehlt eine standardisierte rekonfigurierbare logik.)
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Da werden vier Zahlen parallel bearbeitet, nicht bloß zwei – wenn schon, dann gleich eine 128-Bit-ALU ;)

Gleitkommazahlen liegen sowieso in den SSE-Registern. Wenn du da mit Standard-Integeroperationen dran willst, bleibt nur ein Roundtrip SSE-Register -> Stack -> Integer-Register (und nach der Berechnung umgekehrt wieder zurück). Da kann man besser direkt in den SSE-Registern bleiben.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: Jammer-Thread

Beitrag von Spiele Programmierer »

Meiner Meinung nach braucht es da keinen "A &! B" Operator, sondern viel mehr einen Compiler mit nicht so unterirdischen Optimierungen. Andere Architekturen bieten vielleicht wieder andere Operationen wie zb. "A | !B". AVX512 soll wohl mit einer Wahrheitstabelle beliebige binäre Operatoren mit drei Werten unterstützen. Sollen wir die alle in den C++ Standard übernehmen?

Clang generiert übrigens ein einzelnes AndNot in beiden Fällen:

Code: Alles auswählen

void T(unsigned int* a, unsigned int* b)
{
	for (int i = 0; i < 4096; ++i) //Autovektorisierung
		a[i] = a[i] & ~b[i];
}
__m128i __vectorcall T2(__m128i a, __m128i b)
{
	return _mm_and_si128(a, _mm_xor_si128(b, _mm_cmpeq_epi8(b, b)));
}
Da es aussieht, als ob du die SSE Intrinsics in Klassen wrappen möchtest: Warum erstellst du nicht einfach eine "AndNot" Methode die kein Operator ist?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ah – vorbildlich, dieser Clang :)

Mir gefällt einfach die Funktionssyntax nicht. Da sind schon genug Klammern in meinem Code; da brauche ich nicht noch x.andnot(y). Soll zwar schnell sein, aber halt auch was für’s Auge ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
DerAlbi
Establishment
Beiträge: 269
Registriert: 20.05.2011, 05:37

Re: Jammer-Thread

Beitrag von DerAlbi »

Meiner naiven Meinung nach sollte es doch da einen Weg geben....
Den ~ operator überladen und ein eine Klasse zurückgeben, die sich automatisch zum Grundttypen castet? Dann den &-Operator überladen der eine Spezialisierung für den ~-Rückgabetyp hat ?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ja, genau. Nur dass sowas immer einen Rattenschwanz an Problemen nach sich zieht und viel zu viel Code kostet.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Krishty hat geschrieben:Ich habe angefangen, in meiner Engine SIMD zu benutzen. Ich benutze SSE schon länger für Spezialfälle wie Conditional Move, schnelle Quadratwurzel, usw – aber immer nur eine Spur der Register für kleine serielle Dinge. Ich habe mich lange gesträubt, über vier floats gleichzeitig drüberzurutschen (vor allem aus Gründen der Lesbarkeit und Portierbarkeit); aber nun habe ich dennoch einen beherzten Versuch gewagt.

[…]

Die Katastrophe war dann, alle Vektorberechnungen auf Multimedia-Register umzustellen. Ich habe mich zwei Stunden lang durch Maschinenbefehle gewühlt, und letztendlich war trotzdem alles langsamer auf fetter. Dir Rückgabe ist die Pest; Visual C++ verschüttet die Rückgabewerte dauernd auf den Stapelspeicher. Zwar werden die Register drei Mal so effizient ausgenutzt (habe leider nur X, Y, & Z), aber dafür bewirkt das Shuffling dermaßen viele temporäre Werte, dass der Registerdruck dennoch steigt. Irre. Da weiß man sofort, warum andere Befehlssätze hunderte Register haben.
(damals) Mal ein Update vom neuesten Versuch. Diesmal war der deutlich erfolgreicher: 30 % schneller bei 50 % weniger Maschinentext.

Der Schlüssel ist die Methode, unterschiedliche Typen für Speicherung und Verarbeitung zu haben. Also 3×float in die structs schreiben, vor der Berechnung in __m128 laden, immer und überall ausschließlich mit __m128 rechnen, und die Ergebnisse wieder in 3×float zurückschreiben. Ich weiß nicht ob DirectXMath es so macht, aber ich glaube, schon.

Shuffling und Swizzling ist nämlich wirklich das, was alles ruiniert. Nicht weil es langsam wäre (dürfte AFAIK nur einen Takt dauern), sondern weil es so scheiße viele Register verbraucht. Register Pressure ist der Flaschenhals.

Unter diesem Gesichtspunkt glaube ich auch nicht, dass SIMD für die Geschwindigkeitssteigerung verantwortlich ist. Dafür müsste ALU der Flaschenhals sein. Viel mehr scheint der Datenstrom abgeebbt zu sein, weil ich nun effektiv 48 floats in Registern halte statt zuvor 16, und das Spilling entfällt. Der L1 ist eben immernoch drei Takte entfernt. Unter dem Gesichtspunkt müsste man mal simulieren, ob eine CPU mit 32 oder 48 skalaren Registern genau so schnell wäre wie mit 16 SIMD-Registern (aber einfacher zu programmieren) …

Wenn ich in den nächsten Tagen mal Visual Studio 2015 installiere (hat ja jetzt den Profiler kostenlos, oder?), prüfe ich genauer, wo die Flaschenhälse liegen. Ist ja alles bloß Spekulation. Und __vectorcall probiere ich, wie von dot vorgeschlagen, auch mal aus – damit bei Funktionsaufrufen weniger Speicher im Spiel ist. Da bisher die meisten Funktionen geinlinet werden, hatte das bisher keine Priorität.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Firoball
Beiträge: 92
Registriert: 24.03.2002, 23:21

Re: Jammer-Thread

Beitrag von Firoball »

Habe mal wieder viel zu viel Zeit für "nix" investiert. Das Endresultat geht einmal mehr völlig unter.

Das ganze hab ich dann letztens gleich nochmal in etwas anderer Art und Weise wiederholt, denn seit Unity 5.1. wurde das komplette Netzwerk Framework überarbeitet... kurz nachdem ich meinen Kram mit Unity 4.6 und demnach dem alten Framework recht gut am laufen hatte.
Da wollte ich endlich mal nicht mit was völlig veraltetem arbeiten (Acknex), und nun bin ich schon wieder an dem Punkt... "Legacy" :ugeek: :? :lol:
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Verdammt, Zerbie! Man prüft SSE-Verfügbarkeit nicht via CPUID – das Betriebssystem muss den Befehlssatz doch ebenfalls unterstützen! IsProcessorFeaturePresent() ist das Mittel der Wahl. Schön, dass ich's nach 15 Jahren endlich kapiert habe ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: Jammer-Thread

Beitrag von joggel »

Ich weiß nicht... vlt sollte ich die C++-Landschaft verlassen und zB auf C# umsatteln.
Mit C++ ist es irgendwie zu langwierig damit etwas zu entwickeln.
C# wäre vlt etwas.
Wird ja auch oft als Script-Sprache verwendet...

Ich komme mir irgendwie vor, als sei ich so etwas wie ein behinderter, unfertiger Dinosaurier in der Programmierlandschaft... :(
Tiles

Re: Jammer-Thread

Beitrag von Tiles »

Kommt halt immer drauf an was du anstellen willst. Und vor allem wo, also in welcher Umgebung. Die Sprache ist ja nur das Werkzeug, und eigentlich kein Selbstzweck. Unity kann zum Beispiel C#. Und da kann man ziemlich schnell zum Ergebnis kommen. In Unreal hingegen kommst du mit C# nicht weit. Da ist C++ angesagt.

Um mal selber zu jammern, ich muss sagen, mein Respekt vor C++ Programmierern ist inzwischen ins Unermessliche gestiegen seit ich versuche mal eben Blender zu kompilieren. Ich glaube ich bin echt zu doof dazu ^^
Matthias Gubisch
Establishment
Beiträge: 491
Registriert: 01.03.2009, 19:09

Re: Jammer-Thread

Beitrag von Matthias Gubisch »

Windows 10 nervt mich schon bevor ichs überhaupts installiert habe.

Nein des Ding kann nicht nur nicht von Windows 7 upgraden wen GRUP als Bootloader verwendet wird weil man noch ein Linux parallel am Laufen hat, es lässt sich auch nicht auf eine eigene Partition/Platte erstellen solang die Linux Platte drinsteckt.

Dann halt keine Versuche mit DX12 :(
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Tiles

Re: Jammer-Thread

Beitrag von Tiles »

Mein Acer Lappy hatte mit Windows 10 nur noch gedimmtes Bild. Der wird auch nicht von Acer als upgradefähig unterstützt. Was ich allerdings erst hinterher gemerkt habe. Und nach dem Downgrade zurück auf Win 7 ist nun fast überall ein Schloss an den Ordnern und Verknüpfungen dran :'3
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: Jammer-Thread

Beitrag von Spiele Programmierer »

Ein Schloss :?:
Ist etwas an der Rechteverwaltung durcheinander geraten?
Antworten