Seite 73 von 254

Re: Jammer-Thread

Verfasst: 22.06.2012, 12:37
von BeRsErKeR
Krishty hat geschrieben:
BeRsErKeR hat geschrieben:
Krishty hat geschrieben:
BeRsErKeR hat geschrieben:hab mich da teilweise an D orientiert, genau wie bei der Syntax von Arrays
Array-Syntax ist ein interessantes Thema … ich hasse C(++)-Arrays. Im Augenblick löse ich in meinen C++-Projekten alles über range-Strukturen, die auf Anfang und Ende von Feldern zeigen, und das fließt wie Butter – abgesehen von dem winzigen Detail, dass der Compiler es nicht ausreichend optimiert, weil es keine Wurzel in der Sprache selber hat; und dass mir bei String-Literalen immer die automatisch angehängte Null zum Verhängnis wird (for teh luv of gawd, WHY!). Ich muss mir auch unbedingt nochmal Gos Slices ansehen, falls ich irgendwann mal Zeit habe. Und dann wären da noch Strings, die ja auch ein Thema für sich sind (Rein in die Sprache oder nicht? Nur Literale? Nullterminiert oder nicht? …).
Klingt interessant. Kannst du mir da mal ein Beispiel zeigen? Zwecks range-Strukturen.
Sie arbeiten ziemlich genau wie .begin() und .end() in STL-Containern; mit Zeigern als Iteratoren. Eigentlich kannst du jedes Array im Programm durch einen STL-Container ersetzen und hast ziemlich genau diese Syntax, nur eine Million mal langsamer als wenn es direkt in der Sprache verankert wäre.(Nachtrag: Nein, idiotisch. Eine Range referenziert vorhandenen Speicher, während ein STL-Container ihn kopiert.)

Dann gibt es noch so Kunststückchen wie, dass man eine Range an beliebiger Stelle in zwei Teile zerlegen kann. Ein Parser würde z.B. die Range des verbliebenen Textes so lange hinter dem ersten Buchstaben teilen, bis nichts mehr übrig (der Text also geparst) ist. Bisher habe ich das aber nicht explizit gebraucht; schlicht den Anfang zu inkrementieren hat gereicht.

Der Clou ist nun, dass man out-of-bounds-Fehler einfach analyisieren kann, weil jeder Zeiger nur entweder an einer einzelnen Instanz oder aber an einer Range bestimmter Größe hängt.

Kein Beispieltext, weil mein Entwicklungssystem atm nicht am Netz hängt.
Wie kann ich mir dann einen gezielten Zugriff auf ein beliebiges Element im Array vorstellen?

So in etwa?

Code: Alles auswählen

foo : int_array;
// fill array with values
bar : int(foo.begin() + 5); // Zugriff auf das 6. Element?
// normal: int bar = foo[5];
Oder muss ich dann sogar noch selbst durchiterieren?

Re: Jammer-Thread

Verfasst: 22.06.2012, 20:02
von Krishty
Seht ihr die rot umkringelten Einstellungen? Seht ihr die?
i_cant_even.png
Die sind auch ohne Debug Runtime aktiv. Sie kommen nur nicht zur Benutzerschnittstelle durch.

Wenn man an einem 8-Kern-i7 entwickelt, merkt man es nicht. Wenn man aber an einen drei Jahre alten Eee PC zurückgeht, entwickelt man wochenlang die abstrusesten Optimierungen, die alle mysteriöserweise nicht einmal ein Prozentchen Leistung bringen. Das System verbringt weiterhin 87 % der Ausführungszeit in Shader Validation und 5 % in Debug-Output-Funktionen, von denen man nie etwas zu Gesicht bekommt. Schaltet man die umkringelten Einstellungen ab, klettert die Einzelbildrate plötzlich von 7 auf 78, und zwei Wochen Fummelei waren quasi umsonst.

