AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OpenCL / CUDA

Ein Thema von Michael II · begonnen am 19. Sep 2023 · letzter Beitrag vom 6. Okt 2023
Antwort Antwort
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#1

OpenCL / CUDA

  Alt 19. Sep 2023, 17:09
Alle paar Jahre (zuletzt im 2004) nehme ich eine alte Delphi Software aus dem letzten Jahrtausend hervor (Mathematik) und verbessere einige Dinge. Dabei geht es v.a. auch um Speed-Optimierung.

Ich frage mich nun, wieviel Sinn es macht, OpenCL oder CUDA Unterstützung einzubauen. Leider habe ich noch null Ahnung von OpenCL/CUDA.

Ich habe einen integer-Vektor/Array mit etwas über 200'000 Elementen.
Auf diesen Vektor wirkt wiederholt (zum Beispiel 100'000 Mal) eine von 20 Abbildungen, f1,..,f20.

Jede Abbildung fi, welche v in v' überführt ist sehr einfach:

- Es werden jeweils 2 bis 10 der Vektorelemente addiert zu einer Summe s.
- s wird mit einer Konstanten c multipliziert.
- Ein weiteres Vektorelement vk wird mit einer Konstanten d multipliziert.
- Die Summe c*s + vk*d wird in vk' geschrieben.

Jedes Vektorelement wird dabei durch fi genau einmal gelesen und jedes vk' genau einmal geschrieben.

D.h. die Berechnungen der etwa 50'000 vk' können parallel ablaufen und die Werte vk' können direkt wieder in v geschrieben werden (kein zusätzlicher Speicher für v' nötig).


Ich habe die Berechnung mit parallel.for und mit Tasks aufgeteilt (da fi sehr rasch berechnet werden kann, habe ich die Aufgabe in nur zwei Teile geteilt - bei mehr Teilen verliere ich gegenüber einer "single thread Lösung"); das bringt aber leider nur etwa 20% Zeitgewinn.

Wäre eine OpenCL/CUDA Lösung viel schneller?
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#2

AW: OpenCL / CUDA

  Alt 19. Sep 2023, 17:29
Prinzipiell klingt es danach, als wenn es eine gute Aufgabe für die GPU wäre.


Tasks gegenüber Threads sind schonmal schneller,
da sie einen ThreadPool nutzen, die Threads wiederverwenden und somit das Erstellen/Zerstören der vielen Threads entfällt.

Dennoch wäre es optimaler, wenn es extrem schnell geht, in jedem Task mehrere Werte und nicht nur Einen zu berechnen, denn auch der Task hat einen kleinen Overhead.

Klar, eine gute GPU kann natürlich viel mehr parallel und das vermutlich auch optimaler berechnen.
OK, hab hier 64 Kerne in der CPU, aber dafür keine HighEnd-Graka ... wer da wohl schneller ist, gegenüber dem Mehraufwand die Berechnung in der GPU aufzubauen.
Vermutlich wird jemand (GPU), der für sowas optimiert wurde, es eventuell schneller können, gegenüber einem Allrounder (CPU), falls das rechnende Programm nicht exrem unoptimal arbeitet.


Egal ob CPU oder GPU solle immer nur ein "Thread" auf einen Speicherbereich zugreifen (schreibend, aber auch lesend, wenn Andere darin rumschreiben),
damit sich die Threads nicht gegenseitig mit Sperren und/oder Neuladen ausbremsen.
Gab es hier vor Kurzem einen ForenThread zum Thema.
-> Entsprechend mehrere Werte zusammen in einen Speicherblock und jene Gruppe (oder Mehrere davon) von einem Task abarbeiten lassen.


Auch für die CPU gibt es spezielle Befehle, welche gern 1 bis 8 Werte gleichzeitig berechnen können, pro Kern.
MMX, SSE oder so.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Sep 2023 um 17:48 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
346 Beiträge
 
#3

AW: OpenCL / CUDA

  Alt 19. Sep 2023, 17:32
Wäre eine OpenCL/CUDA Lösung viel schneller?
I really don't have any experience with OpenCL, but used CUDA few times, I think it will be faster by 1000x-10000x times than Delphi code to calculate such vk'.

While CUDA is limited to nVidia, OpenCL does support AMD and Intel GPU's, the overhead of OpenCL is minimum, the wide range of compatibility and portability and its highly optimized code will make the selection between them easier.
Kas
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: OpenCL / CUDA

  Alt 29. Sep 2023, 21:03
Ok besten Dank.

Ich habe mit AVX512 Registern versucht, die Ausführungsgeschwindigkeit zu verbessern. Klappte nicht. Es dauerte länger. Es gibt hier zwei Probleme: Die zu verarbeitenden Koordinaten aus dem Vektor liegen nicht nebeneinander. (Reihenfolge der Elemente ändern? Nützt nix, da 20 Funktionen auf den Vektor wirken und man höchstens für eine der Funktionen eine optimale Ordnung im Vektor erreichen könnte.) Zudem läuft offenbar der Prozessor heiss und schaltet danach ein paar Takte runter.

