Rechnen per CUDA

Ich habe meine Magnetfeldberechnung auf einen Auftrag hin per CUDA auf die Grafikkarte ausgelagert und wollte mal kurz darüber berichten, da ja auch andere in dieser Newsgroup teilweise viel Rechenleistung für elektronische Aufgaben brauchen: Ein Test läuft auf einem Intel Quad Core (allerdings nur auf einem Core laufend) mit 2,4 GHz in ca. 230 Sekunden durch, auf einer NVIDIA 8800 GTX braucht es rund 2 Sekunden und auf einer NVIDIA 8600 GT rund 10 Sekunden, wobei der C-Source für die Grafikkarte fast identisch ist, nur ein paar unnötige Branches sind wegoptimiert (z.B. Division durch

0 wird nicht getestet, da die Grafikkarte das einfach ignoriert und Infinity zurückgibt). Man kann da ganz normal in C programmieren, mit ein paar wenigen Erweiterungen z.B. Threadsynchronisierung oder Abfrage der Thread- und Block Id, um jeweils einen passenden Teilbereich eines Arrays abzuarbeiten. Die Integration von CUDA in Visual Studio ist sehr gut, wenn man erstmal der IDE per Registry-Key beibebracht hat, daß jetzt auch .cu-Dateien wie C++ per Syntax-Highlighting dargestellt werden sollen :-)

Welche Aufgaben könnte man noch leicht paralellisieren? Wäre das auch was für Spice-Berechnungen oder Leiterbahnrouting? GNU Radio scheint ja bereits einiges in dieser Richtung zu machen.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss
Loading thread data ...

Simulationen mit Matrizen etc. lassen sich sehr gut parallelisieren, auch der Design Rule Check bei uns im BAE High End ist bereits parallelisiert (der merkt, wenn weitere Cores anwesend sind). Signalverarbeitung schreit auch danach.

Hingegen wird man sich beim Autorouter sehr schwer tun, weil es eine recht eklige Abhängigkeit der Daten voneinander gibt, die allen Dijkstra-ähnlichen Algorithmen gemein ist:

formatting link

Siehe z.B.:

formatting link
"Local Dijkstra"

Die Synchronisierung ist - auch nach unserern ausgiebigen Tests - das große Problem. Bei handelsüblichen n-Core Prozessoren für PC's kostet die mehr Zeit als das Parallelisieren bringt, bei einer Grafikkarte wäre das noch zu untersuchen.

Gruß Oliver

--
Oliver Bartels + Erding, Germany + obartels@bartels.de
http://www.bartels.de + Phone: +49-8122-9729-0 Fax: -10
Reply to
Oliver Bartels

Frank Buss :

Klingt ja interessant. Was passiert eigentlich, wenn die Grafikkarte schon vom Direct-X Treiber benutzt wird?

M.

Reply to
Matthias Weingart

Hallo!

"Frank Buss" wrote

Sehr schön, ich wollte mich schon immer mal damit beschäftigen. Gibts dazu ein Tutorial/Buch?

alsdenn, Jens

Reply to
Jens Frohberg

Sollte schon. Wenn die Grafikkarte auch tatsaechlich fuer Grafik benutzt wird, gibt aber einen Watchdog (ich glaube 5 Sek. warens), so dass der Bildschirm nicht von einem lange rechnenden Kernel geblockt werden kann.

Florian

Reply to
Florian Stock

Hallo,

Dieses Paper [1] koennte in diesem Zusammenhang ganz interessant sein. Oder auch jenes hier [2].

Bjoern

[1] Katz, Gary J. and Kider,Jr, Joseph T.: All-pairs shortest-paths for large graphs on the GPU. GH '08: Proceedings of the 23rd ACM SIGGRAPH/EUROGRAPHICS symposium on Graphics hardware, 2008.
formatting link
[2] Solka, J.L., Perry, J.C., Poellinger, B.R., Rogers, G.W.: Autorouting using a parallel Dijkstra algorithm with embedded constraints. International Joint Conference on Neural Networks (IJCNN), 1992.
formatting link
Reply to
Björn Franke

