DGL
https://delphigl.com/forum/

Spielerei mit Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=11220
Seite 1 von 1

Autor:  mathias [ Mo Aug 04, 2014 22:06 ]
Betreff des Beitrags:  Spielerei mit Shader

Mit dem Shader kann man auch Spielereien machen.

Vertex-Shader:
Code:
  1. #version 130
  2. in vec3 inPos;
  3. in vec3 inColor;
  4.  
  5. uniform mat4 Matrix;
  6.  
  7. out vec4 Color;
  8. out vec4 p;
  9.  
  10. void main(void)
  11. {
  12.   gl_Position = Matrix * vec4(inPos, 1.0);
  13.   p = gl_Position;
  14.   Color = vec4(inColor, 1.0);
  15. }


Fragment-Shader:
Code:
  1. #version 130
  2. in vec4 Color;     // interpolierte Farbe vom Vertexshader
  3. out vec4 outColor; // ausgegebene Farbe
  4.  
  5. in vec4 p;
  6.  
  7. void main(void)
  8. {
  9.  
  10.   if ((p.x > -0.4) && (p.x < 0.4) && (p.y > -0.4) && (p.y < 0.4))
  11.   {
  12.     outColor = vec4(p.x * 2, p.y * 2, 0.0, 1.0);
  13.   }
  14.   else
  15.   {
  16.     outColor = Color;
  17.   }
  18. }


Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 19.5 KiB | 12797-mal betrachtet ]

Autor:  mathias [ Di Aug 05, 2014 17:39 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

Jetzt habe ich den Shader ein bisschen mehr gefordert. :lol:

Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.

Das sieht man was für ein Power in der Grafik-Einheit steckt.

Code:
  1. #version 130
  2. in vec4 Color;
  3. out vec4 outColor;
  4.  
  5. in vec4 p;
  6.  
  7. float o = 1.2;
  8. float u = -1.2;
  9. float  l = -2.2;
  10. float  r = 1.2;
  11.  
  12. float maxX = 2;
  13. float maxY = 2;
  14.  
  15. float Farbe, x, y;
  16. float SqrX, SqrY, XPos, YPos, XStep, YStep, creal, cimag, links, rechts, oben, unten;
  17.  
  18. void main(void)
  19. {
  20.  
  21.     links = l;
  22.     rechts = r;
  23.     oben = o;
  24.     unten = u;
  25.     XStep = (rechts - links) / maxX;
  26.     YStep = (oben - unten) / maxY;
  27.  
  28.     creal = p.x * 1.5 - 0.3;
  29.  
  30.     cimag = p.y * 1.5;
  31.  
  32.     Farbe = 0;
  33.     XPos = 0;
  34.     YPos = 0;
  35.  
  36.     do
  37.     {
  38.         SqrX = XPos * XPos;
  39.         SqrY = YPos * YPos;
  40.         YPos = 2 * XPos * YPos + cimag;
  41.         XPos = SqrX - SqrY + creal;
  42.         Farbe += 1;
  43.     }
  44.     while (!((SqrX + SqrY > 8) || (Farbe > 100)));
  45.  
  46.     if (Farbe > 100)
  47.     {
  48.         Farbe = 0;
  49.     }
  50.  
  51.     outColor = vec4(Farbe / 100, Farbe / 100, Farbe / 100, 1.0);
  52. }
  53.  


Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 19.63 KiB | 12778-mal betrachtet ]

