2017-03-21 1 views
1

크기가 다른 버퍼에 2 개의 값을 출력해야합니다. 하나는 입력과 동일한 크기이고 다른 하나는 너비의 절반이고 높이의 절반입니다. 나는 튜플을 사용할 것을 생각했지만, 입력 크기를 반복하기 때문에 범위를 벗어납니다. 다음은 간단한 예입니다.다른 크기의 버퍼에 값을 출력하십시오.

uint8_t _in[4] = { 1, 2, 3, 4 }; 
uint8_t _out1[4]; 
uint8_t _out2[1]; 

Buffer<uint8_t> in(_in, 2, 2); 
Buffer<uint8_t> out1(_out1, 2, 2); 
Buffer<uint8_t> out2(_out2, 1, 1); 

Var x, y; 
Func f; 

f(x, y) = { 
    in(x,y), 
    in(x/2, y/2) 
}; 

f.realize({ out1, out2 }); 

튜플이 이에 대한 올바른 해결책이 아닙니까?

+0

그것은 각각 X, Y에 같은 튜플이기 때문에 버퍼 크기가 동일해야합니다. –

답변

2

두 개의 출력 Funcs을 사용하여 Halide::Pipeline을 만들고 Pipeline 개체에서 realize을 호출하십시오. 그래서 같은

뭔가 :

uint8_t _in[4] = { 1, 2, 3, 4 }; 
uint8_t _out1[4]; 
uint8_t _out2[1]; 

Buffer<uint8_t> in(_in, 2, 2); 
Buffer<uint8_t> out1(_out1, 2, 2); 
Buffer<uint8_t> out2(_out2, 1, 1); 

Var x, y; 
Func f1, f2; 

f1(x, y) = in(x,y); 
f2(x, y) = in(x/2, y/2); 

Pipeline pipeline({f1, f2}); 

pipeline.realize({ out1, out2 }); 
+0

이 경우 파이프 라인이 두 개의 'Func'을 병렬로 실행할 수 있습니까? –

+0

일정에 따라 다릅니다. Halide의 현재 스레드 병렬 처리를 수행하는 유일한 방법은 Func의 차원을 병렬화하는 것입니다. 이 경우, 값 0과 1을 취하는 단일 인덱스를 가진 Func를 가지고 수행 한 다음, 인덱스에서 out1 또는 out2에 의존하는 값을 계산하도록 선택할 수 있습니다. 그러나 여기에이를 쓰는 것을 꺼립니다. a) 의견 회신은 그것을 할 수있는 적절한 장소가 아니며 b) 해결하고자하는 실제 문제를 나타내는 것으로 보이지는 않습니다. 일반적으로 여러 개의 출력을 사용하여 잘 계획된 파이프 라인에 의해 계산 된 둘 이상의 것을 캡처합니다. –

관련 문제