我有一个二进制图像,想要使用Halide从图像的顶部开始为每列找到第一个非零像素。
在c ++中,考虑到名为mask
的图像,它看起来像这样:
vector<int> top_y;
top_y.reserve(mask.n_cols);
for (size_t x = 0; x < mask.n_cols; ++x) {
for (size_t y = 0; y < mask.n_rows; ++y) {
if (mask(y,x) != 0) {
top_y[x] = y;
break;
} else if (y == mask.n_rows-1) {
top_y[x] = mask.n_rows);
}
}
}
我已经看到了这个for, for, if
结构化循环的示例(例如使用RDom::where
指令 - 请参阅tutorial lesson 17),但这种情况因使用break;
而不同
考虑到外循环的并行特性,也许可以将C ++函数(包括内部循环函数,包括break
)传递给Halide Func,然后实现Func over图像的所有列。
如果是这样,你能指导我一个如何实现这个的例子吗?
答案 0 :(得分:2)
你想要的是纯粹的Halide argmax on(image(x,y)!= 0) - 它会返回第一个真值的索引。但这不会有破坏行为。这是我们实施意义的优化,但我们还没有。
您可以使用Func :: define_extern在任意C ++阶段进行卡塞。您可以对它们使用compute_at来对某些消耗Func的每列进行外部调用,然后对使用Func的常规Halide调度进行并行遍历列。
有关define_extern用法的示例,请参阅:https://github.com/halide/Halide/blob/master/test/correctness/extern_stage.cpp