2016-10-03 13 views
0

私はHalideを使っていくつかのステンシル計算をしようとしています。したがって、基本的な5点2Dステンシルを仮定すると、セルi、jの値を評価するために、i-1、j i-2、j、i + 1、j i + 2、jの値が必要です。Halide select文の問題

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)) 

今、私はハロゲン化物と同じことをやろうとしている:今、これはC++で動作する方法は、私が声明を持っているということです。だから私はC + +コード内の私の入力配列と同じ値を持っているバッファが呼び出されている。そして私は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)

を、私はこのコードを実行すると、私は次のエラーを取得:私の理解から

Error: Input buffer b0 is accessed at -1, which is before the min (0) in dimension 0 Aborted (core dumped)

を、このエラーの理由は、そのselect文を評価していますi = 0、j = 0、したがって無効なアドレスアクセスで関数が評価されます。

これはHalideでこれを行うにはどうしてですか? if/else文には他の同等のものはありますか?あなたがやりたいだろう境界条件を使用して

答えて

2

:あなたは最大無制限にしたい場合は - - または「4高」 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);

は、私はあなたが「Exprに()」の代わりに「4幅」を使用することができると信じています。

BoundaryConditions関数を使用すると、if/else構文のどちらの方向性が高い可能性が高いかをコンパイラにヒントできます。

関連する問題