OpenCL für mich effektiv?
-
Hallo,
ich habe zurzeit ein Projekt am laufen, das für ein mathematisches Problem ein Optimum sucht. Es geht um Matrix-Multiplikation, genauer gesagt sind es 160.000 Multiplikationen pro Schritt. Mit einem Xeon 5670 (3,3Ghz, 6 Kerne) bin ich zurzeit gut dabei, die Realisierung mit OpenMP ist recht performant, trotzdem ist ein Ende der Optimum-Suche nicht in Sicht. Nun habe ich geschaut, was meine Workstation noch so alles hat: eine ATI FirePro V5800. Mit seinen 800 Prozessoren hätte ich nichts dagegen, wenn es etwas mithilft, oder sogar komplett die Arbeit des Xeons übernimmt, damit ich die CPU für andere serielle Berechnungen verwenden kann. Nun meine Frage: Lohnt sich das Umschreiben des Programms in OpenCL, werde ich Leistungsschübe erwarten können, oder ist die GPU im Großen und Ganzen in Verbindung mit OpenCL doch langsamer als die CPU-Lösung? Gibt es eventuell Alternativen zu der OpenCL-Schnittstelle?Gruß
Edit: Ich bin nicht faul, aber für jemanden, der sich erst in OpenCL einlesen muss, ist es doch ein recht aufwendiger Schritt, das komplette Programm auf OpenCL-Basis neu zu schreiben. Es geht hauptsächlich um eure persönlichen Erfahrungen / Benchmarks, inwiefern Parallel Processing auf Basis von GPGPU machbar, performanter ist.
-
Es ist schwierig zu optimieren, wenn das Problem unbekannt ist. Deswegen gibt es nur allgemeine Tips. Bedenke, dass du bei OpenCL die Daten auf die Grafikkarte kopieren musst und wieder abholen solltest. Vorher wuerde ich Alternativen ausprobieren. Benutzt du eine Bibliothek oder etwas selbst gestriktes? Schon mal Intel Performance Primitives ausprobiert?
-
@knivil
Ich habe 160.000 Datensätze, bestehend aus:
- 20 Messwerte
- 1 ReferenzwertGröße der Daten ca. 30MB (eingelesen in C++-vector)
Und dazu habe ich eine Formel f(x1, x2, x3, x4...) = A*x1+B*x2*e^(C*x3+D*x4...)*...
Nun muss ich die Koeffizienten A,B,C...T so bestimmen, dass alle berechneten Werte in etwa den Referenzwerten stimmen. Auf der GPU würde ich die 160.000 Formelberechnungen ausführen, jeweils mit anderen Datensätzen (parallel processing) - auf der CPU würde ich die Koeffizienten nach jedem Schritt optimieren.
Machbar?
edit: bisher eigene zusammengestrickte Programme, und "Intel Performance Primitives" auch noch nicht benutzt.
-
dommynik schrieb:
edit: bisher eigene zusammengestrickte Programme, und "Intel Performance Primitives" auch noch nicht benutzt.
Dann würde ich zuerst bestehende Libraries wie eben IPP oder Blitz++ hernehmen und es für diese anpassen. Das bringt dir im 1. Schritt sicher mehr.
-
sop, hab mich mal in blitz++ und IPP eingelesen, sehe aber in OpenCL mehr Potential, aber auch viel mehr Aufwand. Gibt es gute, für Anfänger in dem Bereich geschriebene Tutorials, entweder in Buchform oder digital?
Das AMD APP SDK habe ich bereits installiert, nun versuche ich mich durch die für Profis geschriebene Dokumentation durchzulesen...haarsträubend! Mir würde ein kleines Hello World - Programm, jedoch ohne Visual Studio - Anbindung oder sonstiges genügen...google? fehlanzeige...oder ich suche nach den falschen Stichworten...!
edit: die 6 kerne meines xeons werden komplett ausgelastet, und den quelltext habe ich recht performant mit openmp-nutzung geschrieben - deswegen die idee mit der gpu.!
-
Profis geschriebene Dokumentation durchzulesen...haarsträubend!
Ich finde die Spezifikation gar nicht schlecht. Lese sie parallel zu den Tutorials im Netz.
die 6 kerne meines xeons werden komplett ausgelastet, und den quelltext habe ich recht performant mit openmp-nutzung geschrieben
Dein eigener Code wird es wohl kaum mit den optimierten Bibliotheken aufnehmen koennen, die von Intel mit ganz viel SSE vollgepackt wurden. Von OpenMP bin ich weniger begeistert.
-
dommynik schrieb:
edit: die 6 kerne meines xeons werden komplett ausgelastet, und den quelltext habe ich recht performant mit openmp-nutzung geschrieben - deswegen die idee mit der gpu.!
100% CPU-Auslastung bedeutet nicht, dass der Code performant sist. Siehe: Cache-stall
-
Wenn du deine Grafikkarte ersetzt und dir ne Geforce holst, könntest du dir das Kernel-Gefummel sparen und direkt mit CUDA thrust loslegen. Der Nachteil von OpenCl ist, dass es keinen compiler gibt und keine templates (und auch sonst alle coolen sachen, functionspointer und so) unterstützt werden. das macht die Programmierung sehr aufwendig und potenziell fehleranfällig.