Ist natürlich mein Fehler, denn wenn sie mit der Retail Version keine Wirkung hätten, wären sie ausgegraut. Trotzdem eine Stelle, an der man sich das ganze System zerschießen kann. Plötzlich rendert nämlich auch Visual Studio 2010 seinen Text schneller und das Scrollen geht wieder absolut flüssig.

Ich habe noch nie so lange gebraucht, um einen Flaschenhals zu finden. Mein Programm verwaltet mittlerweile jeden Render-State selber, um auch die unscheinbarsten überflüssigen API-Aufrufe vorzeitig rauszufiltern und ist auf tausenden Zeilen für die Intel Atom-Pipeline optimiert … und das alles hatte nichts mit der 90-%igen Leistungseinbuße zu tun.

Re: Jammer-Thread

Verfasst: 22.06.2012, 23:38
von TDK
Du arme Sau... :D

Und sowas kommt mir nicht mal unbekannt vor.

... :twisted:

Re: Jammer-Thread

Verfasst: 22.06.2012, 23:45
von glassbear
2.5 Jahre nach dem ersten iPad und es gibt endlich ernsthafte Konkurrenz. Von Microsoft. Mit Surface.

Schade, ich wuerde ja gerne Geld fuer ein Android-Tablet auf den Tisch legen. Doch es gibt einfach nix.

Re: Jammer-Thread

Verfasst: 23.06.2012, 00:26
von eXile
Ich habe gerade gemerkt, dass ich noch vergessen habe, 30 Vergleichsoperatoren zu schreiben (und nein, Templates helfen hier ausnahmsweise nicht). Aber man muss ja auch morgen noch etwas zu tun haben.

Re: Jammer-Thread

Verfasst: 23.06.2012, 11:28
von Krishty
Visual C++’ automatisch generierte Zuweisungsoperatoren sind ein Witz. Die Zuweisung einer 4×3-float-Matrix wurde durch ein call memcpy (ja – durch einen Aufruf in die CRT-DLL!) ersetzt statt durch drei SSE-Befehle.

Die Optimierung von Zeigerarithmetik ist so gut wie garnicht vorhanden. Ich habe eben 4 KiB Maschinentext in einer inneren Schleife gespart, indem ich alle Adressberechnungen von Hand auf char * durchführe statt den Compiler mit unsigned short * rumrechnen zu lassen. Echt zum Kotzen.

Nach meiner Optimierung auf Eee hat sich die Anzahl der Render State Changes mehr als halbiert, aber die Anzahl der Draw Calls fast verdoppelt. Genau das sollte ja verhindert werden. WTF. Ich hasse komplexe Systeme.

Re: Jammer-Thread

Verfasst: 23.06.2012, 11:35
von dot
Krishty hat geschrieben:Nach meiner Optimierung auf Eee hat sich die Anzahl der Render State Changes mehr als halbiert, aber die Anzahl der Draw Calls fast verdoppelt. Genau das sollte ja verhindert werden. WTF. Ich hasse komplexe Systeme.
Wie gibt's denn das!?

Re: Jammer-Thread

Verfasst: 23.06.2012, 12:05
von Krishty
Wie wohl? Irgendwo einen Fehler gemacht. Vielleicht versehentlich einen Cache verkleinert. Vielleicht wurde der Zähler vorher falsch hochgezählt; oder jetzt doppelt. Mal gucken.

Re: Jammer-Thread

Verfasst: 23.06.2012, 13:00
von CodingCat
Wieso installiert sich das CUDA SDK in einen versteckten ProgramData-Ordner? Und sehe ich das richtig, dass in diesem 1,3 GiB-Paket nichts drin ist, was ich brauche? Steht SDK neuerdings für Sample-Documentation-Kit?

Oh, und gibt es irgendeine Möglichkeit, CUDA-Integration für ein Visual Studio 2010-Projekt nachträglich zu aktivieren?

Re: Jammer-Thread

