0

私はVS2013でHalideを使用しています。最初のチュートリアルを正常にビルドして実行しました。

コードの一部を実装しようとしていますが、コンパイルできない理由がわかりません。コードは次のとおりです。

int main(int argc, char **argv) {

ImageParam input(UInt(8), 3);

Func input_clamped = BoundaryConditions::repeat_edge(input);
Var x, y, c;

Func float_input_clamped;
float_input_clamped(x, y, c) = cast<float>(input_clamped(x, y, c)) / 255.0f;

Func input_lum;
input_lum(x, y) = cast<float>(0.299f * float_input_clamped(x, y, 0) + 0.587f * float_input_clamped(x, y, 1) + 0.114f * float_input_clamped(x, y, 2));

Func m45;
m45(x, y) = fabsf(input_lum(x - 1, y) - input_lum(x, y + 1)) + fabsf(input_lum(x, y + 1) - input_lum(x + 1, y + 2));

return 0;
}

エラーは m45(x, y) = ... 行で発生します。どうやら、input_lum は float 値とは見なされません。エラー メッセージは、「Halide::Expr から float への適切な変換が存在しない」というものです。

どうやらすべてのキャストとフロート計算が無視されているようです。

(私はまだ入力を初期化していないことを知っています.Halideコードを書くときの考え方を理解しようとしています,そして型推論は私に適合を与えています.)

ここで何が間違っていますか?

(はっきりしない場合は、RGB 画像の輝度を取得し、輝度を計算したいだけです。それが機能する場合は、整数空間にとどまることができれば幸いです。)

OK、私はこれを実験して試しました:

ImageParam input(UInt(8), 3);

Func input_clamped = BoundaryConditions::repeat_edge(input);
Var x, y, c;

Func input_lum;
input_lum(x, y) = 0.299f * input_clamped(x, y, 0) + 0.587f * input_clamped(x, y, 1) + 0.114f * input_clamped(x, y, 2);

Func m45;
m45(x, y) = abs(input_lum(x - 1, y) - input_lum(x, y + 1)) + abs(input_lum(x, y + 1) - input_lum(x + 1, y + 2));

これでコンパイルは完了しましたが、何をしているのかわかりません。input_lum() の型が float にならないのはなぜですか?

4

1 に答える 1

3

ここで混乱するのは、Halide コードでintとの式を混在させることではなく、 s を C++および関数と混在させることです。C float 値を受け取って返す C 関数です。実際に必要なのは、浮動小数点型の Halide 式の絶対値を取る Halide 組み込み関数です。この場合、2 番目のスニペットで発見したように、それは だと思います。floatHalide::ExprintfloatfabsfHalide::abs

この C++ コードの実行時である Halide プログラムのコンパイル/構築時間realizeと、Halide プログラムの実行時 (によって生成された関数を呼び出すか呼び出すとき)の違いcompile_to_fileは、非常に一般的な初期の障害です。 . 現時点でいずれかを削除すると、Halide 関数(Halide アルゴリズム コードを記述するときに使用する型)について何も知らないなどの実際の標準 C 関数using namespace Halideを明示的に使用している場所がより明確になるはずです。Halide プログラムで使用しようとしていた方法でそれらを有意義に使用することは決してできません。便宜上、Halide の標準的な数学関数の多くが対応する関数と同じ名前になっていることがあります。それなしHalide::abs::fabsfHalide::Exprmath.husing namespace Halidemath.hただし、またはその他の関数 (意味がない) ではなく、Halide 関数 (このコンテキストでは意味がある) の使用について明示する必要があります。

于 2015-08-22T08:29:01.510 に答える