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

Halide: Passing a C++ function into a Halide Func

我有一张二值图像,我想使用 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图片的。

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

你想要的可以在 (image(x, y) != 0) 上的纯 Halide argmax 中得到 - 它会 return 第一个真值的索引。但这不会有中断行为。这是我们一直想实现的优化,但我们还没有实现。

您可以使用 Func::define_extern 在任意 C++ 阶段即兴表演。您可以对它们使用 compute_at 以对某些消耗 Func 的每列进行外部调用,然后对消耗 Func 使用常规 Halide 调度以并行处理列。

有关 define_extern 用法的示例,请参阅:https://github.com/halide/Halide/blob/master/test/correctness/extern_stage.cpp