Ich multipliziere eine Zeile einer Matrix mit der Umkehrung des Hauptdiagonalelements dieser Zeile. Ich habe es mit 1-D parallelen Code implementiert. Alle der Faden läuft dieser CodeOpenCL Daten Synchronisation
1.read the principle diagonal element
2.calculate the inverse of that element
3.multiply inverse with the element indexed at the thread id
Das Problem entsteht, wenn in ith i-ten Zeile Thread führt Schritt 3 vor dem anderen Thread führt den Schritt 1. er den Wert des Prinzips Diagonalelement ändert, bevor andere es lesen kann.
Hat OpenCL irgendeine Barriere, die nur einem Thread erlaubt, Schritt 3 auszuführen, nachdem alle Threads Schritt 1 ausgeführt haben?
Ich möchte keine leeren Schleifen verwenden, da es schlimmsten Fälle geben kann, wenn es fehlgeschlagen kann.
Es gibt nur Barrieren für Arbeitsgruppen. Wenn Ihr Code nur eine Arbeitsgruppe hat, ist es möglich, aber es ist in hohem Maße nicht gerechtfertigt, wenn Sie Ihren Code auf der GPU ausführen möchten. – Jovasa
Ich benutze eine GPU und Alle diese Threads werden durch einen einzigen Aufruf erzeugt, um NDRangeKernel zu queue, also denke ich, dass sie in der gleichen globalen Arbeitsgruppe sind. –
Nein, der Aufruf erzeugt K Workitems (Globale Größe), die Arbeitsgruppen bilden, die jeweils N Arbeitselemente haben (lokale Größe) – Jovasa