Ich mache ein Projekt auf GPU, und ich muss atomAdd () für double verwenden, weil die cuda es nicht für double unterstützt, also verwende ich den folgenden Code, der NVIDIA bereitstellt.
%Vor%Nun möchte ich wissen, warum das Gerät eine Schleife benötigt, während (angenommen! = alt)
Grundsätzlich, weil die Implementierung eine Last erfordert, die nicht atomar ausgeführt werden kann. Die Operation zum Vergleichen und Tauschen ist eine atomare Version von
%Vor% Es gibt keine Garantie, dass sich der Wert bei address
nicht ändert zwischen dem Zyklus, in dem der Wert von address
geladen wird, und dem Zyklus, bei dem der Aufruf atomicCAS
zum Speichern des aktualisierten Werts verwendet wird. Wenn dies geschieht, wird der Wert in address
nicht aktualisiert. Daher stellt die Schleife sicher, dass die beiden Operationen wiederholt werden, bis sich der Wert von address
zwischen der Lese- und der Vergleichs- und Tauschoperation nicht ändert, was bedeutet, dass die Aktualisierung stattgefunden hat.