Verfasst: 23.06.2012, 14:04
von dot
CodingCat hat geschrieben:Wieso installiert sich das CUDA SDK in einen versteckten ProgramData-Ordner? Und sehe ich das richtig, dass in diesem 1,3 GiB-Paket nichts drin ist, was ich brauche? Steht SDK neuerdings für Sample-Documentation-Kit?
Das SDK brauchst du sowieso nicht unbedingt, das Toolkit sollte normalerweise reichen.
CodingCat hat geschrieben:Oh, und gibt es irgendeine Möglichkeit, CUDA-Integration für ein Visual Studio 2010-Projekt nachträglich zu aktivieren?
Selbstverständlich, einfach die Custom Build Rule hinzufügen.

Re: Jammer-Thread

Verfasst: 23.06.2012, 14:56
von CodingCat
Danke, Custom Build Rules habe ich mit Visual Studio 2010 komplett aus den Augen verloren, wo ich mir selbst praktisch keine mehr basteln kann. Hoffentlich kommt das mit VS11 wieder.

Re: Jammer-Thread

Verfasst: 23.06.2012, 15:18
von eXile
CodingCat hat geschrieben:Wieso installiert sich das CUDA SDK in einen versteckten ProgramData-Ordner? Und sehe ich das richtig, dass in diesem 1,3 GiB-Paket nichts drin ist, was ich brauche? Steht SDK neuerdings für Sample-Documentation-Kit?
Ja, das machen das GPU Computing SDK und das Graphics SDK so; wobei ich mal versucht habe, die Pfade umzustellen, mit dem Ergebnis, dass dann nichts mehr lief. :evil:
CodingCat hat geschrieben:Danke, Custom Build Rules habe ich mit Visual Studio 2010 komplett aus den Augen verloren, wo ich mir selbst praktisch keine mehr basteln kann. Hoffentlich kommt das mit VS11 wieder.
Du könntest doch die .rules-Datei basteln, in ein Visual-Studio-2008-Projekt von Hand per Texteditor einbinden, und dieses automatisch in ein Visual-Studio-2010-Projekt umwandeln lassen; zumindest hier hat er dann passende .props-, .targets- und .xml-Dateien produziert.

Re: Jammer-Thread

Verfasst: 23.06.2012, 15:49
von CodingCat
ARGH. Stell dir vor es ist 2012 und CUDA nutzt keine Namespaces. Error: uint4 is ambiguous. OH REALLY? Was mache ich jetzt? Straßenmusiker?

Re: Jammer-Thread

Verfasst: 23.06.2012, 16:04
von dot
CodingCat hat geschrieben:Danke, Custom Build Rules habe ich mit Visual Studio 2010 komplett aus den Augen verloren, wo ich mir selbst praktisch keine mehr basteln kann. Hoffentlich kommt das mit VS11 wieder.
Der Umstieg auf MSBuild ist imo ein Segen. Irgendwelche Build Rules sind dagegen echt armselig. Zurück wünschen würd ich mir die niemals...

Re: Jammer-Thread

Verfasst: 23.06.2012, 16:11
von CodingCat
Für mich als Außenstehender ist MS Build nur ein Haufen C#-Fetzen unlesbar verpackt und verstreut in XML. Die Schnelle Integration von Kommandozeilenwerkzeugen über einen Konfigurationsdialog war dagegen extrem einfach. Wie das intern gespeichert und verarbeitet wird, ist mir dann egal, weil ich es nicht verstehen muss. ;)

Re: Jammer-Thread

Verfasst: 23.06.2012, 16:36
von CodingCat
CodingCat hat geschrieben:ARGH. Stell dir vor es ist 2012 und CUDA nutzt keine Namespaces. Error: uint4 is ambiguous. OH REALLY? Was mache ich jetzt? Straßenmusiker?
Es ist WIRKLICH aussichtslos. Nicht mal in eigenen Namespaces werden explizit mit using importierte Typen denen aus äußeren Namespaces (i.d.F. aus dem globalen) bevorzugt. Schluss, Aus, Ende.

Re: Jammer-Thread

