2016-07-22 27 views
-2

Ich schreibe eine Funktion in CUDA, die unsortierte Punkte in einem 3D-Gitter teilt. Basierend auf den Grenzen der Punktmenge kann ich die Koordinaten jedes Punktes finden und in ein Array innerhalb der Gitterzelle schreiben.Wie verhindert man die Wettlaufsituation in verschiedenen Blöcken in CUDA

Ich starten Kernal mit Threads gleich der Anzahl der Punkte, indem Sie sie in verschiedenen Blöcken für maximale Thread-Anzahl.

Jetzt findet jeder Thread seine Koordinaten und schreibt den Punkt in die Zelle, aber andere Threads innerhalb desselben oder eines anderen Blocks können auch dieselbe Koordinate zur gleichen Zeit berechnen. Der Code schlägt hier wegen der Race-Bedingung fehl.

Ich lese über Atomics, Sperren und kritischen Abschnitt, aber diese Synchronisationen werden nur innerhalb eines Thread-Blocks verwendet, das ist in meinem Fall unwahrscheinlich.

Irgendwelche Vorschläge bitte?

Meine erste Vermutung ist, ich brauche die Punkte zu sortieren basierend auf Abstand von Rasterzellengröße, und starten Sie kernal mit jedem Block gleich Größe der Rasterzelle

Antwort

2

Atomics auf dem globalen Speicher und synchronisieren zwischen den Blöcken arbeiten können. Das einzige Problem hier ist die Leistung. Je nachdem, wie viel Zeit die Ausführung der Schreibvorgänge in den Speicher in Anspruch nimmt, können Sie langsameren Code erhalten, als wenn Sie ihn nur seriell auf der CPU ausführen. Atomics sind langsam. Vielleicht versuchen Sie, das Problem zu überdenken.