Björn Franke schrieb:

Hat da jemand Zugriff auf das Paper und kann es mir evtl. zukommen lassen? Herzlichen Dank!

--
  Klaus Rotter * klaus at rotters dot de * www.rotters.de
Reply to
Klaus Rotter

Klaus Rotter schrieb:

Danke, habe es erhalten!

--
  Klaus Rotter * klaus at rotters dot de * www.rotters.de
Reply to
Klaus Rotter

Am besten erstmal CUDA Treiber, Toolkit und SDK installieren. Im Toolkit gibt es zwei gute PDFs: Ein Programmers Guide, mit einer auführlichen Beschreibung und Beispielen, und eine API-Referenz (auch als CHM). Gibt auch viele Beispiele, aber ich habe ein einfaches Hello-World, ohne Abhängigkeiten zu den Beispiel-Commons, vermisst und daher das hier als Basis verwendet:

formatting link

Der Library-Pfad ist absolut in den Project-Settings codiert, den ggf. einfach durch $(CUDA_LIB_PATH) ersetzen, dann läuft es und man kann das leicht für eigene Experimente verwenden.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Scheint keine Probleme zu geben, wenn man ein wenig sogfältig programmiert. Ich habe hier Vista mit Aero und kann während der Berechnung ohne Probleme z.B. Windows-Tab drücken, für die 3D-Ansicht der Fenster. Ruckelt während der Berechnung allerdings recht stark. Die Berechnung ging über 12 Sekunden, waren allerdings immer einzelne kleine Häppchen.

Ich habe eben mal ein "while (1);" eingebaut und scheint tatsächlich ein Timeout von ca. 5 Sekunden zu geben: Die Abarbeitung bricht dann ab. Scheint also wirklich so zu sein, daß alles stehen bleibt, was mit Grafik zu tun hat, solange ein Programm per CUDA ausgeführt wird, denn während der Endlosschleife kann man nur die Maus bewegen, aber sonst ist alles eingefroren (CPU-Zeit ist natürlich immer noch vorhanden). Nach dem Abbruch kommt eine Meldung, daß es einen Fehler im Displaytreiber gegeben hat, man kann aber sonst danach weiterarbeiten.

Hier übrigens die Ausgabe für die 12 Sekunden Rechenzeit: 1000 gerade stromdurchflossene Leiterstücke, in einer komplexen Kurve angeordnet und dann das Magnetfeld von 1600x1200 Punkten im Raum vektoriell berechnet, die in einer passenden Ebene liegen und logarithmisch dargestellt werden, wobei die x/y/z-Komponenten jedes Magnetfeldvektors jeweils für RGB (Modulo 256) verwendet werden. Also nichts sinnvolles, aber sieht hübsch aus :-)

formatting link

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Die Synchronisierung soll laut dem Programming Guide sehr optimiert sein. Auch das Scheduling ist recht ausgeklügelt und soll so gut wie keinen Overhead haben. Muß es auch, bei hunderten von parallel laufenden Threads und der dynamischen Verteilung je nach Blockanzahl und Auslastung, und je nach Grafikkarte. Bleibt aber natürlich noch das Problem, daß man den Algorithmus so schreiben muß, daß die Threads nicht allzu lange Leerlauf haben beim synchronisieren.

Allerdings gibt es einige schöne Hilfsmittel. Z.B. Matrixoperationen werden bis zu 3 Dimensionen speziell von der Hardware unterstützt, sodaß die Implementierung des parallelen Algorithmus schon fast trivial wird. Werde ich vielleicht mal bei Gelegenheit ausprobieren.

Das Jonglieren mit local-, global-, host-Memory und Threads, Blöcken und Registern (wobei letzteres der Compiler einem abnimmt), Speicherzugriffsstrategien usw., ist allerdings nicht ganz trivial, wenn man wirklich das letzte an Geschwindigkeit herausholen will.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

Der Auftraggeber hat auch diese Version freigegeben, hier ist die aktualisierte Webseite:

formatting link

Kann man auch gut als Beispielprojekt für eigene Experimente mit CUDA verwenden.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Reply to
Frank Buss

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.