Verfasst: 23.06.2012, 16:46
von eXile
Ich glaubs kaum; es scheint so, als ob die MSBuild-Extensions von CUDA (Ordner extras → visual_studio_integration → MSBuildExtensions) tatsächlich von Hand geschrieben wurden (zumindest sind da noch „TODO“s drin), und nicht automatisch konvertiert wurden. Wer tut sich denn so etwas an …

(In dem darüberliegenden Ordner ist auch die nachträgliche VS-Integration beschrieben.)
CodingCat hat geschrieben:Schluss, Aus, Ende.
CUDA-Header umschreiben? Ich nehme mal an, dein uint4 ist mit deren in der Größe übereinstimmend.

Andere Frage: Warum nun CUDA, und keine ComputeShader?

Re: Jammer-Thread

Verfasst: 23.06.2012, 16:50
von CodingCat
Weil mir thrust einigermaßen effizient implementierte parallele Primitive bietet, sobald ich mein Programm wieder compiliert bekomme. Damit kann ich eventuell mal einige Methoden mit Scans und Sortierungen evaluieren, ohne dabei wie eine Schnecke in der Wüste von Ansatz zu Ansatz zu kriechen, während Binding-Fehler und fxc-Bugs über mir kreisen.

Zu uint4: Nein, mein uint4 ist ein 4-Byte-Integer und findet sich entsprechend häufig im Programm. :evil:

Re: Jammer-Thread

Verfasst: 23.06.2012, 16:53
von Krishty
Da lach sich nochmal einer kaputt, dass meine Typen UnsignedInt4B heißen. Aber ohne namespace ist das doch wirklich lächerlich. Diese Anfänger.

Re: Jammer-Thread

Verfasst: 23.06.2012, 17:24
von Chromanoid
Krishty hat geschrieben:UnsignedInt4B
<3 Explizität ftw

Re: Jammer-Thread

Verfasst: 23.06.2012, 18:32
von CodingCat
Fazit des Tages: Komfortabel zusammengebaute Namespaces im Stil von namespace foo { using namespace bar::types; ... } kann man in C++ vergessen, sobald irgendeine dumme C-Bibliothek daher kommt und alles in ihren globalen Namen ertränkt. Wie ich jetzt am besten weitermache, weiß ich immer noch nicht. uint4 in mehreren tausend Dateien durch uint4b ersetzen und hoffen, dass dieser Name nie wieder mit irgendeiner anderen Bibliothek kollidiert? Alles bis zur Unlesbarkeit mit strikt qualifizierten Namen verschandeln? Schon wieder ein Tag im Eimer und schon wieder ein Grund mehr, C++ zu hassen.

Re: Jammer-Thread

Verfasst: 23.06.2012, 18:33
von Krishty
Wenn du schon nicht CUDA in ein namespace klemmen kannst, kannst du das nicht zumindest mit deinem eigenen Quelltext tun? namespace Cat { } um alles von dir? Dann würde CUDA dein uint4 nicht mehr finden und dein eigener Text erstmal im eigenen Namensbereich suchen.

Re: Jammer-Thread

Verfasst: 23.06.2012, 18:36
von CodingCat
Leider nein, diese Lösung habe ich bereits getestet. Auch in eigenen Namespaces werden alle globalen Symbole sofort in den Lookup mit einbezogen. Warum, ist mir gerade nicht mal klar. Normalerweise ärgert C++ einen ja damit, dass der Lookup gerade nicht fortgesetzt wird, sobald irgendein passender Name gefunden wurde. Btw. treten die Mehrdeutigkeiten gerade vor allem in meinen eigenen Namespaces auf, CUDA selbst nutzt seine Vektortypen in den Headers nicht mal.

Re: Jammer-Thread

Verfasst: 23.06.2012, 19:21
von Chromanoid
vielleicht irgendwas mit präprozessor-makro-magie hinbasteln?

Re: Jammer-Thread

