2008-09-02 10 views
10

Ich implementiere gerade einen Raytracer. Da Raytracing extrem rechenintensiv ist und ich mich sowieso mit der CUDA-Programmierung beschäftige, frage ich mich, ob jemand Erfahrung mit der Kombination der beiden hat. Ich kann nicht wirklich sagen, ob die Berechnungsmodelle übereinstimmen und ich würde gerne wissen, was zu erwarten ist. Ich habe den Eindruck, dass es nicht genau ein Spiel ist, das im Himmel gemacht wurde, aber eine ordentliche Steigerung der Geschwindigkeit wäre besser als nichts.Raytracing mit CUDA

Antwort

20

Eine Sache, die in CUDA sehr vorsichtig ist, ist, dass divergenter Kontrollfluss in Ihrem Kernel absolut KILLS-Leistung codiert, aufgrund der Struktur der zugrunde liegenden GPU-Hardware. GPUs haben typischerweise massive datenparallele Workloads mit hochkohärentem Steuerfluss (dh Sie haben ein paar Millionen Pixel, von denen jedes (oder zumindest große Schwaden) von dem gleichen Shader-Programm bearbeitet wird, selbst wenn es genommen wird Die gleiche Richtung durch alle Zweige.Es ermöglicht ihnen, einige Hardware-Optimierungen, wie nur mit einem einzigen Befehlscache, Holeinheit und Dekodierlogik für jede Gruppe von 32 Threads zu machen.Im Idealfall, der in Grafiken üblich ist, sie kann die gleiche Anweisung an alle 32 Sätze von Ausführungseinheiten im selben Zyklus senden (dies wird als SIMD oder Single-Instruction Multiple-Data bezeichnet). Sie können emulieren MIMD (Multiple-Instruction) und SPMD (Single-Program) Wenn jedoch Threads innerhalb eines Streaming-Multiprozessors (SM) divergieren (unterschiedliche Codepfade außerhalb eines Zweigs), schaltet die Fehlerlogik tatsächlich zwischen jedem Codepfad um Zyklus für Zyklus. Sie können sich vorstellen, dass im schlimmsten Fall, in dem alle Threads auf getrennten Pfaden liegen, Ihre Hardware-Nutzung nur um den Faktor 32 zurückgegangen ist, was insbesondere den Nutzen einer GPU gegenüber einer CPU zunichte macht der Overhead, der mit dem Marshalling des Datasets von der CPU über PCIe zur GPU verbunden ist.

Das heißt, Ray-Tracing, während Daten parallel in gewissem Sinne, hat einen weit divergierenden Kontrollfluss für sogar bescheiden komplexe Szenen. Selbst wenn es Ihnen gelingt, eine Menge dicht gedrängter Strahlen, die Sie direkt nebeneinander auf den gleichen SM auswerfen, zu mappen, werden die Daten und die Instruktionslokalität, die Sie für den anfänglichen Sprung haben, nicht sehr lange halten. Stellen Sie sich zum Beispiel alle 32 hochkohärenten Strahlen vor, die von einer Kugel abprallen.Sie werden alle nach diesem Sprung in ziemlich verschiedene Richtungen gehen und werden wahrscheinlich Objekte aus verschiedenen Materialien, mit unterschiedlichen Lichtverhältnissen und so weiter treffen. Jedem Material und jeder Gruppe von Beleuchtungs-, Okklusions-, usw. Bedingungen ist ein eigener Anweisungsstrom zugeordnet (um Brechung, Reflexion, Absorption usw. zu berechnen), und so wird es ziemlich schwierig, den gleichen Anweisungsstrom sogar für einen signifikanten Bruchteil auszuführen der Threads in einem SM. Dieses Problem mit dem aktuellen Stand der Technik in Raytracing-Code reduziert Ihre GPU-Auslastung um einen Faktor von 16 bis 32, die Leistung für Ihre Anwendung inakzeptabel machen kann, insbesondere wenn es Echtzeit (z. B. ein Spiel) ist. Es könnte immer noch einer CPU für z.B. eine Renderfarm

Es gibt eine neue Klasse von MIMD- oder SPMD-Beschleunigern, die derzeit in der Forschungsgemeinschaft untersucht werden. Ich würde diese als logische Plattformen für Software, Raytracing in Echtzeit betrachten.

Wenn Sie sich für die beteiligten Algorithmen interessieren und sie dem Code zuordnen, sehen Sie sich POVRay an. Schauen Sie auch in Photon Mapping, es ist eine interessante Technik, die der Darstellung der physikalischen Realität sogar einen Schritt näher kommt als Raytracing.

9

Es kann sicherlich getan werden, wurde getan, und ist derzeit ein heißes Thema unter den Raytracing und Cuda Gurus. Ich würde mit der Durchsicht beginnen http://www.nvidia.com/object/cuda_home.html

Aber es ist im Grunde ein Forschungsproblem. Leute, die es gut machen, bekommen von ihnen begutachtete Forschungsberichte. Aber gut zu diesem Zeitpunkt bedeutet immer noch, dass die besten GPU/Cuda-Ergebnisse sind etwa konkurrenzfähig mit Best-of-Class-Lösungen auf CPU/Multi-Core/SSE. Ich denke also, es ist ein bisschen früh, anzunehmen, dass die Verwendung von Cuda einen Raytracer beschleunigen wird. Das Problem ist, dass, obwohl Raytracing "peinlich parallel" ist (wie sie sagen), es nicht die Art von "fester Eingabe und Ausgabegröße" Problem ist, die direkt auf GPUs abbildet - Sie wollen Bäume, Stapel, dynamische Datenstrukturen, etc Es kann mit Cuda/GPU gemacht werden, aber es ist schwierig.

Ihre Frage war nicht klar über Ihr Erfahrungsniveau oder die Ziele Ihres Projekts. Wenn dies Ihr erster Raytracer ist und Sie nur versuchen zu lernen, würde ich Cuda vermeiden - Sie werden 10x länger brauchen, um sich zu entwickeln, und Sie werden wahrscheinlich keine gute Geschwindigkeit bekommen. Wenn Sie ein mäßig erfahrener Cuda-Programmierer sind und nach einem herausfordernden Projekt suchen und Ray-Tracing einfach nur Spaß machen wollen, versuchen Sie es auf jeden Fall in Cuda. Wenn du eine kommerzielle App erstellst und du nach einem Wettbewerbsvorteil suchst - nun, es ist wahrscheinlich ein Mist-Shooting an diesem Punkt ... du könntest eine Performance-Kante bekommen, aber auf Kosten einer schwierigeren Entwicklung und Abhängigkeit von bestimmter Hardware.

Überprüfen Sie in einem Jahr, die Antwort kann nach einer anderen Generation oder zwei von GPU-Geschwindigkeit, Cuda-Compiler-Entwicklung und Forschung Community-Erfahrung anders sein.

+0

Ich habe ein kleines Projekt, bei dem ich meinen ersten Raytracer gebaut habe und noch nie CUDA-Arbeiten gemacht habe. Ich bin also in einer schlechten Position, um etwas Großartiges zu machen. Aber im nächsten Jahr arbeite ich mit der GPGPU-Technologie. Dies führt mich dazu, mich mit CUDA vertraut zu machen und ich fragte mich, in welchem ​​Maße ich dieses Wissen nutzen kann. –

+0

Sind Sie sicher, dass es ein peinlich paralleles Problem ist? Die Lösung, das nächste Objekt der Reflexion und Variationen im Materialhandling zu finden (wie von Matt J hervorgehoben), scheint, dass sie die Parallelität signifikant brechen könnten. Aber korrigiere mich bitte, wenn ich falsch liege. –

4

Nvidia hat dieses Jahr einen Ray-Tracer in CUDA auf ihrer Konferenz NVision vorgeführt. Hier ist ein Link zu ihren Folien dazu.

http://www.nvidia.com/object/nvision08-IRT.html

+0

Vielen Dank, das ist wirklich interessante Sachen! –