0

私はHalideを初めて使用し、最初にアルゴリズムの実装をいじっています。周囲の 8 ピクセルの値に応じて、次のピクセルにスキップするか、何らかの処理を行ってから次のピクセルに移動する関数を作成しようとしています。これを書き込もうとすると、次のコンパイラ エラーが発生します。

84:5: エラー: タイプ 'Halide::Expr' の値は、文脈上 'bool' に変換できません

    if(input(x,y) > 0)

すべてのチュートリアルを完了し、select 関数がオプションであることを確認しましたが、関数の値を比較したり、それらをどこかに保存したりする方法はありますか?

また、この問題について間違って考えているか、正しい「ハライドの考え方」で実装していない可能性があるので、どんな提案も素晴らしいでしょう。よろしくお願いします!

4

2 に答える 2

3

1 行以外のコードを提供していないので、inputは aFuncであり、両方xであり、yVars であると想定しています。その場合、エラー メッセージが示すように、 の結果はinput(x,y)ではExpr評価できません。if

あなたが説明するシナリオでは、次のようなものがあるかもしれません:

Var x, y;
Func input; input(x,y) = ...;
Func output; output(x,y) = select

    // examine surrounding values
    (  input(x-1,y-1) > 0
    && input(x+0,y-1) > 0
    &&    ...
    && input(x+1,y+1) > 0

    // true case
    , ( input(x-1,y-1)
      + input(x+0,y-1)
      +   ...
      + input(x+1,y+1)
      ) / 8

    // false case
    , input(x,y)
    );

Halide で作業するには、間違いなく異なる考え方が必要です。もっと数学的な形で考えなければなりません。つまり、 と のすべての場合に のステートメントがa(x,y) = b(x,y)適用されます。xy

アルゴリズムとスケジューリングは分離する必要がありますが、より良いスケジューリングを可能にするためにアルゴリズムを微調整する必要がある場合があります。

于 2016-06-09T19:26:30.440 に答える