Moin,
ich möchte mich ins Thema CPU computing einarbeiten, habe aber nur
grundlegende Erfahrung mit dem OpenGL Core Profile sowie Legacy OpenGL.
Könnt ihr mir evtl. ein kleines Beispiel oder ein Tutorial nennen, das
zeigt, wie man GPU computing betreibt in OpenGL-Versionen, die keine
Compute Shader kennen? Ich habe gelesen, dass Vertex und Fragment Shader
auch für GPU computing zweckentfremdet werden können, allerdings finde
ich nirgendwo beschrieben, wie es geht. Wie rufe ich die Shader auf,
ohne etwas zu rendern?
Ich habe nur eine alte Grafikkarte, die bis zu OpenGL 3.3 unterstützt,
meines Wissens gibt es Compute Shader erst ab OpenGL 4.3, weshalb ich
eine Alternative suche.
Ebenfalls interessiert mich, wie ich GPU computing in WebGL hinbekomme,
was Compute Shader nur in Developmentversionen von Chrome unter Windows
unterstützt, aber nicht in der breiten Masse von Browsern.
Danke
Arno
Nein, ich suche einen Ansatz, der auf OpenGL oder WebGL aufbaut, der
also nicht speziellere Anforderungen an die Hardware stellt.
Cuda setzt Nvidia voraus.
WebCL wird zwar diskutiert, ist aber nicht wirklich marktreif.
Arno schrieb:> Nein, ich suche einen Ansatz, der auf OpenGL oder WebGL aufbaut, der> also nicht speziellere Anforderungen an die Hardware stellt.
Das ist gelinde gesagt Blödsinn. Denn schon der Algorithmus selbst
stellt Anforderungen an die Hardware - durch Nutzung bestimmter Shader
(= floating point unit in der GPGPU) Features oder alleine durch den
benötigten RAM auf der GraKa.
Arno schrieb:> Wie rufe ich die Shader auf,> ohne etwas zu rendern?
Gar nicht. Man rendert in eine Textur und liesst die aus, was oftmals
recht langsam ist. Zwecks Visualisierung kann man sich bei geschickter
Programmierung den Auslese Schitt sparen.
Die Datenmenge die eine Webseite realistisch mit einem Client im
Internet in Echtzeit austauschen kann, sollte sich in JavaScript
abhandeln lassen.
Ich würde auch OpenCL für sowas empfehlen, das kann man auch mit OpenGL
kombinieren, gewisse buffer sharen, etc. Funktioniert zwar noch besser
mit OpenCL+Vulkan. Das zeugs ist standard bei ernst zunehmenden
Anwendungen. Ist leider aber etwas kompliziert, viel Aufwand zur
Initialisierung usw. Auf keinen fall Cuda nutzen, dass ist so eine
proprietäre nvidia creation. WebCL hat sich leider noch nicht
durchgesetzt, und ist in Vergessenheit geraten, ich empfehle deshalb,
sowas einfach nativ zu machen, statt im browser.
Jim M. schrieb:> Denn schon der Algorithmus selbst> stellt Anforderungen an die Hardware
Mach dir darüber mal keine Sorgen. Ich kann den Algorithmus mit viel
oder wenig Resourcen ausführen, brauche nur Integer Arithmetik.
Jim M. schrieb:> Man rendert in eine Textur und liesst die aus, was oftmals> recht langsam ist.
Also übergibt man die Inputparameter als Textur und erhält das Ergebnis
ebenso? Dann ist nur noch die Frage, wie starte ich in OpenGL 3.3 und
WebGL einen Shader auf, der nicht auf den Bildschirm rendert?
Jim M. schrieb:> Man rendert in eine Textur und liesst die aus, was oftmals> recht langsam ist.
@Jim M. (turboj), kannst du bitte noch mal antworten, wie ich das mache?
Ich kenne nur Vertex und Fragment Shader, um in ein Window zu rendern.
Welche Shader benutze ich, wenn das Ergebnis nicht dargestellt, sondern
nur ausgelesen werden soll?
Arno schrieb:> Welche Shader benutze ich, wenn das Ergebnis nicht dargestellt, sondern> nur ausgelesen werden soll?
Ob man auf den Bildschirm, eine Textur oder einen render buffer
zeichnet, ändert nichts an der Pipeline oder den verwendbaren arten von
Shadern.
Dies ist auch keine Antwort auf meine Frage,
Hat jemand ein Link zu einem Beispiel, wie ich GPU computing mit OpenGL
3.3 oder WebGL mache? Dann wäre ich euch sehr dankbar.
Wenn ihr mir nur erklären wollt, dass es Probleme gibt, die dafür zu
komplex sind, weil sie 1000 GB RAM und 128bit Floating Point auf der GPU
benötigen, kann ich euch versichern, dass mir dies durchaus bewusst ist.
DPA schrieb:> Bei der Methode kann man den fragment shader für jedes Pixel der> Textur aufrufen lassen, indem man ein vollbild Quadrat rendert. Die> jeweilige operation kann aber nicht auf andere Pixel zugreifen. Es ist> oft schwierig bis unmöglich, seine Wunschrechnung auf sowas abzubilden.
Danke, damit kommen wir der Sache schon näher.
Dass jeder shader nur auf einem Pixel arbeitet, ist tatsächlich so erst
mal nicht brauchbar. Aber es hilft schon mal, die Anzahl der Prozesse
festzulegen.
Jeder Prozess wird ja eine bestimmte Menge Inputdaten brauchen. Könnte
ich dazu weitere Texturen übergeben, von denen sich jeder Prozess einen
bestimmten Bereich holt, den er dann bearbeitet?
Arno schrieb:> Jeder Prozess wird ja eine bestimmte Menge Inputdaten brauchen. Könnte> ich dazu weitere Texturen übergeben, von denen sich jeder Prozess einen> bestimmten Bereich holt, den er dann bearbeitet?
Was versteht du unter "Prozess"? Ein Shader wird gestartet, liest bei
seiner Ausführung irgendwelche Inputdaten aus Texturen und
Uniform-Variablen, erzeugt dann einen Ausgabewert und beendet sich
wieder.
Unter Windows Direct3D kann man es folgendermassen machen
(per Erweiterungen so direkt auf OpenGL übertragbar, da
kenne ich mich aber kaum aus):
Gerendert wird in eine sogenannte RenderTargets (kann
auch als Textur verwendet werden, aber dann nicht im
aktuellen Renderprozess), die Daten werden entweder
per Variablen/Konstanten gesetzt oder per Texture(n)
zur Verfügung gestellt.
Die Shader sind im Prinzip ausschliesslich PixelShader,
die z.B. (nicht zwingend) von der Texture(n) Daten
entgegennehmen (Texture(n) auslesen), "umrechnet" und dann
im Rendertarget zeichnet. Als Format kann im Prinzip
alles Denkbare gewählt werden: int, float, int2, int3,
int4, etc.
Der Vertexshader projeziert Vertices entlang der z-Achse,
gezeichnet wird nur ein einzelnes Quadrat.
In Direct3D wird dazu ein RenderTarget, Variablen/Konstanten,
Texturen und Rendertargets generiert, die beiden Shader
gesetzt und der Zeichenvorgang gestartet. Soll das
Rendertarget in einem nachfolgenden Rechenprozess als
Quelle verwendet werden, dann muss es als Texture gesetzt
und ein neues Target als Rendertarget gesetzt werden.
Um das genau zu verstehen, liess dir mal das Tutorial
unter Direct3D 9 durch und arbeite dich dann in Shader
und in Texturen, speziell Rendertargets und Formate ein.
Ist nicht sehr kompliziert. Aber sicherlich gibt's für
OpenGL ähnliche Tutorials, so dass du dir Direct3D
sparen kannst. Der Vorgang ist aber der gleiche.
Sigi schrieb:> Um das genau zu verstehen, liess dir mal das Tutorial> unter Direct3D 9 durch
Nein Danke! Um meine Frage genau zu verstehen, lies sie dir mal durch.
Warum muss hier eigentlich jeder meine Frage so uminterpretieren, dass
er meint, seinen Senf dazugeben zu könnnen? Du hast zwar keine Ahnung
von OpenGL, aber hast schon mal was von Direct3D gehört und musst das
zum besten geben. Die anderen haben zwar auch nichts beizutragen, können
aber immerhin eine Reihe zusätzliche Annahmen zu meiner Frage treffen,
um dann sagen zu können: unter der und der und der Annahme ist OpenGL
3.3 nicht geeignet.
Könnt ihr nicht einfach GAR NICHTS antworten, wenn ihr die Frage
versteht oder keine Antwort habt?
Arno schrieb:> Mittlerweile habe ich eine Lösung gefunden, wie ich mittels WebGL> oder OpenGL 3.3 komplexe Rechnungen auf der GPU durchführen kann.> Danke für nichts!
Für interessierte, wäre es dann net, dies auch zu sagen WAS du gefunden
hast. ☺️
Rene K. schrieb:> Für interessierte, wäre es dann net, dies auch zu sagen WAS du gefunden> hast. ☺️
Dann mach doch deinen eigenen Thread dazu auf und erfahre wie schön man
hier verarscht wird. Oder such selbst.
Ich bin mit dieser Seite durch. Was man an oberflächlichen und
unbrauchbaren Antworten von selbstverliebten Möchtegernexperten bekommt
ist unter aller Sau.
Arno schrieb:> Dann mach doch deinen eigenen Thread dazu auf und erfahre wie schön man> hier verarscht wird. Oder such selbst.>> Ich bin mit dieser Seite durch. Was man an oberflächlichen und> unbrauchbaren Antworten von selbstverliebten Möchtegernexperten bekommt> ist unter aller Sau.
Mimimi, zieh dir doch ein Röckchen an ^^
Arno schrieb:> Oder such selbst.
Dankeschön, aber eines sollte man dann doch immer bedenken: "Wer im
Glashaus sitzt!" Denn so wie du mir gerade entgegen kommst, bist du kein
Deut besser als die Leute die du hier beschimpfst.
Also: Dankeschön für nix.
Arno schrieb:> Nein Danke! Um meine Frage genau zu verstehen, lies sie dir mal durch.>> Warum muss hier eigentlich jeder meine Frage so uminterpretieren, dass> er meint, seinen Senf dazugeben zu könnnen? Du hast zwar keine Ahnung> von OpenGL, aber hast schon mal was von Direct3D gehört und musst das> zum besten geben. Die anderen haben zwar auch nichts beizutragen, können> aber immerhin eine Reihe zusätzliche Annahmen zu meiner Frage treffen,> um dann sagen zu können: unter der und der und der Annahme ist OpenGL> 3.3 nicht geeignet.>> Könnt ihr nicht einfach GAR NICHTS antworten, wenn ihr die Frage> versteht oder keine Antwort habt?
Da gibt man dir eine Hilfestellung zu deiner Frage und deine
Reaktion dazu ist einfach nur unverschähmt, auch zu anderen
Forenteilnehmern, siehe z.B. folgende Bemerkung von dir:
Arno schrieb:> Ich bin mit dieser Seite durch. Was man an oberflächlichen und> unbrauchbaren Antworten von selbstverliebten Möchtegernexperten bekommt> ist unter aller Sau.
Meine Hilfestellung unter Direct3D (war ich seit über 20 Jahren
mache, 100te Simulationen geschrieben, teils durch OpenGL begleitet)
lässt sich so 1:1 in OpenGL umsetzen. Wenn du aber zu dumm bist, dir
ein Tutorial von einer ähnlichen Umgebung/Bibliothek in deine
Umgebung/Bib. zu übersetzen, dann ist dir auch nicht mehr zu helfen.
Und nach deiner unflätigen Art ggÜ den Mitforisten wird DIR auch
keiner mehr unter die Arme greifen.
Dankeschön für deine eindrucksvolle Bestätigung, dass du zu dem Typus
gehörst, auf dessen Antworten man unbedingt verzichten will.
Nun regt euch noch schon auf und lasst euch das Wochenende versauen. Ich
werde hier keine Hilfe mehr anbieten oder suchen.
Oh man, bei dem Verhalten des TO hätte ich mir wirklich keine Lösung für
WebGL 1 ausdenken müssen. Es addiert zahlen aus 2 Arrays. Aber
vielleicht hilfst ja jemand anderem später mal noch:
https://jsfiddle.net/yx8fhbtz/5/
Zu beachten ist, dass da vermutlich noch ein paar bugs drin sein
könnten, und das, da texelFetch in WebGL1 noch nicht verwendet werden
kann, und texture2D einen float nimmt, ich nicht ausschliessen kann,
dass das auch mal nen Wert überspringen/verdoppeln könnte.
Arno schrieb:> Dankeschön für deine eindrucksvolle Bestätigung, dass du zu dem Typus> gehörst, auf dessen Antworten man unbedingt verzichten will.>> Nun regt euch noch schon auf und lasst euch das Wochenende versauen. Ich> werde hier keine Hilfe mehr anbieten oder suchen.
Oh man, da schütest du ja einen wirklich ekelhaften
Kübel Gülle über deinen Mitmenschen aus, einfach
nur EKELHAFT.
DPA schrieb:> Zu beachten ist, dass da vermutlich noch ein paar bugs drin sein> könnten, und das, da texelFetch in WebGL1 noch nicht verwendet werden> kann, und texture2D einen float nimmt, ich nicht ausschliessen kann,> dass das auch mal nen Wert überspringen/verdoppeln könnte.
In deiner Lösung lässt sich iE mein Ansatz wiederfinden.
Da ich aber kaum WebGL kenne und vlt. einiges übersehe:
Deine Textur-Sampler müssen im SAMPLE-Modus laufen, sonst
greifst du evtl. bei den Texturdaten leicht daneben und
kriegst leicht verfälschte Ergebnisse.
Ist das Ein- und Auslesen der Datenarrays aufwendig?
Geht das schnell (z.B. bzgl. CPU-Zyklen?
Sigi schrieb:> Deine Textur-Sampler müssen im SAMPLE-Modus laufen, sonst> greifst du evtl. bei den Texturdaten leicht daneben und> kriegst leicht verfälschte Ergebnisse.
Ich wiederum kann mich mit Direct3D nicht aus. Ich nehme an du meinst
damit dass, was man in WebGL pro Textur setzt?
Zugriff auf einzelne Textur pixel per integer (fetchTexel) stat
normalisiert per float (texture2D) geht aber erst seit WebGL 2, und bei
WebGL 1 noch nicht. Ich traue den floats nicht so ganz, auch wenn das
theoretisch passen müsste. Mit WebGL 2 wäre das alles allgemein viel
einfacher als mit WebGL 1.
Sigi schrieb:> Ist das Ein- und Auslesen der Datenarrays aufwendig?> Geht das schnell (z.B. bzgl. CPU-Zyklen?
Da bin ich auch überfragt. Performanceoptimierungen waren noch nie so
mein ding, da wäre sicher noch Luft nach oben.
GP-GPU Computing mit Javascript ist mit folgender Bibliothek möglich:
http://gpu.rocks/
Habe das schon getestet. Funktioniert, hat aber in meiner Anwendung
nichts gebracht (Speicheroverhead war zu groß).
Kauf' dir eine billige Nvidia Gamer-Card, schnapp dir ein vernuenftiges
Buch wie dieses..
https://www.wiley.com/en-us/Professional+CUDA+C+Programming-p-9781118739327
..anstatt ein ganzes Forum mit einer Magermilch-Loesung verrueckt zu
machen.
Ach ja, die Google Cloud bietet Nvidia GPU cores an (warum wohl..).