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