GPU für Vertexberechnungen nutzen

Rund um die LCL und andere Komponenten
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

GPU für Vertexberechnungen nutzen

Beitrag von MitjaStachowiak »

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 :)

carli
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

Beitrag von carli »

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.

Benutzeravatar
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

Beitrag von corpsman »

Für C gibt es ja die Cuda sachen, würd mich auch interesieren obs sowas für FPC gibt...
--
Just try it

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: GPU für Vertexberechnungen nutzen

Beitrag von MitjaStachowiak »

Ich nehme mal an, mit Call-Overhead ist gemeint, dass ich Parameter an Funktionen in globalen Variablen übergebe, anstatt direkt:

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 :mrgreen:
Zuletzt geändert von MitjaStachowiak am Do 21. Jul 2016, 12:08, insgesamt 1-mal geändert.

Benutzeravatar
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

Beitrag von corpsman »

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

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

MAC
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

Beitrag von MAC »

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...

Code: Alles auswählen

Signatur := nil;

carli
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

Beitrag von carli »

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.

Scotty
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

Beitrag von Scotty »

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.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: GPU für Vertexberechnungen nutzen

Beitrag von MitjaStachowiak »

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?

carli
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

Beitrag von carli »

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/

Scotty
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

Beitrag von Scotty »

Ich habe doch extra das Verzeichnis mit aufgeschrieben; einfach eine Ebene über examples nachsehen: <fpc>/src/packages/opencl/src.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: GPU für Vertexberechnungen nutzen

Beitrag von MitjaStachowiak »

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. :oops:
Naja, ich denke, ich werde mir erstmal ein kleines Handbuch kommen lassen.

FrankHD
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

Beitrag von FrankHD »

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

Benutzeravatar
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

Beitrag von corpsman »

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

Antworten