0

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.

+0

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

+0

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. –

+0

Nein, der Aufruf erzeugt K Workitems (Globale Größe), die Arbeitsgruppen bilden, die jeweils N Arbeitselemente haben (lokale Größe) – Jovasa

Antwort

0

Eine Möglichkeit besteht darin, barrier(CLK_CL_LOCAL_MEM_FENCE) hinzuzufügen. Die andere Möglichkeit besteht darin, die Arbeit in zwei Kernen zu speichern, aber Sie können die cl_mem , die aus dem Kernel von step1 berechnet wurde, direkt an den Kernel von step3 übergeben. Dies verursacht keine CPU/GPU IO.

Die Diagonalmatrix multipliziert eine dichte Matrix ist eine Menge von Skalarprodukt, die mit reduziert werden kann. Das wird deine Funktion schneller machen.