PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FFT auf GPU vs CPU?


Gast
2011-04-30, 14:39:18
Hi Leute!

Ist die FFT auf einer GPU schneller als auf einer vergleichbar teueren CPU? Ich habe gegoogelt, fand aber nur einen Vergleich zwischen NV40 und P4, was doch sehr veraltet ist.

Gibt es Benchmakrs?

Spasstiger
2011-04-30, 14:51:48
Ja, FFTs rennen auf GPUs weit schneller als auf CPUs. Bei Single Precision liegt man im Bereich eines Faktor 100.
Ich hab das selber mal mit Matlab und CUDA ausprobiert, da dauerte die Faltung zweier großer Matrizen auf einer GeForce 8800 GT nur 25 ms, auf einem Core 2 Duo @ 3 GHz dagegen mehrere Sekunden.

Pinoccio
2011-04-30, 15:17:03
GTX 460 vs. CORE i7 – 920 (http://kernelnine.com/?p=198) vs. GTX 570 (http://kernelnine.com/?p=218)
GeForce 8800 GTX vs. Intel Core 2 Quad, 2,4GHz (http://www.cv.nrao.edu/~pdemores/gpu/)

mfg

Gast
2011-04-30, 23:32:58
Danke! Ich habe zudem noch ein Paper gefunden, in dem ca. Faktor 30 erreicht wird. Hört sich alles sehr verlockend an.

Wie reif ist AMD mittlerweile? Und können die Radeons da mithalten?

Krishty
2011-05-01, 00:20:47
Wie reif ist AMD mittlerweile? Und können die Radeons da mithalten?AMD bieten in ihrem APP-SDK eine OpenCL-Implementierung (http://developer.amd.com/gpu/appmathlibs/pages/default.aspx) an. Ist ein Geschwindigkeitsunterschied, falls es ihn gibt, wichtig? Ich meine: Entweder, der User hat eine AMD-Karte drin oder nicht. Falls es 5 % langsamer wäre, könntest du eben nichts dran ändern.

Gast
2011-05-01, 00:41:52
Die Hardware würde die Uni speziell für ein Forschungsprojekt anschaffen ... Aber wenn der Geschwindigkeitsunterschied zwischen Nvidia und AMD unter 20% liegt, werden eher Entwicklungsumgebung/Libraries und andere Faktoren entscheidend sein.

Spasstiger
2011-05-01, 01:22:15
Bei AMD gibts halt ziemlich günstig viel Rechenpower bei Double Precision Float. Z.B. aktuell die Radeon HD 5850 für teilweise unter 110€ mit satten 418 GFlops an Double-Precision-Rechenleistung. Bei einfachen Operationen wie FFTs schlagen die auch gut durch.
Bei NV müsstest du für die gleiche DP-Rechenleistung in eine High-End-Quadro für weit über 1000€ investieren.
Bei Single Precision ist AMD in der gleichen Preisklasse derzeit ca. doppelt so schnell wie NV bei einfachem Code (wie FFTs).

Bei CUDA dürfte die Userbase größer sein, so dass du bei Problemen schneller eine Lösung findest. Ich persönlich kenne Niemanden, der mit AMD Stream/App arbeitet. CUDA dagegen trifft man öfters an. Ich persönlich hab bisher auch nur CUDA-Bibliotheken bei der Programmierung ausprobiert (siehe obiges Matlab-Beispiel), bei AMD hat mir bislang die Motivation gefehlt, mich durch die Anleitungen durchzuackern. Das CUDA-Paket für Matlab war halt schön easy zu installieren und mit vielen Beispielcodes angereichert.

Krishty
2011-05-01, 02:31:57
Bei Single Precision ist AMD in der gleichen Preisklasse derzeit ca. doppelt so schnell wie NV bei einfachem Code (wie FFTs).Hmm. Ob eine optimierte FFT als „einfacher Code“ durchgeht, ist Geschmackssache. Ich habe auch gehört, dass der OpenCL-Compiler viel Spielraum für Feinabstimmung lässt. Gibt es keine handfesten Benchmarks in diese Richtung? Die würden mich sehr interessieren.

Gast
2011-05-01, 15:49:32
Wie sonnvoll/aufwendig wäre es denn, eigene FFT-Routinen für die Radeons zu schreiben? Mein Prof meinte eigentlich, dass man fertige Pakete nimmt. Schließlich muss man das Rad nicht neu erfinden. Der Meinung bin ich auch. Aber wenn man mit den Radeons deutlich günstiger Rechenleistung bekommt, lohnt sich eventuell die Arbeit.

Noch eine Frage: Kann man die REchenleistung durch mehrere Karten in einem Rechner verfielfachen? Muss der für eine Karte geschriebene Code irgendwie angepasst werden oder steckt man einfach zusätzliche Karten rein und überlässt die Arbeitsteilung z.B. den Compilern?

Krishty
2011-05-01, 16:11:39
Wie sonnvoll/aufwendig wäre es denn, eigene FFT-Routinen für die Radeons zu schreiben?Meine persönliche Erfahrung ist, dass es eine Hölle ist, die ich nie mehr durchschreiten müssen will – aber ich war auch dumm genug, mit der wohl am zweitwenigsten dafür geeigneten Sprache (Compute Shader 5) zu arbeiten; mit OpenCL und CUDA soll es erträglich sein. Kommt natürlich auch darauf an, ob du nur Zweierpotenzen brauchst, oder mixed-Radix, usw.
Mein Prof meinte eigentlich, dass man fertige Pakete nimmt. Schließlich muss man das Rad nicht neu erfinden. Der Meinung bin ich auch. Aber wenn man mit den Radeons deutlich günstiger Rechenleistung bekommt, lohnt sich eventuell die Arbeit.Wie gesagt liefern AMD im APP SDK schon fertige Routinen, und Nvidia in deren SDK ebenfalls. Ich bezweifle, dass du die merklich übertreffen können wirst, so lange du nicht wirklich spezielle Anforderungen hast. Die Frage, welcher Hersteller schneller ist, ist aber immernoch ungeklärt.
Noch eine Frage: Kann man die REchenleistung durch mehrere Karten in einem Rechner verfielfachen? Muss der für eine Karte geschriebene Code irgendwie angepasst werden oder steckt man einfach zusätzliche Karten rein und überlässt die Arbeitsteilung z.B. den Compilern?Naja, dein Code sollte parallelisierbar sein. Wenn du eine Million FFTs durchführen willst und die untereinander unabhängig sind, kannst du sie ohne weiteres auf mehrere Karten aufteilen. Aber eine einzelne FFT wird durch eine zusätzliche Karte natürlich nicht schneller.

Bei CUDA ist das afaik nur eine Einstellung in der Laufzeitumgebung (ein perfektes Programm weiß nicht, ob es auf der CPU oder GPU ausgeführt werden wird) und mit OpenCL müsste es ähnlich sein. Ist aber ohne Gewähr. Ich kann mich noch erinnern, dass es mit DXGI 1 (also zu Vista-Zeiten) unmöglich war, eine GPU anzusprechen, die nicht mit einem Monitor verbunden war und so ein Kleinkram, darüber dürften wir aber heute hinweg sein.

Gast
2011-05-01, 17:27:53
Machs mit nVidia & CUDA: Große Userbasis, bereits einigermaßen ausgereift (so man bei einem so neuen Thema davon sprechen kann), gute Bibliotheken und Tools (cudaprof!) vorhanden. Geschwindigkeitsunterschied AMD <-> nVidia: irrelevant.

Und man nimmt natürlich die mitglieferten FFT Funktionen, sowas würde ich nur im allerhöchsten Notfall selber schreiben.


Ich kann mich noch erinnern, dass es mit DXGI 1 (also zu Vista-Zeiten) unmöglich war, eine GPU anzusprechen, die nicht mit einem Monitor verbunden war und so ein Kleinkram, darüber dürften wir aber heute hinweg sein.
Für CUDA gibt es setDevice(), damit kann man die Karte spezifizieren auf der der Code laufen soll. Diese Funktion ist Teil des Cuda Toolkits, sollte also unabhängig vom Betriebssystem sein. Unter Linux funktioniert es ohne Probleme eine GPU anzusprechen die nicht mit einem Monitor verbunden ist, unter Windows kann ichs nicht sagen.
Mit CUDA 4.0 gibts jetzt auch so Späße wie unified memory über mehrere Karten hinweg (!!) und man kann Kernels parallel anstarten wenn man genug Ressourcen hat. Damit könnte es dann tatsächlich sein dass durch eine zusätzliche Karte dein Programm schneller wird (natürlich nur wenn du mehr als eine FFT rechnest...)

Spasstiger
2011-05-01, 17:32:00
Wie sonnvoll/aufwendig wäre es denn, eigene FFT-Routinen für die Radeons zu schreiben? Mein Prof meinte eigentlich, dass man fertige Pakete nimmt. Schließlich muss man das Rad nicht neu erfinden. Der Meinung bin ich auch. Aber wenn man mit den Radeons deutlich günstiger Rechenleistung bekommt, lohnt sich eventuell die Arbeit.
Du musst wie gesagt auch für AMD-Karten keine eigenen Routinen schreiben.
Außerdem gibts da noch OpenCL als herstellerübergreifende API.

Hier z.B. OpenCL-Bibliotheken für Matlab: http://sites.google.com/site/iptatiproject/.