Halide を使用してステンシル計算を実行しようとしています。したがって、基本的な 5 ポイントの 2D ステンシルを想定すると、セル i,j の値を評価するには、i-1、j i-2,j、i+1、j i+2,j の値が必要です。これが C++ で機能する方法は、for ステートメントがあることです。
for(int i = 2; i < max_i - 2; i++)
for(int j = 2; j < max_j - 2; j++)
Calculate out = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j))
今、私は Halide で同じことをしようとしています。そのため、C++ コードの入力配列と同じ値を持つ Buffer が呼び出されています。そして、呼び出された Func があります。
out(i,j) = select(i >= 2 && j >= 2, some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) ,0.0f)
このコードを実行すると、次のエラーが発生します。
エラー: 入力バッファー b0 は -1 でアクセスされます。これは次元 0 の最小値 (0) より前です 中止 (コア ダンプ)
私の理解では、このエラーの理由は、select ステートメントが両方のステートメントを評価するため、i と j の値が 2 未満の場合は何も計算したくありませんが、関数は i = 0 と j = 0 で評価されるため、無効なアドレス アクセス。
それで、Halideでこれを行う方法はありますか?if/else ステートメントに相当するものは他にありますか?