GPU für Vertexberechnungen nutzen
-
- Lazarusforum e. V.
- Beiträge: 394
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
GPU für Vertexberechnungen nutzen
Hallo,
ich arbeite gerade an einem Applet zu Welleninterferenz und habe da einige Performance-Schwierigkeiten. Weil ich viele Berechnungen mit Vektoren (welche ich auch auf das Matrizen-Prinzip übertragen könnte) vornehme, dachte ich, ich könnte ja mal versuchen, ein Paar Dinge von der Grafikkarte erledigen zu lassen.
Mit DirectX habe ich schon Erfagrungen, aber da sehe ich keine Möglichkeit, etwa die transformierten Vertices wieder auszulesen. Deswegen wollte ich mal fragen, ob jemand andere APIs kennt, die dafür ausgelegt sind, Berechnungen mit der Grafikkarte durchzuführen.
Wenn also jemand sowas schon mal gemacht hat, würde ich mich über ein Paar gute Links freuen.
Danke
ich arbeite gerade an einem Applet zu Welleninterferenz und habe da einige Performance-Schwierigkeiten. Weil ich viele Berechnungen mit Vektoren (welche ich auch auf das Matrizen-Prinzip übertragen könnte) vornehme, dachte ich, ich könnte ja mal versuchen, ein Paar Dinge von der Grafikkarte erledigen zu lassen.
Mit DirectX habe ich schon Erfagrungen, aber da sehe ich keine Möglichkeit, etwa die transformierten Vertices wieder auszulesen. Deswegen wollte ich mal fragen, ob jemand andere APIs kennt, die dafür ausgelegt sind, Berechnungen mit der Grafikkarte durchzuführen.
Wenn also jemand sowas schon mal gemacht hat, würde ich mich über ein Paar gute Links freuen.
Danke
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: GPU für Vertexberechnungen nutzen
Hast du vorher schon alles versucht?
Also:
- Einsparung von Call-Overhead (2x speed)
- Cache-Analyse (10x speed)
- Nutzung von mehreren Threads (4x speed)
- Nutzung von SSE (2x speed)
Die in Klammern angegebenen Speedups sind nur das Optimum. Falls dein Programm schon Cache-Optimal ist, wird es natürlich keinen Speedup geben.
Also:
- Einsparung von Call-Overhead (2x speed)
- Cache-Analyse (10x speed)
- Nutzung von mehreren Threads (4x speed)
- Nutzung von SSE (2x speed)
Die in Klammern angegebenen Speedups sind nur das Optimum. Falls dein Programm schon Cache-Optimal ist, wird es natürlich keinen Speedup geben.
- corpsman
- Lazarusforum e. V.
- Beiträge: 1498
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Für C gibt es ja die Cuda sachen, würd mich auch interesieren obs sowas für FPC gibt...
--
Just try it
Just try it
-
- Lazarusforum e. V.
- Beiträge: 394
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Ich nehme mal an, mit Call-Overhead ist gemeint, dass ich Parameter an Funktionen in globalen Variablen übergebe, anstatt direkt:
Das habe ich schon so gemacht. Wobei es mal eine echte Verbesserung wäre, wenn das der Compiler automatisch machte - man Notiert hinter der Funktion etwas wie fastcall; (Edit: es gibt für so was inline;) und dann wird das entsprechend implementiert. Naja.
Was mit Cache-Analyse gemeint ist, habe ich nicht verstanden - ich habe Funktionen, wie Sinus und Kosinus jedenfalls gepuffert.
Multithreading ist eingebaut - sonst hätte ich keine 97% CPU-Auslastung
SSE - weiß ich nicht. Muss man das extra einstellen?
Cuda wäre wohl ein Beispiel, ich habe aber noch keine Header für Pascal gefunden und das läuft ja auch nur auf den neusten Grafikkarten. Gut, ich hab' so eine. Aber man müsste sich da erst mal ordentlich rein arbeiten (http://developer.nvidia.com/cuda-downloads" onclick="window.open(this.href);return false;)...
Wahrscheinlich wird dafür jetzt die Zeit zu knapp, aber das steht ganz ober auf meiner Liste
Code: Alles auswählen
var P1,P1,PRes : integer;
P1 := 8563;
P2 := 73566;
DieFunktion;
Ergebnis := PRes;
// statt
Ergebnis := DieFunktion(8563,73566);
Das habe ich schon so gemacht. Wobei es mal eine echte Verbesserung wäre, wenn das der Compiler automatisch machte - man Notiert hinter der Funktion etwas wie fastcall; (Edit: es gibt für so was inline;) und dann wird das entsprechend implementiert. Naja.
Was mit Cache-Analyse gemeint ist, habe ich nicht verstanden - ich habe Funktionen, wie Sinus und Kosinus jedenfalls gepuffert.
Multithreading ist eingebaut - sonst hätte ich keine 97% CPU-Auslastung
SSE - weiß ich nicht. Muss man das extra einstellen?
Cuda wäre wohl ein Beispiel, ich habe aber noch keine Header für Pascal gefunden und das läuft ja auch nur auf den neusten Grafikkarten. Gut, ich hab' so eine. Aber man müsste sich da erst mal ordentlich rein arbeiten (http://developer.nvidia.com/cuda-downloads" onclick="window.open(this.href);return false;)...
Wahrscheinlich wird dafür jetzt die Zeit zu knapp, aber das steht ganz ober auf meiner Liste
Zuletzt geändert von MitjaStachowiak am Do 21. Jul 2016, 12:08, insgesamt 1-mal geändert.
- corpsman
- Lazarusforum e. V.
- Beiträge: 1498
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Mit unnötigen Calls meint er glaubig eher, dass du die Funktion ers gar nicht aufrufst. quasi ein "inline" ich weis aber nicht ob FPC das kann,
was du dann auch noch machen kannst ist Loop enroling wenn du etwas der Art
schreibst du stattdessen
dann sparst du dir den Rücksprung der If, das geht natürlich nicht immer...
evtl googelst du mal was es noch so Speedo optimierungen gibt. Prinzipiell würde ich aber sagen, bietet immer der Code das meiste Speedup Potential. Dazu müstest du ihn allerdings veröffentlichen. Ich hab das hier im Forum auch schon ein paar mal gemacht, ist echt irre was dabei raus kommt, wenn man andere auch mal drüber sehen läst.. ( In Send_get_file hatte ich so nen speedup von gut 1000%, und alles nur, weil wir ein paar Variablen anders zugreifen liesen )
gruß
Corpsman
was du dann auch noch machen kannst ist Loop enroling wenn du etwas der Art
Code: Alles auswählen
for i := 0 to 1 do begin
xy in abhängigkeit von i
end;
schreibst du stattdessen
Code: Alles auswählen
i := 0;
xy in abhängigkeit von i
i := 1;
xy in abhängigkeit von i
dann sparst du dir den Rücksprung der If, das geht natürlich nicht immer...
evtl googelst du mal was es noch so Speedo optimierungen gibt. Prinzipiell würde ich aber sagen, bietet immer der Code das meiste Speedup Potential. Dazu müstest du ihn allerdings veröffentlichen. Ich hab das hier im Forum auch schon ein paar mal gemacht, ist echt irre was dabei raus kommt, wenn man andere auch mal drüber sehen läst.. ( In Send_get_file hatte ich so nen speedup von gut 1000%, und alles nur, weil wir ein paar Variablen anders zugreifen liesen )
gruß
Corpsman
--
Just try it
Just try it
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: GPU für Vertexberechnungen nutzen
Ich dachte ich hätte irgendwo gelesen das moderne Prozessoren schleifen schneller abarbeiten, da die den code im cpu front-end besser bzw nur einmal aufbearbeitet werden muss...
Zumindest dachte ich das immer, kann auch sein das das falsch ist...
Zumindest dachte ich das immer, kann auch sein das das falsch ist...
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: GPU für Vertexberechnungen nutzen
MAC hat geschrieben:Ich dachte ich hätte irgendwo gelesen das moderne Prozessoren schleifen schneller abarbeiten, da die den code im cpu front-end besser bzw nur einmal aufbearbeitet werden muss...
Zumindest dachte ich das immer, kann auch sein das das falsch ist...
Stimmt zwar, ist aber so eine allgemeine und schwammige Formulierung mit "moderne Prozessoren" "schneller" - natürlich tun sie das.
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Wäre OpenCl eine Lösung? http://wiki.freepascal.org/OpenCL
Ein Beispiel, das über <fpc>/src/packages/opencl/examples hinausgeht, würde mich auch interessieren.
Ein Beispiel, das über <fpc>/src/packages/opencl/examples hinausgeht, würde mich auch interessieren.
-
- Lazarusforum e. V.
- Beiträge: 394
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Ja, einen Versuch ist es wert...
Vielleicht habe ich mal wieder Tomaten auf den Augen, aber wo kann man sich die FPC-Header für OpenCL herunterladen?
Vielleicht habe ich mal wieder Tomaten auf den Augen, aber wo kann man sich die FPC-Header für OpenCL herunterladen?
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: GPU für Vertexberechnungen nutzen
In Google suchen, falls keine Suchergebnisse, selber übersetzen.
Und OpenCL hat ein reines C-Interface und nicht soo viele API-Funktionen.
Die Header findest du hier: http://www.khronos.org/registry/cl/
Und OpenCL hat ein reines C-Interface und nicht soo viele API-Funktionen.
Die Header findest du hier: http://www.khronos.org/registry/cl/
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Ich habe doch extra das Verzeichnis mit aufgeschrieben; einfach eine Ebene über examples nachsehen: <fpc>/src/packages/opencl/src.
-
- Lazarusforum e. V.
- Beiträge: 394
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Ah, ich glaube, ich hab's: http://code.google.com/p/delphi-opencl/ ... r&can=2&q=
[Edit]
Oh, der Pfad war lokal, für das Lazarusprogrammverzeichnis gedacht C:\lazarus\fpc\2.4.4\source\packages\opencl.
Naja, ich denke, ich werde mir erstmal ein kleines Handbuch kommen lassen.
[Edit]
Oh, der Pfad war lokal, für das Lazarusprogrammverzeichnis gedacht C:\lazarus\fpc\2.4.4\source\packages\opencl.
Naja, ich denke, ich werde mir erstmal ein kleines Handbuch kommen lassen.
-
- Beiträge: 1
- Registriert: Do 28. Jan 2016, 01:31
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xx32, xx64
- Wohnort: Stade
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
HI,
ich bin neu hier und kenne die Struktur noch nicht.
Ich habe die erwähnte cl.pas anläßlich eines Vorhabens von mir auch gefunden
und festgestellt, dass sie sehr alt ist.(2009 ?)
Daraufhin habe ich die aktuellen Header cl.h der Khronos-group von 2.0 ergänzt.
(2.1 läuft noch nicht auf meiner Grafikkarte )
Jetzt weiß ich nur nicht, wie ich die verfügbar machen kann (zumal ja Lazarus überarbeitet wird)
Scheint allerdings nach meiner Recherche wohl auch kein sonderlicher Bedarf zu bestehen.
Obwohl die Möglichkeiten ja wirklich genial sind.
Bitte klärt mich auf...
Gruß
Frank
ich bin neu hier und kenne die Struktur noch nicht.
Ich habe die erwähnte cl.pas anläßlich eines Vorhabens von mir auch gefunden
und festgestellt, dass sie sehr alt ist.(2009 ?)
Daraufhin habe ich die aktuellen Header cl.h der Khronos-group von 2.0 ergänzt.
(2.1 läuft noch nicht auf meiner Grafikkarte )
Jetzt weiß ich nur nicht, wie ich die verfügbar machen kann (zumal ja Lazarus überarbeitet wird)
Scheint allerdings nach meiner Recherche wohl auch kein sonderlicher Bedarf zu bestehen.
Obwohl die Möglichkeiten ja wirklich genial sind.
Bitte klärt mich auf...
Gruß
Frank
- corpsman
- Lazarusforum e. V.
- Beiträge: 1498
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: GPU für Vertexberechnungen nutzen
Es gibt nen Bugtracker da könntest du nen Report machen und deinen Patch vorschlagen. Oder du postest deine Ergebnisse hier und bittest einen Mitleser das zu machen, meistens lesen das dann auch Lazarus IDE Entwickler und setzen es direkt um.
--
Just try it
Just try it