2017-05-21 13 views
1

아래의 샘플 코드를 실행하려고하면 (조회 테이블과 유사) 항상 다음과 같은 오류 메시지가 발생합니다. "함수 'out'의 순수한 정의가 함수를 호출합니다. 치수 0에서 무한정의 방식으로 '색상'을 사용합니다.LUT에 대한 제한 사항 : 차원에서 무제한 방식으로

RDom r(0, 10, 0, 10); 
Func label, color, out; 
Var x,y,c; 

label(x,y) = 0; 
label(r.x,r.y) = 1; 

color(c) = 0; 
color(label(r.x,r.y)) = 255; 

out(x,y) = color(label(x,y)); 

out.realize(10,10); 

실현되기 전에, 나는 정적으로 아래처럼 바운드를 정적으로 설정하려고 시도했습니다.

color.bound(c,0,10); 
label.bound(x,0,10).bound(y,0,10); 
out.bound(x,0,10).bound(y,0,10); 

또한 히스토그램 예제를 살펴 보았지만 조금 다릅니다.

Halide에는 어떤 종류의 제한 사항이 있습니까?

답변

1

Halide는 Func에 인수로 전달하는 값 범위를 분석하여 범위를 벗어난 액세스를 차단하고 (계산할 대상을 결정합니다). 그 값들이 무제한이라면 그렇게 할 수 없습니다. 그들을 경계하게하는 방법은 클램프입니다 :

이 경우
out(x, y) = color(clamp(label(x, y), 0, 9)); 

, 그것은 안 바운드의 이유는 레이블이 분석을 포기하게 업데이트 정의를 가지고있다. 다음과 같이 레이블을 작성한 경우 :

label(x, y) = select(x >= 0 && x < 10 && y >= 0 && y < 10, 1, 0); 

그러면 클램프가 필요하지 않습니다.

+0

'value_bound_promise (Expr val, Expr min, Expr max)'및'EnforcePromises' 및/또는'AssertPromises' 대상 기능이 있기를 바랍니다. 그런 식으로 생성 된 코드는'clamp' 나'select'를 필요로하지 않습니다. –