C++ 将值输出到不同大小的缓冲区
我需要输出2个值到不同大小的缓冲区。一个与输入的大小相同,另一个是宽度的一半和高度的一半。我曾想过使用元组,但由于它在输入大小上迭代,所以我已经越界了。下面是一个简单的例子: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
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都是相同的元组,因此缓冲区的大小必须相同。