2016-07-20 18 views
0

Ich benutze OCL-Pipes, um Daten über Kernel zu übertragen, aber die Pipes nach jedem Durchlauf zu löschen, damit neue Daten hineingelangen können. Ist es möglich, die Pipes bei jedem Durchlauf zu löschen oder zu löschen? selbst jedes Mal, wenn ich die 'write_pipe' Funktion verwende?Löschen von OpenCL-Pipes

Ich mache im Wesentlichen das, und ich will ein Rohr nur im Idealfall werden:

kernel1{ 
//read data from host, then write to pipe 
} 

do..x times 
kernel2{ 
//read pipe 
//calculations 
//write pipe 
} 

kernel3{ 
//read pipe 
//write to host 
} 

Antwort

1

A pipe ein FIFO-Speicherobjekt ist und gelöscht wird, wenn Sie es lesen.

Beachten Sie auch, dass ein bestimmter Kernel entweder lesen oder in eine Pipe schreiben kann, aber nicht beides.

Sie können mehr über Rohre + Beispiel lesen here

+0

Gibt es eine Abhilfe zu R/W ein Rohr in einem einzigen Kernel? Irgendeine Art von Barrieren oder ähnliches? Ich brauche die Daten, nachdem die Berechnungen des zweiten Kernels unmittelbar nach dem Ende des Prozesses in den Kernel zurückübertragen wurden, wenn der Kernel erneut aufgerufen wird, bis die Schleife abgeschlossen ist. Der Zweck der Verwendung von Pipes ist die Optimierung, daher möchte ich in diesem Fall nicht, dass der Code Daten an den oder vom Host übermittelt. – jiuwo

+1

Workaround in einem einzelnen Kernel eher nicht. Sie werden wahrscheinlich 2 Kernel (zweites Duplikat oder ähnliches) und 2 Pipes haben müssen, damit kernel1 nach pipe1 schreibt und von pipe2 und kernel2 liest, schreibt in pipe2 und liest von pipe1. – doqtor

+0

ist es möglich, die Kernel als solche in einem allgemeinen Opencl-Kontext, sagen mit jeder Grafikkarte: 'k1: vom Host lesen, schreiben pipe0' ' k2: lesen pipe0, schreiben pipe1' 'k3: lesen pipe1, schreibe pipe0' 'k4: read pipe0, schreibe zum host' ? Der Code, den ich geschrieben habe, scheint auf einem Gerät zu funktionieren, aber nicht auf einem anderen. – jiuwo