2016-07-20 10 views
0

OCLパイプを使用してカーネル間でデータを渡していますが、各パスの後に新しいデータが入るようにパイプをクリアする必要があります。私は 'write_pipe'関数を使うたびにそれ自体?OpenCLパイプのクリア

私は基本的にこれをやっている、と私は理想的にパイプを使用する:

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

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

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

答えて

1

pipeは、FIFOメモリのオブジェクトであり、あなたがそれを読んで一度クリアされます。

また、特定のカーネルはパイプの読み書きができますが、両方のパイプの読み書きはできません。

あなたはhere

+0

単一のカーネル内のパイプW R /にはいくつかの回避策がありますパイプ+例についての詳細を読むことができますか?いくつかの種類の障壁や類似の障壁がありますか? 2番目のカーネルの計算が終了した直後に、カーネルがループが完了するまで再び呼び出されるときに、2番目のカーネルの計算がそのデータに戻されるようにする必要があります。パイプを使用する目的は最適化のためです。この場合、ホストとの間でデータのやりとりをするコードは望ましくありません。 – jiuwo

+1

単一のカーネルで回避するのではなく、回避してください。 kernel1がpipe1に書き込み、pipe2とkernel2からpipe2への書き込みとpipe1からの読み取りを行うように、おそらく2つのカーネル(2番目の複製または同様のもの)と2つのパイプを持つ必要があります。 – doqtor

+0

カーネルは、一般的なopenclコンテキスト、例えばグラフィックカードでも動作させることができます: '' k1:ホストからの読み込み、pipe0'の書き込み'' 'k2:パイプの読み込み0、パイプ1の書き込み' '' 'k3:読み込みpipe1、write pipe0' 'k4:パイプを読み、ホストに書き込み' ?私が書いたコードはあるデバイスで動作しているようだが、別のデバイスでは動作していないようだ。 – jiuwo