Verfasst: 23.06.2012, 20:07
von CodingCat
Ich habe soeben in der Tat eine akzeptable Lösung mit Hilfe des Präprozessors hinbekommen. Tatsächlich unterscheiden sich die Namensauflösungsregeln zwischen using-Deklarationen und using namespace-Direktiven fundamental: Letztere packen für die Namensauflösung salopp gesagt alle Namen aus dem importierten Namespace in den ersten Namespace, der sowohl den importierten als auch den importierenden umschließt. Da in diesem Fall die Namespaces vollkommen disjunkt waren, hatten die importierten Namen somit alle exakt dieselbe Priorität wie die des globalen Namensraums. Einzelne using-Deklarationen hingegen packen den importierten Namen direkt in den importierenden Namespace. Damit war die Lösung, die relevanten Typen einzeln zu importieren. Das habe ich jetzt für diese speziellen Typen in ein Reimport-Numeric-Types-Makro gepackt. :-/

Re: Jammer-Thread

Verfasst: 23.06.2012, 20:14
von dot
Der uint4 Kram kommt in CUDA afaik nur aus einem Header und ist nicht direkt in der Sprache eingebaut. Evtl. könntest du einen namespace um die #includes der CUDA Header wrappen!?
eXile hat geschrieben:Ich glaubs kaum; es scheint so, als ob die MSBuild-Extensions von CUDA (Ordner extras → visual_studio_integration → MSBuildExtensions) tatsächlich von Hand geschrieben wurden (zumindest sind da noch „TODO“s drin), und nicht automatisch konvertiert wurden. Wer tut sich denn so etwas an …
Ich z.B...hab grad vor zwei Wochen eine custom MSBuild Integration für CUDA gebastelt, weil die mitgelieferte für unsere Zwecke unbrauchbar ist. MSBuild ist ein sehr mächtiges Werkzeug...

Re: Jammer-Thread

Verfasst: 23.06.2012, 20:17
von CodingCat
dot hat geschrieben:Der uint4 Kram kommt in CUDA afaik nur aus einem Header und ist nicht direkt in der Sprache eingebaut. Evtl. könntest du einen namespace um die #includes der CUDA Header wrappen!?
Da ich heute schon mit Namensauflösung voll ausgelastet war, kann ich das noch nicht wirklich beurteilen. Aber ich würde vermuten, dass die Dinger für CUDA doch ziemlich built-in sind, immerhin sind das die fundamentalen Vektortypen, mit denen in HLSL z.B. alles läuft?

struct __device_builtin__ __builtin_align__(16) uint4 sieht auf jeden Fall ziemlich built-in aus. ;)

Re: Jammer-Thread

Verfasst: 23.06.2012, 21:02
von CodingCat
Ich musste gerade feststellen, dass ich zwischen LEAN_NOINLINE, LEAN_NOTINLINE und LEAN_NOLTINLINE unterscheide. Manchmal frage ich mich selbst, wo ich das alles gelernt habe.

Falls es jemanden interessiert: LEAN_NOINLINE ist für Funktionen mit expliziter inline-Semantik aber ohne Inlining in der Codegenerierung, LEAN_NOTINLINE für Funktionen mit impliziter inline-Semantik ohne Code-Inlining und LEAN_NOLTINLINE für Funktionen ohne inline-Semantik und ohne Code-Inlining (LT steht hier wohl für Link-Time.) Für MSVC++ bedeutet das:

Code: Alles auswählen

#define LEAN_NOINLINE __declspec(noinline) inline // Gotta love dat combo
#define LEAN_NOTINLINE __declspec(noinline)
#define LEAN_NOLTINLINE __declspec(noinline)

Re: Jammer-Thread

Verfasst: 24.06.2012, 00:23
von CodingCat
Okay, das mit der tollen Integration von CUDA durch den C++-Precompiler hat sich dann wohl auch erledigt:
nvcc hat geschrieben:nontype "lean::strings::nullterminated_implicit<Char, Traits>::value_type [with Char=Char, Traits=Traits]" is not a type name

Re: Jammer-Thread

Verfasst: 24.06.2012, 11:49
von CodingCat
nvcc hat geschrieben:compiler is out of heap space