0

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 ステートメントに相当するものは他にありますか?

4

1 に答える 1

2

境界条件を使用すると、必要なことが行われます。 Func unbounded; unbounded(i, j,) = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)); out(i, j) = BoundaryConditions::constant_exterior(unbounded, 0.0f, 2, width - 4, 2, height - 4)(i, j);

無制限の最大値が必要な場合は、「幅 - 4」または「高さ - 4」の代わりに「Expr()」を使用できると思います。

if BoundaryConditions 関数を使用すると、if/else コンストラクトのどちらの方向がより可能性が高いかをコンパイラーに示すことができます。

于 2016-10-03T18:15:36.243 に答える