Autor:  mathias [ Do Aug 07, 2014 17:27 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

Zitat:
Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.

Ich dachte es lege daran, das ich Real anstelle single verwendete, aber dies hatte keine grossen Unterschied gemacht.

Ist die GPU so viel schneller als der Mathe-Teil der CPU ?
Oderr läuft da etwa etwas anders. ?

Autor:  yunharla [ Do Aug 07, 2014 18:11 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

mathias hat geschrieben:
Zitat:
Interessanterweise, habe ich den gleichen Code mit Pascal, und das Programm ist sehr lahm.

Ich dachte es lege daran, das ich Real anstelle single verwendete, aber dies hatte keine grossen Unterschied gemacht.

Ist die GPU so viel schneller als der Mathe-Teil der CPU ?
Oderr läuft da etwa etwas anders. ?


Naja wenn man mal von herstellerspezifischen Kram, wie etwa die verwendeten Datentypen, absieht, dann hast du bei der GPU zwei große Vorteile:
- Du kannst mehr Sachen gleichzeitig machen.
- Du hast in der Regel schnelleren Speicher.

Dadurch kann der jeweilige Compiler halt auch ganz anderen Output erzeugen. Deine Schleife könnte zum Beispiel X mal gleichzeitig durchlaufen, wohingegen
auf der CPU alles nacheinander passiert. Außerdem musst du auch noch Bedenken das die GPU im Prinzip eine rein funktionale Geschichte ist und Pascal eben
Imperativ. Sprich du hast eigentlich gar keine Variablen sondern nur Parameter.

Autor:  Lord Horazont [ Do Aug 07, 2014 20:23 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

yunharla hat geschrieben:
- Du hast in der Regel schnelleren Speicher.

Das würde ich so nicht unterschreiben. Besonders die günstigeren Karten haben eher sowas wie 1200 MHz, was am unteren bis mittleren Rande des DDR3-Spektrums angesiedelt ist (da bin ich voll reingelaufen. meine GPU macht mit CUDA ne schlechtere Performance als meine CPU).

Ich würde die Parallelität da viel höher gewichten. Das ist ja der Grund, warum man viele Dinge nicht machen kann (Framebuffer gleichzeitig als Textur und als Render Target gebunden haben z.B.; da müsste man serialisieren, damit das hinhaut).

viele Grüße,
Horazont

Autor:  OpenglerF [ Do Aug 07, 2014 20:47 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

Zitat:
Framebuffer gleichzeitig als Textur und als Render Target gebunden haben

Das geht aber zum Beispiel mit "NV_texture_barrier".

Autor:  yunharla [ Fr Aug 08, 2014 17:03 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

Lord Horazont hat geschrieben:
yunharla hat geschrieben:
- Du hast in der Regel schnelleren Speicher.

Das würde ich so nicht unterschreiben. Besonders die günstigeren Karten haben eher sowas wie 1200 MHz, was am unteren bis mittleren Rande des DDR3-Spektrums angesiedelt ist (da bin ich voll reingelaufen. meine GPU macht mit CUDA ne schlechtere Performance als meine CPU).

Ich würde die Parallelität da viel höher gewichten. Das ist ja der Grund, warum man viele Dinge nicht machen kann (Framebuffer gleichzeitig als Textur und als Render Target gebunden haben z.B.; da müsste man serialisieren, damit das hinhaut).

viele Grüße,
Horazont


Das kommt ganz darauf an was man darunter Versteht. Ich habe hier jetzt keine aktuellen Zahlen im Kopf, es kann also mittlerweile auch schneller sein.

Du musst hier zwischen Off- und On-Chip Speicher unterscheiden. Beim Off-Chip Speicher besteht im Prinzip kein Unterschied zur CPU. Sprich je nach Qualitaet der Ware bekommst du mal schnelleren oder langsameren Speicher. Der On-Chip Speicher ist hingegen der Grosse Unterschied im Vergleich zur CPU. Denn hier sind einfach mehr Baenke zur Verfuegung als auf der CPU und man ist somit schneller.

Beim Off-Chip Speicher gibt es in Cuda 3 verschiedene Arten:
- Global, kann sowohl von der GPU als auch der CPU angefasst werden und ist somit die langsamste Variante. Ausserdem kommt hier noch der jeweilige Anschluss, also z.B. PCIe, als Bottleneck hinzu.
- Constant oder Texture, ist Read-Only Speicher und damit sehr speziell. Der einzige Vorteil gegenueber den globalen Speicher ist halt das man in der Regel weniger Bandbreite braucht.
- Local, wird von den Threads fuer automatische Array Variablen benutzt. Dabei handelt es sich aber lediglich um Spezielle Form von Globalen Speicher die nur geringfuegig schneller ist. Also auch wieder eher ne reine Optimierung statt echten Vorteil.

Beim On-Chip Speicher gibt es nun 2 verschiedene Arten unter Cuda:
- Register, speichern im Gegensatz zur CPU ALLE automatischen Variablen bis auf Arrays. Das ist aber eher ein Vorteil der durch die schon angesprochene Funktionale Architektur entsteht als ein tatsaechlicher Unterschied.
- Shared und L1-Cache, besitzen jeweils eine Bank pro Thread. Soweit ich weiss arbeitet Cuda hier mit 64kb Einheiten pro Block die in 16kb Schritten auf Shared oder L1 (16+48, 32+32 oder 48 + 16) Verteilt werden. Das Maximum liegt hier bei insgesamt 32 Baenken pro Warp, 512/32 pro Block (also 16 Warps) und 2 Blocks pro Grid aber keine Ahnung ob das irgendeine GPU ausreizt.

Alles in Allen ist eine GPU also genau das gleiche wie ein moderner Intel. Der einzige Unterschied ist halt du mehr Threads hast die auf weniger Speicher zugreifen und deine Variablen an sich in schnelleren Speicher landen.

Autor:  mathias [ Fr Aug 08, 2014 17:48 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

Zitat:
Du musst hier zwischen Off- und On-Chip Speicher unterscheiden. Beim Off-Chip Speicher besteht im Prinzip kein Unterschied zur CPU. Sprich je nach Qualitaet der Ware bekommst du mal schnelleren oder langsameren Speicher. Der On-Chip Speicher ist hingegen der Grosse Unterschied im Vergleich zur CPU. Denn hier sind einfach mehr Baenke zur Verfuegung als auf der CPU und man ist somit schneller.

Ich dachte, das bisschen Quellcode ist im schnellen L1-Cache der CPU.

Autor:  Lord Horazont [ Sa Aug 09, 2014 11:22 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

@mathias: Auf Cache kannst du dich nicht mehr wirklich verlassen, sobald Multitasking im Spiel ist. Den teilst du dir ja mit anderen Programmen und dem Kernel.

Die Parallelität der GPU ist aber auf jeden Fall etwas, was so bei per-Pixel-Code extrem viel Performance rausholt. Einfach weil da zig Threads gleichzeitig dran rechnen, während auf der CPU bei naiver implementierung nur /ein/ Thread dran rechnet.

grüße
Horazont

Autor:  yunharla [ So Aug 10, 2014 00:52 ]
Betreff des Beitrags:  Re: Spielerei mit Shader

Gerade noch eine schöne Präsentation von Nvidia gefunden.
ftp://download.nvidia.com/developer/cud ... I_Arch.pdf

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/