Laden...

Thread oder doch GPU?

Erstellt von Reygh vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.421 Views
R
Reygh Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
Thread oder doch GPU?

G'Day,

Fasse mich kurz: Ich schreibe zur Zeit an einer kleinen DLL, jedoch braucht eine while-Schleife extrem Lange in der ausführung weil dort auch sehr viel gemacht und wiederholt wird - ist auch so notwendig - nun wollte ich den Prozess gerne beschleunigen.
Ein guter Freund meinte das man Code auch mit dem GPU ausführen kann, welches ja bekanntlich extrem schneller gehen würde, doch leider habe ich dazu nichts gefunden. Habe einige Wrapper ausprobiert für C# (.NET), doch keiner macht es so wie ich es mir vorstelle, denn mir wurde es so gesagt das man einfach "sagen" kann: "Von hier, bis hier Code mit GPU ausführen." - oder stelle ich mir das jetzt zu einfach vor? Würde mich ja nicht mal wundern.

Als zweite Idee hatte ich einfach die Schleife (also den Datenaufwand) zu teilen und parallel auszuführen - mit Threads - das wäre sogar eine gute Option wenn da nicht da Problem wäre, dass ich nur eine static void methode übergeben kann, jedoch muss ich daten in die Methode bekommen und auch heraus bekommen, selbst wenn es nur eien global defineirte Variable ist.

Meine Fragen wären jetzt erstmal was ihr mir mehr empfehlen würde: GPU oder Threads? Und wenn GPU: Wie? Wenn Threads: Wie löse ich das dargelegte Problem am besten?

Danke schon mal für eure Antworten,

mit freundlichen Grüße,
Reygh.

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Reygh,

das wäre sogar eine gute Option wenn da nicht da Problem wäre, dass ich nur eine static void methode übergeben kann, jedoch muss ich daten in die Methode bekommen und auch heraus bekommen

Das stimmt schonmal überhaupt nicht.
Du kannst ThreadPool.QueueUserWorkItem sowohl Delegates auf Instanz- als auch statische Methoden übergeben.
Zudem kannst du Parameter entweder der Überladung oder via Closures mitgeben.

Ansonsten ist auch die TPL aus .NET 4 einen Blick wert - die vereinfacht viele Dinge erheblich.

denn mir wurde es so gesagt das man einfach "sagen" kann: "Von hier, bis hier Code mit GPU ausführen."

Nein, so einfach geht das nicht.
Je nach Grafikkarte kommt man nicht drum herum, spezieller Shader in HLSL zu schreiben, die die Aufgabe erledigen.
Ansonsten gibt's von NVIDIA auch ein Tool für deren Grakas, mit dem man dann beinahe C++ Code auf der Graka ausführen kann - allerdings auch nur mit genauen Überlegungen, wann man was von der Graka zur CPU schickt.

Aber ich glaube, du hast eine falsche Vorstellung von Parallelisierung: Man kann nicht "einfach" irgendwelchen Code parallel ausführen. Es gehört auch dazu, sich über Dinge wie Locking, Race Conditions,... Gedanken zu machen und Algorithmen entsprechend anzupassen.
Manche Algorithmen kann man sogar nur sehr schwer bis gar nicht parallelisieren.

1.346 Beiträge seit 2008
vor 13 Jahren

gpu programmierung in .net: http://research.microsoft.com/en-us/projects/accelerator/

Das wollte ich nur mal am Rande erwähnen. In dem Fall wahrscheinlich nicht zu gebrauchen.

156 Beiträge seit 2010
vor 13 Jahren

denn mir wurde es so gesagt das man einfach "sagen" kann: "Von hier, bis hier Code mit GPU ausführen."
Nein, so einfach geht das nicht.

das dürfte überhaupt nicht gehen ... .NET wird durch den JIT in CPU-Code übersetzt ... das dürfte nicht mal annährend in einer GPU laufen

Ansonsten gibt's von NVIDIA auch ein Tool für deren Grakas, mit dem man dann beinahe C++ Code auf der Graka ausführen kann - allerdings auch nur mit genauen Überlegungen, wann man was von der Graka zur CPU schickt.

NVidia hat CUDA ... AMD hat Stream

Preisfrage an den OP - Was willst Du machen?

5.742 Beiträge seit 2007
vor 13 Jahren

das dürfte überhaupt nicht gehen ... .NET wird durch den JIT in CPU-Code übersetzt ... das dürfte nicht mal annährend in einer GPU laufen

"Es geht schon - nur halt nicht mit C#-Code" <-- so war das gemeint (diesen Accelerator mal ausgelassen - auch mit dem klappt das ja nicht in 5 Minuten)

731 Beiträge seit 2006
vor 13 Jahren

Hallo zusammen,

bevor man über soetwas nachdenkt, sollte man immer erst am Algorithmus "schrauben" finde ich. Wenn die Komplexität "zu hoch" ist, dann bringt einem auch mehr Rechenleistung nichts, da diese nichts am eigentlichen Laufzeit-Wachstumsverhalten ändert.

Mfg
wax

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Reygh,

verstehe mich bitte nicht falsch, aber wenn noch nicht mal von alleine herausgefunden hast, wie man Parameter an Threads übergeben kann, dann kannst du das mit den Grafikkarten gleich vergessen. Das ist eine weit höhere Schwelle.

Aber selbst Programmierung mit normalen Threads kann man nicht mal so aus den Ärmel schütteln. Siehe meine Warnung in 2 Threads - Receive/Send - nur einer wird ausgeführt.

Möglicherweise ist nebenläufige Programmierung auch gar nicht nötig, wenn du Wax Rat beherzigst.

herbivore

R
Reygh Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

G'Day,

Danke für die vielen Meinungen und antworten, winSharp93 du hast mir mit der TPL gut weiter geholfe konnte das ganze jetzt etwas beschleunigen mit Parallel.Invoke.

Habe schon befürchtet, dass das alles nicht so einfach ist wie ich bzw. mein Freund es sich vorstellte, trotzdem danke. Werde mich jetzt erstmal etwas teifer mit dem Thema Threads und TPL beschäftigen.

MfG,
Reygh