OpenCL bin ich immer noch eine ziemlich doofe Nuss. Ich habe Mitov installiert und das einzige leider nicht sehr vielfältige OpenCL Beispiel geladen. Unter Win32 funktioniert es. Als Win64 crasht es bereits beim Auslesen der vorhandenen OpenCL Geräte. Hat jemand hier ähnliche Erfahrungen gemacht und dieses Problem eventuell lösen können?

Mein Kumpel Bard von google behauptet, dass ab Delphi 10.4 OpenCL Unterstützung direkt in Delphi eingebaut sei. Das wäre natürlich super.... - Stimmt dies und wenn ja, gibt es dazu nützliche Links?

Und noch so eine Frage... wie testet ihr euren OpenCL Code? Mir wurde Visual Studio Code empfohlen. Also habe ich's installiert und die OpenCL Erweiterung geladen. Wenn ich aber dann ein Programm debuggen will, dann geht dies nicht.
Michael Gasser

Geändert von Michael II (30. Sep 2023 um 14:23 Uhr)
  Mit Zitat antworten Zitat
user69

Registriert seit: 11. Dez 2004
107 Beiträge
 
#5

AW: OpenCL / CUDA

  Alt 3. Okt 2023, 17:08
Ich habe Anfang des Jahres mit Delphi 10.4 und auch externer Hilfe mit SIMD den Möller–Trumbore intersection Algo umgesetzt. Das hat schon Geschwindigkeit gebracht (ich denk mal ca. Faktor 2).

Derzeit bin ich auch dabei dies in OpenCL mal zu reproduzieren. CUDA wäre mir zu hardwarespeziell.
Zum Laufen bekommen habe ich OpenCL mit den OpenCL Headern von GlSzene:
Platform/Device/Context/CommandQueue/Buffer usw.
das ClProgramm ist noch total Basic: einfach get_global_id(0) und dies zurückliefern.
Aber es läuft in 32 und 64 bit.

Etwas alten Code findet man hier: https://code.google.com/archive/p/de...encl/downloads
Und hier wird auch OpenCL mit Delphi genutzt: https://habr.com/ru/articles/533206/

Mitov hatte ich nicht probiert, da es erst mal was kostete und GlScene erst mal Header lieferte.

Dass OpenCL direkt in Delphi 10.4 geht ist mir auch unbekannt.

Code testen hab ich auch noch keine Ahnung - soweit bin ich auch noch nicht (OpenCL hatte erst mal eher experimentier Status für mich).
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: OpenCL / CUDA

  Alt 5. Okt 2023, 08:54
Danke user69 für deine Antwort und die Links.

Ich finde David Black Schaffers OpenCL Filme gut gemacht. Zum Beispiel: https://www.youtube.com/watch?v=cSpJE5krA4E

Mitov kann über Delphis GetIt installiert werden; ohne Source Code ist Mitov gratis. Ich habe mir Funktionen Schreiben/Lesen von Daten geschrieben und einen sehr simplen Lader fürs OpenCL Programm. Mitovs OpenCL Demo ist nicht sehr "didaktisch aufgebaut" .
64 Bit läuft bei mir immer noch nicht - weder mit Nvidia noch mit intel Treibern. Die Demo stürzt direkt beim Laden der verfügbaren Profile ab. Mitovs Forum ist geschlossen. eMails werden wahrscheinlich nicht beantwortet.

Ich bin nicht sicher, ob ich mit Mitov alle notwendigen Parameter setzen kann. EnqueueNDRangeKernel zum Beispiel scheint nicht die "üblichen" Parameter zu fressen.

Ich konnte Delphi Code so übersetzen, dass er läuft; aber OpenCL Style ist sicher anders. Mein Algo arbeitet leider mit unterschiedlich grossen Paketen und hat zwingend sequentiell abzuwickelnde Teile, auf welche je immer parallele Arbeit folgt. Da OpenCL überall gleich parallelisieren will ist die Aufgabe für den Einstieg in OpenCl wahrscheinlich etwas steil.
Michael Gasser
  Mit Zitat antworten Zitat
user69

Registriert seit: 11. Dez 2004
107 Beiträge
 
#7

AW: OpenCL / CUDA

  Alt 6. Okt 2023, 10:30
Mitov ist ohne Source einfach ne black box - keine Ahnung, wos da klemmet. Evtl. wurde das nie auf 64Bit getestet.

Auch die Samples aus meinen links haben diverse Probleme (Insbesondere mit Datentypen und Speicher reservieren) - Man muss das Schritt für Schritt nachvollziehen und korrigieren - dann klappt es auch in 32 und 64 bit. Da hilft halt Mitov ohne Source kaum.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz