在满足某些条件之前,如何将 Halide 管道的输出传回管道?
How do I keep passing the output of a Halide pipeline back into the pipeline until some condition is met?
我有一个 Halide 管道,它接收图像并对其应用一些滤镜。它适用于单次通过。我传入一个图像,并将处理后的图像作为输出。我想做的是实现多次传递,即,我想继续将输出图像传递回管道中进行多个步骤,直到满足图像上的某些条件。
我该怎么做卤化物?我能想到的唯一其他方法是使用外部 C++ 方法来循环调用管道。我希望这是否可以在 Halide 中实现。
代码看起来像这样。我想在循环中使用输出作为输入,直到满足某些条件。
int main(int argc, char **argv) {
Buffer<uint8_t> input = Tools::load_and_convert_image("img.png");
int W = input.width();
int H = input.height();
Buffer<uint8_t> output(W, H);
// after some Funcs. res is last Func of the pipeline
res.realize(output);
Tools::convert_and_save_image(output, "out.png");
return 0;
}
您可以 运行 管道静态次数,方法是将其展开到更大的管道中。如果您正在计算的内容可以表示为单个阶段,则可以通过使用 RDom
迭代连续的应用程序来 运行 它动态但无条件的次数。但是,您不能用动态终止条件表示任何循环(您可能认为是 while
循环)。您必须在调用 C++ 代码中执行此操作。
您提出了一个很有见地的问题。这是语言的一个有意识的约束:它是循环边界之间的区别 decidable, and becoming Turing complete。该语言的未来版本可能会以有针对性的方式对其进行扩展,但它目前对于编译器如何推断程序中的所有边界来说是非常基础的。
我有一个 Halide 管道,它接收图像并对其应用一些滤镜。它适用于单次通过。我传入一个图像,并将处理后的图像作为输出。我想做的是实现多次传递,即,我想继续将输出图像传递回管道中进行多个步骤,直到满足图像上的某些条件。 我该怎么做卤化物?我能想到的唯一其他方法是使用外部 C++ 方法来循环调用管道。我希望这是否可以在 Halide 中实现。
代码看起来像这样。我想在循环中使用输出作为输入,直到满足某些条件。
int main(int argc, char **argv) {
Buffer<uint8_t> input = Tools::load_and_convert_image("img.png");
int W = input.width();
int H = input.height();
Buffer<uint8_t> output(W, H);
// after some Funcs. res is last Func of the pipeline
res.realize(output);
Tools::convert_and_save_image(output, "out.png");
return 0;
}
您可以 运行 管道静态次数,方法是将其展开到更大的管道中。如果您正在计算的内容可以表示为单个阶段,则可以通过使用 RDom
迭代连续的应用程序来 运行 它动态但无条件的次数。但是,您不能用动态终止条件表示任何循环(您可能认为是 while
循环)。您必须在调用 C++ 代码中执行此操作。
您提出了一个很有见地的问题。这是语言的一个有意识的约束:它是循环边界之间的区别 decidable, and becoming Turing complete。该语言的未来版本可能会以有针对性的方式对其进行扩展,但它目前对于编译器如何推断程序中的所有边界来说是非常基础的。