【问题标题】:Output values to buffers of different sizes将值输出到不同大小的缓冲区
【发布时间】:2017-03-22 00:10:34
【问题描述】:

我需要将 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 });

元组不是解决这个问题的正确方法吗?

【问题讨论】:

  • 每个 x,y 处的 Tuple 都是相同的,因此 Buffer 的大小必须相同。

标签: c++ halide


【解决方案1】:

使用两个输出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 });

【讨论】:

  • 这种情况下Pipeline能否并行执行两个Funcs?
  • 取决于日程安排。 Halide 目前做线程并行的唯一方法是并行化 Func 的一个维度。对于这种情况,可以通过使用具有单个索引的 Func 来完成,该索引采用值 0 和 1,然后在索引上选择以计算取决于 out1 或 out2 的东西,但我不愿意在这里写成a)评论回复不是正确的地方,并且 b)它似乎并不表明一个人想要解决的真正问题。通常,多个输出用于捕获由精心安排的管道计算的多个事物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2020-09-05
  • 2017-08-11
  • 2012-02-06
  • 2018-12-12
  • 2011-12-24
相关资源
最近更新 更多