2016-10-03 2 views
0

Halide를 사용하여 스텐실 계산을 일부 수행하려고합니다. 따라서 기본 5 점 2D 스텐실을 가정하고 셀 i, j의 값을 평가하려면 i-1, ji-2, j, i + 1, ji + 2, j의 값이 필요합니다. 이제 C++에서 작동하는 방식은 다음과 같습니다.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)) 

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

: 나의 이해에서

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

을,이 오류의 원인은 그 선택 문들을 평가입니다 두 진술 그래서 내가 i와 j 값을 2보다 작게 계산하고 싶지는 않지만 함수는 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 구문의 방향을 컴파일러에 암시 할 수 있습니다.