卤化物:将C 功能传递到卤化物弹性中

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

本文关键字:卤化物 功能      更新时间:2023-10-16

我有一个二进制图像,想从图像的顶部开始使用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指令 - 请参见教程17),但是这种情况因使用break;而有所不同。

鉴于外循环的平行性质,也许可以传递C 函数(由内部循环函数,包括break组成)到卤化物功能,然后在图像的所有列上意识到该功能。p>如果是这样,您可以将我带到如何实现的示例吗?

您想要的东西可以在(图像(x,y)!= 0)的纯Halide argmax中获得 - 它将返回第一个真实值的索引。但这不会具有休息行为。这是我们一直在实施的优化,但我们还没有。

您可以使用func :: Define_extern在任意C 阶段堵塞。您可以在它们上使用compute_at进行每列的外部呼叫,然后在消耗函数上使用常规的卤化物调度来平行于列。

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