7 Stimmen

Zeichnen von Dreiecken mit CUDA

Ich schreibe meine eigene Grafikbibliothek (ja, es ist eine Hausaufgabe:) und verwende Cuda, um alle Renderings und Berechnungen schnell durchzuführen.

Ich habe ein Problem beim Zeichnen von gefüllten Dreiecken. Ich habe es so geschrieben, dass ein Prozess ein Dreieck zeichnet. Es funktioniert ziemlich gut, wenn es eine Menge von kleinen Dreiecken auf der Szene sind, aber es bricht Leistung völlig, wenn Dreiecke groß sind.

Meine Idee ist es, zwei Durchgänge zu machen. Im ersten Durchgang wird nur die Registerkarte mit den Informationen über die Scanlinien berechnet (von hier nach dort zeichnen). Dies wäre eine Dreiecksberechnung pro Prozess wie im aktuellen Algorithmus. Und im zweiten Durchgang wirklich zeichnen die Scanlines mit mehr als einem Prozess pro Dreieck.

Aber wird es schnell genug sein? Vielleicht gibt es eine bessere Lösung?

3voto

Stringer Punkte 11773

Sie können dies überprüfen Blog : Eine Software-Rendering-Pipeline in CUDA . Ich glaube nicht, dass dies der optimale Weg ist, aber zumindest gibt der Autor einige nützliche Quellen an.

Zweitens: Lesen Sie dies Papier : Eine programmierbare, parallele Rendering-Architektur . Ich glaube, es ist eines der neuesten Papiere und es ist auch CUDA-basiert.

Wenn ich dies tun müsste, würde ich mich für eine Datenparallele Rasterisierungspipeline wie in Larrabee (das TBR ist) oder sogar REYES und passen es an CUDA an:

http://www.ddj.com/architect/217200602 http://home.comcast.net/~tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip (siehe den zweiten Teil der Präsentation)

http://graphics.stanford.edu/papers/mprast/

0voto

Eric Punkte 6166

Ich vermute, dass Sie einige falsche Vorstellungen von CUDA und seiner Verwendung haben, insbesondere da Sie von einem "Prozess" sprechen, obwohl es so etwas in der CUDA-Terminologie nicht gibt.

Für die meisten CUDA-Anwendungen sind zwei Dinge wichtig, um eine gute Leistung zu erzielen: die Optimierung des Speicherzugriffs und die Sicherstellung, dass jeder "aktive" CUDA-Thread in einem Warp dieselbe Operation zur gleichen Zeit ausführt wie die anderen aktiven Threads im Warp. Beides klingt so, als ob es für Ihre Anwendung wichtig wäre.

Um Ihren Speicherzugriff zu optimieren, sollten Sie sicherstellen, dass Ihre Lesevorgänge aus dem globalen Speicher und Ihre Schreibvorgänge in den globalen Speicher zusammengeführt werden. Weitere Informationen hierzu finden Sie im CUDA Programmierhandbuch, aber im Wesentlichen bedeutet dies, dass benachbarte Threads in einem Half-Warp von benachbarten Speicherplätzen lesen oder in diese schreiben müssen. Außerdem sollte jeder Thread 4, 8 oder 16 Bytes auf einmal lesen oder schreiben.

Wenn Ihr Speicherzugriffsmuster zufällig ist, sollten Sie die Verwendung von Texturspeicher in Betracht ziehen. Wenn Sie auf Speicher zugreifen müssen, der von anderen Threads in einem Block gelesen wurde, sollten Sie auf gemeinsamen Speicher zurückgreifen.

In Ihrem Fall bin ich nicht sicher, was Ihre Eingabedaten sind, aber Sie sollten zumindest sicherstellen, dass Ihre Schreibvorgänge zusammengeführt werden. Wahrscheinlich werden Sie einen nicht unerheblichen Aufwand betreiben müssen, um Ihre Lesevorgänge effizient zu gestalten.

Für den zweiten Teil würde ich empfehlen, dass jeder CUDA-Thread ein Pixel in Ihrem Ausgabebild verarbeitet. Bei dieser Strategie sollten Sie auf Schleifen in Ihren Kernels achten, die je nach den Daten pro Thread länger oder kürzer ausgeführt werden. Jeder Thread in Ihren Warps sollte die gleiche Anzahl von Schritten in der gleichen Reihenfolge ausführen. Die einzige Ausnahme hiervon ist, dass es keine wirklichen Leistungseinbußen gibt, wenn einige Threads in einem Warp keine Operation ausführen, während die übrigen Threads dieselbe Operation gemeinsam ausführen.

Daher würde ich empfehlen, dass jeder Thread prüft, ob sein Pixel innerhalb eines bestimmten Dreiecks liegt. Wenn nicht, sollte er nichts tun. Ist dies der Fall, sollte er die Ausgangsfarbe für dieses Pixel berechnen.

Außerdem würde ich dringend empfehlen, mehr über CUDA zu lesen, da es scheint, als würden Sie ins kalte Wasser springen, ohne einige der grundlegenden Prinzipien zu verstehen.

-1voto

BobMcGee Punkte 19396

Ich will nicht unhöflich sein, aber sind Grafikkarten nicht sowieso dafür ausgelegt? Es scheint sinnvoller zu sein, die Standard-APIs OpenGL und Direct3D zu verwenden.

Warum verwenden Sie nicht die APIs für Ihr grundlegendes Rendering und nicht CUDA, das viel weniger anspruchsvoll ist? Wenn Sie dann zusätzliche Operationen durchführen möchten, die nicht unterstützt werden, können Sie CUDA verwenden, um sie darüber hinaus anzuwenden. Oder vielleicht implementieren sie als Shader.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X