Halide:从向量中过滤元素(Halide :: Runtime :: Buffer)

时间:2017-11-04 21:02:00

标签: halide

我有Halide::Runtime::Buffer并希望删除符合条件的元素,理想情况是操作就位,并且可以在Halide::Generator中定义该函数。

我已经研究过使用缩减,但在我看来,我无法输出不同长度的向量 - 我只能将某些元素设置为我选择的值。

到目前为止,我让它工作的唯一方法是使用extern "C"调用并传递我想要过滤的缓冲区,以及布尔缓冲区(1' s和0' s作为投注)。我将Buffers读入另一个库(Armadillo)的载体,进行了我想要的过滤器,然后将过滤后的载体读回Halide。

这看起来非常混乱,而且,使用此代码,我传递了Halide::Buffer个对象,而不是Halide::Runtime::Buffer个对象,所以我不知道如何实现这个在Halide::Generator内。

所以我的问题有两个:

  1. 这种过滤是否可以在纯卤化物中实现,最好是就地?
  2. 是否有在Generators中使用extern "C"函数的示例?

1 个答案:

答案 0 :(得分:1)

第一部分是有效的流压缩。它可以在Halide中完成,但输出大小需要固定或输入大小的函数(例如与输入相同的大小)。可以将最大索引作为输出产生,以指示产生了多少结果。我在这里写了一些关于如何进行基于前缀和流压缩的答案:Halide: Reduction over a domain for the specific values。如何在各种目标上同时最有效地做到这一点是一个悬而未决的问题,我们希望尽快开展一些探索这个领域的工作。

这是否就地取决于是否可以将所有内容放入Func的一系列更新定义中。例如。它不能在传入Halide过滤器的输入上就地完成,因为减少总是会分配一个缓冲区来处理。如果在Generator内部产生输入,则可以这样做。

Re:第二个问题,您使用的是define_extern吗?这与Halide::Runtime::Buffer没有很好地集成,因为外部函数必须用halide_buffer_t实现,但是从发生器内部访问它是相当直接的。我们还没有关于此的教程,但测试中有很多例子。例如。:     https://github.com/halide/Halide/blob/master/test/generator/define_extern_opencl_generator.cpp#L19

和定义:

https://github.com/halide/Halide/blob/master/test/generator/define_extern_opencl_aottest.cpp#L119

(这些不一定是extern "C",因为我实施了C ++名称修改。只需将名称修改参数设置为define_externNameMangling::CPlusPlus并删除{{1}来自外部函数的声明。这非常有用,因为它在外部函数上获得一个链接时间类型检查,它捕获了一个中等频率的错误类。)