ich einen Algorithmus in Cuda implementieren, die folgenden Schritte durchführen muss:CUDA: Wie atomar diese Anweisungen ausführen (4 Adressen)
ein Array x
(in gemeinsam genutzten mem) und zeigen einige Gerätefunktion f
,
- ein Paar von Indizes wählen
(i,j)
x
(zufällig). - Berechnen
y = f(x[i], x[i - 1], x[j], x[j + 1])
. - Basierend auf
y
entscheiden, ob die Positionen von x [i] und x [j] ausgetauscht werden sollen.
Das Problem ist, dass die Funktion f
auf 4 Werten im gemeinsam genutzten Speicher abhängt, von denen alle garantiert werden müssen, bis nach dem Tausch unverändert bleiben.
Für eine Minute dachte ich, dies könnte der Körper einer critical section sein, aber ich sehe nicht, wie ich eine einzige Lock-Adresse verwenden könnte, um 4 Variablen zu sperren. Das Hauptproblem, denke ich, ist, dass, wenn ein Thread an (i,j)
arbeitet, andere Threads nicht auf einem Paar (k,l)
arbeiten dürfen, wobei k
oder l
{i, i-1, j, j+1}
sind.
EDIT
Gleich nach der Veröffentlichung, eine Idee in den Sinn kam ... Wäre es möglich, eine Kaskade von Schlössern zu haben? Erstes Schloss x[i]
, wenn das gelingt, sperren Sie x[i-1]
usw. für alle 4 Werte. Nur wenn die endgültige Sperre erfolgreich ist, führen Sie die oben genannten Schritte aus. Ich werde experimentieren und diese Frage für andere Vorschläge offen halten.
Die Idee in Ihrer Bearbeitung würde funktionieren, ** wenn ** Sie vorsichtig sind in der Reihenfolge, in der Sie die Sperren nehmen (im Grunde die gleiche Reihenfolge über alle Threads — zB durch den von Ihnen verwendeten Index) und stellen Sie sicher Lassen Sie sie los, wenn Sie nicht alle Sperren erhalten. Andernfalls laden Sie Deadlocks ein. Dies ist jedoch alles andere als ideal, würde ich Ihnen raten, zurück zum Zeichenbrett und sehen, ob Sie die Notwendigkeit für diese Operation vermeiden können (oder zumindest die Notwendigkeit, es so fein synchronisiert haben.) – delnan
@ delnan Ich habe Ich bin wegen dieses Problems schon einige Male auf das Zeichenbrett zurückgekommen, aber ich kann keinen anderen Weg finden. Dies sind einfach die Operationen, die ausgeführt werden müssen. Es scheint auch ziemlich geeignet für die Parallelisierung zu sein, da x typischerweise groß ist und die Wahrscheinlichkeit für Kollisionen vernünftig klein ist. Was ist das für "& mdash", von dem du sprichst? – JorenHeit
Hoppla, "—" wäre die ausgefallene Variante von "---" gewesen, wenn Stack Overflow HTML in comments interpretiert =/ – delnan