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