C++ 将值输出到不同大小的缓冲区

C++ 将值输出到不同大小的缓冲区,c++,halide,C++,Halide,我需要输出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<uint

我需要输出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 });
[4]={1,2,3,4}; uint8_t_out1[4]; uint8_t_out2[1]; 缓冲区输入(_输入,2,2); 缓冲区out1(_out1,2,2); 缓冲区out2(_out2,1,1); 变量x,y; 函数f; f(x,y)={ 在(x,y)中, 英寸(x/2,y/2) }; f、 实现({out1,out2});
元组不是这个问题的正确解决方案吗?

使用两个输出
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 });
[4]={1,2,3,4}; uint8_t_out1[4]; uint8_t_out2[1]; 缓冲区输入(_输入,2,2); 缓冲区out1(_out1,2,2); 缓冲区out2(_out2,1,1); 变量x,y; Func f1,f2; f1(x,y)=in(x,y); f2(x,y)=in(x/2,y/2); 管道管道({f1,f2}); 实现({out1,out2});
在这种情况下,管道是否能够并行执行两个
Func
s?取决于调度。Halide目前实现线程并行的唯一方法是并行化Func的维度。在这种情况下,可以使用一个Func,它有一个单一的索引,该索引的值为0和1,然后选择该索引来计算依赖于out1或out2的内容,但我不愿意在这里写出来,因为a)评论回复不是正确的地方,b)它似乎并不表明人们想要解决的真正问题。通常,多个输出用于捕获由一个调度良好的管道计算的多个内容。每个x,y都是相同的元组,因此缓冲区的大小必须相同。