私はOpenCLカーネルを持っています。このカーネルは、デバイス内から特定の機能を呼び出し、出力を出します。私は最初に垂直パスが実行され、次に水平パスが行われるような画像を処理しています。現時点では、ホスト側からカーネルを2回呼び出していますが、各呼び出しで引数の値を変更します。OpenCLカーネルで関数を順番に実行する方法は?
kernel void image_filter(a, b, c, d)
{
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
}
カーネルを一度だけ呼び出すことができるように、水平パスと垂直パスの両方が実行されるようにします。
kernel void image_filter(a, b, c, d)
{
// Vertical pass
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
// When execution of the above functions is complete
// Horizontal pass
// Some computation
func1(a, b, c, d);
if(<condition>)
func2(a, b, c, d);
}
垂直パスと水平パスの間にデータ依存関係があることに注意してください。
ここで '' barrier() ''を使うことができますか? –
いいえ、あなたは 'barrier'を使うことはできません。これはワークグループ同期のためのものです。グローバル同期が必要です。これを実行する唯一の方法は、複数のカーネルをエンキューすることです。 – Dithermaster
n個の作業項目を持つ作業グループが1つだけの場合はどうなりますか? –