Halide:将C ++函数传递给Halide Func

时间:2017-09-05 19:01:47

标签: c++ image-processing halide

我有一个二进制图像,想要使用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图像的所有列。

如果是这样,你能指导我一个如何实现这个的例子吗?

1 个答案:

答案 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