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
.
所以我的问题是双重的:
- 能否在纯卤化物中实现这种过滤,最好是就地?
- 是否有在生成器中使用
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_extern
到 NameMangling::CPlusPlus
并删除 extern "C"
来自外部函数的声明。这非常有用,因为它对外部函数进行了一次 link 时间类型检查,它捕获了中等频率的 class 错误。)
我有一个 Halide::Runtime::Buffer
并且想删除符合条件的元素,理想情况下操作发生在原地并且函数可以在 Halide::Generator
中定义。
我研究过使用缩减,但在我看来我无法输出不同长度的向量 -- 我只能将某些元素设置为我选择的值。
到目前为止,我让它工作的唯一方法是使用 extern "C"
调用并传递我想要过滤的缓冲区,以及一个布尔缓冲区(1 和 0 作为整数)。我将缓冲区读入另一个库 (Armadillo) 的向量,进行我想要的过滤,然后将过滤后的向量读回 Halide。
这看起来很混乱,而且对于这段代码,我传递的是 Halide::Buffer
对象,而不是 Halide::Runtime::Buffer
对象,所以我不知道如何在Halide::Generator
.
所以我的问题是双重的:
- 能否在纯卤化物中实现这种过滤,最好是就地?
- 是否有在生成器中使用
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_extern
到 NameMangling::CPlusPlus
并删除 extern "C"
来自外部函数的声明。这非常有用,因为它对外部函数进行了一次 link 时间类型检查,它捕获了中等频率的 class 错误。)