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

Halide: Filter elements out of vector (Halide::Runtime::Buffer)

我有一个 Halide::Runtime::Buffer 并且想删除符合条件的元素,理想情况下操作发生在原地并且函数可以在 Halide::Generator 中定义。

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

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

这看起来很混乱,而且对于这段代码,我传递的是 Halide::Buffer 对象,而不是 Halide::Runtime::Buffer 对象,所以我不知道如何在Halide::Generator.

所以我的问题是双重的:

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

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

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

回复:第二个问题,你用的是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 并删除 extern "C" 来自外部函数的声明。这非常有用,因为它对外部函数进行了一次 link 时间类型检查,它捕获了中等频率的 class 错误。)