Ich vermute, dass Sie einige Missverständnisse über CUDA haben und wie man es benutzt, besonders da Sie auf einen "Prozess" verweisen, wenn es in der CUDA-Terminologie so etwas nicht gibt. Für die meisten CUDA-Anwendungen gibt es zwei wichtige Dinge, um eine gute Leistung zu erzielen: Optimieren des Speicherzugriffs und Sicherstellen, dass jeder 'aktive' CUDA-Thread in einem Warp denselben Vorgang ausführt wie andere aktive Threads im Warp. Beide klingen, als wären sie für Ihre Anwendung wichtig.
Um Ihren Speicherzugriff zu optimieren, möchten Sie sicherstellen, dass Ihre Lesevorgänge aus dem globalen Speicher und Ihre Schreibvorgänge in den globalen Speicher zusammengeführt werden. Sie können mehr darüber im CUDA-Programmierhandbuch lesen, aber es bedeutet im Wesentlichen, dass benachbarte Threads in einem Halb-Warp von benachbarten Speicherorten lesen oder in diese schreiben müssen. Außerdem sollte jeder Thread 4, 8 oder 16 Bytes gleichzeitig lesen oder schreiben.
Wenn Ihr Speicherzugriffsmuster zufällig ist, müssen Sie möglicherweise Texturspeicher verwenden. Wenn Sie auf Speicher zugreifen müssen, der von anderen Threads in einem Block gelesen wurde, sollten Sie gemeinsam genutzten Speicher verwenden.
In Ihrem Fall bin ich nicht sicher, was Ihre Eingabedaten sind, aber Sie sollten zumindest sicherstellen, dass Ihre Schreibvorgänge verschmolzen sind. Sie müssen wahrscheinlich einige nicht-triviale Anstrengungen investieren, damit Ihre Lesevorgänge effizient funktionieren.
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 Kerneln achten, die abhängig von den Daten pro Thread länger oder kürzer ausgeführt werden. Jeder Thread in Ihren Warps sollte die gleiche Anzahl von Schritten in derselben Reihenfolge ausführen. Die einzige Ausnahme ist, dass es keine wirkliche Leistungseinbuße gibt, wenn einige Threads in einem Warp keine Operation ausführen, während die verbleibenden Threads dieselbe Operation zusammen ausführen.
Daher würde ich empfehlen, jeden Thread überprüfen, ob sein Pixel innerhalb eines bestimmten Dreiecks ist. Wenn nicht, sollte es nichts tun. Wenn dies der Fall ist, sollte die Ausgabefarbe für dieses Pixel berechnet werden.
Auch würde ich dringend empfehlen, mehr über CUDA zu lesen, da es scheint, als ob Sie in das tiefe Ende springen, ohne ein gutes Verständnis einiger grundlegender Grundlagen zu haben.
Sorry über meine Sprache, Englisch ist nicht meine Muttersprache. Was ist die richtige Terminologie für die Verarbeitung von Grafikkarten? Nun, ich denke, ich verstehe CUDA ziemlich gut, aber ja, ich habe Mangel an Wissen in parallelen Algorithmen. Meine Eingabe besteht aus Scheitelpunkten im Clipping-Bereich, und ich musste Dreiecke zeichnen. Ich denke Algorithmus wo jedes Pixel sollte jedes Dreieck überprüfen würde nicht optimal sein. – qba
Vermeiden Sie jedes Pixel, das jedes Dreieck überprüft, indem Sie Ihre Dreiecke mit einem BVH, KD-Tree oder R-Tree partitionieren. – whatnick