Frage

Ich bin gerade dabei, einen Raytracer zu implementieren.Da Raytracing extrem rechenintensiv ist und ich mich sowieso mit der CUDA-Programmierung befassen werde, habe ich mich gefragt, ob jemand Erfahrung mit der Kombination beider hat.Ich kann nicht wirklich sagen, ob die Rechenmodelle übereinstimmen, und ich würde gerne wissen, was mich erwartet.Ich habe den Eindruck, dass es nicht gerade ein himmlisches Spiel ist, aber eine ordentliche Geschwindigkeitssteigerung wäre besser als nichts.

War es hilfreich?

Lösung

Eine Sache, vor der Sie bei CUDA sehr vorsichtig sein sollten, ist, dass der unterschiedliche Kontrollfluss in Ihrem Kernel-Code aufgrund der Struktur der zugrunde liegenden GPU-Hardware die Leistung absolut beeinträchtigt.GPUs haben typischerweise massiv datenparallele Arbeitslasten mit hochkohärentem Kontrollfluss (d. h.Sie haben ein paar Millionen Pixel, von denen jedes (oder zumindest große Teile davon) von der bearbeitet wird genau dasselbe Shader-Programm, sogar in der gleichen Richtung durch alle Zweige.Dies ermöglicht es ihnen, einige Hardwareoptimierungen vorzunehmen, z. B. nur einen einzigen Befehlscache, eine einzige Abrufeinheit und eine Dekodierungslogik für jede Gruppe von 32 Threads zu haben.Im Idealfall, der in der Grafik üblich ist, können sie denselben Befehl im selben Zyklus an alle 32 Sätze von Ausführungseinheiten senden (dies wird als SIMD oder Single-Instruction Multiple-Data bezeichnet).Sie können emulieren, nacheifern MIMD (Multiple-Instruction) und SPMD (Single-Program), aber wenn Threads innerhalb eines Streaming-Multiprozessors (SM) auseinanderlaufen (unterschiedliche Codepfade aus einem Zweig nehmen), wechselt die Ausgabelogik tatsächlich in einem Zyklus zwischen den einzelnen Codepfaden -Zyklusbasis.Sie können sich vorstellen, dass im schlimmsten Fall, wenn sich alle Threads auf separaten Pfaden befinden, Ihre Hardwareauslastung einfach um den Faktor 32 gesunken ist, was praktisch alle Vorteile zunichte gemacht hat, die Sie durch die Ausführung auf einer GPU gegenüber einer CPU gehabt hätten, insbesondere wenn man bedenkt der Overhead, der mit dem Marshallen des Datensatzes von der CPU über PCIe zur GPU verbunden ist.

Das heißt, Raytracing ist zwar in gewissem Sinne datenparallel, verfügt jedoch über einen stark divergierenden Kontrollfluss selbst für Szenen mit geringer Komplexität.Selbst wenn es Ihnen gelingt, eine Reihe eng beieinander liegender Strahlen, die Sie direkt nebeneinander aussenden, auf demselben SM abzubilden, werden die Daten- und Befehlslokalität, die Sie für den ersten Sprung haben, nicht lange halten.Stellen Sie sich zum Beispiel vor, dass alle 32 hochkohärenten Strahlen von einer Kugel reflektiert werden.Nach diesem Aufprall werden sie alle in ziemlich unterschiedliche Richtungen fliegen und wahrscheinlich auf Objekte aus unterschiedlichen Materialien, mit unterschiedlichen Lichtverhältnissen usw. treffen.Jedes Material und jede Art von Beleuchtung, Okklusion usw.Bedingungen ist ein eigener Befehlsstrom zugeordnet (zur Berechnung von Brechung, Reflexion, Absorption usw.), und daher wird es ziemlich schwierig, denselben Befehlsstrom auch nur auf einem erheblichen Teil der Threads in einem SM auszuführen.Dieses Problem reduziert beim aktuellen Stand der Technik im Raytracing-Code Ihre GPU-Auslastung um den Faktor 16–32, was dazu führen kann, dass die Leistung für Ihre Anwendung inakzeptabel wird, insbesondere wenn es sich um eine Echtzeitanwendung handelt (z. B.ein Spiel).Es könnte immer noch einer CPU überlegen sein, z.B.eine Renderfarm.

In der Forschungsgemeinschaft wird derzeit eine neue Klasse von MIMD- oder SPMD-Beschleunigern untersucht.Ich würde diese als logische Plattformen für Software und Echtzeit-Raytracing betrachten.

Wenn Sie sich für die beteiligten Algorithmen und deren Zuordnung zum Code interessieren, schauen Sie sich POVRay an.Schauen Sie sich auch die Photonenkartierung an. Dabei handelt es sich um eine interessante Technik, die der Darstellung der physischen Realität sogar noch einen Schritt näher kommt als Raytracing.

Andere Tipps

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

Aber es ist im Grunde ein Forschungsproblem.Menschen, die es gut machen, erhalten von Experten begutachtete Forschungsarbeiten.Aber Also Dies bedeutet zu diesem Zeitpunkt immer noch, dass die besten GPU/Cuda-Ergebnisse annähernd mit den besten Lösungen auf CPU/Multi-Core/SSE konkurrenzfähig sind.Daher denke ich, dass es noch etwas früh ist anzunehmen, dass der Einsatz von Cuda einen Raytracer beschleunigen wird.Das Problem besteht darin, dass Raytracing zwar „peinlich parallel“ ist (wie man sagt), es sich aber nicht um die Art von Problem der „festen Eingabe- und Ausgabegröße“ handelt, das direkt auf GPUs abgebildet werden kann – Sie benötigen Bäume, Stapel, dynamische Datenstrukturen usw .Mit Cuda/GPU geht das, aber es ist knifflig.

In Ihrer Frage ging es nicht eindeutig um Ihr Erfahrungsniveau oder die Ziele Ihres Projekts.Wenn dies Ihr erster Raytracer ist und Sie nur lernen möchten, würde ich Cuda meiden – die Entwicklung dauert zehnmal länger und Sie werden wahrscheinlich keine gute Geschwindigkeit erreichen.Wenn Sie ein mäßig erfahrener Cuda-Programmierer sind und auf der Suche nach einem herausfordernden Projekt sind und das Erlernen von Raytracing einfach Spaß macht, versuchen Sie es auf jeden Fall in Cuda.Wenn Sie eine kommerzielle App erstellen und sich einen Geschwindigkeitsvorteil gegenüber der Konkurrenz verschaffen möchten, dann ist es an dieser Stelle wahrscheinlich eine Fehlentscheidung ...Sie erhalten möglicherweise einen Leistungsvorteil, allerdings auf Kosten einer schwierigeren Entwicklung und der Abhängigkeit von bestimmter Hardware.

Schauen Sie in einem Jahr noch einmal vorbei, die Antwort könnte nach einer oder zwei Generationen GPU-Geschwindigkeit, Cuda-Compiler-Entwicklung und Erfahrung der Forschungsgemeinschaft anders ausfallen.

Nvidia hat dieses Jahr auf seiner Konferenz NVision einen Raytracer in CUDA vorgeführt.Hier ist ein Link zu ihren Folien darüber.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top