卤化物 - 而回路等效
Halide - while loop equivalent
我正在尝试在Halide中实现Meijster距离变换算法。我已经将这段代码重写为 C++(使用 openCV(,并且它工作正常。关于这个算法的论文在这里。现在我的卤化物代码已完成 50% - 第一阶段工作正常,现在我在阶段 2(链接代码中的扫描 3(出现问题,它(简化(如下所示:
//g is 2 dimensional cv::Mat (something like array) - result of previous stage
// m is g.width and n is g.height
int(*functionF)(int x, int i, int g_i) = EDT_f;
int(*functionSep)(int i, int u, int g_i, int g_u, int max_value) = EDT_Sep;
cv::Mat dt = cv::Mat(n, m, CV_32SC1);
int* s = new int[m];
int* t = new int[m];
int q = 0, w;
for (int y = 0; y<n; y++)
{
q = 0;
s[0] = 0;
t[0] = 0;
// Scan 3
for (int u = 1; u<m; u++)
{
//how can i replace this loop:
while (q >= 0 && functionF(t[q], s[q], g.at<int>(y, s[q])) > functionF(t[q], u, g.at<int>(y, u)))
q--;
//some operations which might change value of q, s[] and t[]
}
// Scan 4 - not important here
}
有没有卤化物友好的方法来替换这个while循环?现在,到目前为止,我唯一的解决方案是像这样进行粉碎(尚未测试(:
Expr calculateQ(Expr currentQValue, Expr y, Func t, Func s, Func g)
{
//while (q >= 0 && functionF(t[q], s[q], g.at<int>(y, s[q])) > functionF(t[q], u, g.at<int>(y, u)))
//q--;
return select(currentQValue >= 0 && functionF(t[q], s[q], g[s[q], y]) > functionF(t[q], u, g[u, y]), calculateQ(currentQValue - 1, y, t, s, g), currentQValue);
}
但即使这有效,卤化物很可能会在检查条件之前尝试评估 Select 的两个值,递归会使它非常慢。
如果无法在 Halide 中实现 while 循环,有没有办法只在 Halide 中使用代码的某些部分?还有其他想法吗?
您注意到,如何表达动态终止(while(循环并不明显——它们现在不可能用纯卤化物表达!这可能会在(无限期的、长期的(未来发生变化,但添加这些将使循环卤化物程序图灵完备;没有它们,我们总是可以分析循环的边界,但是我们他们,我们将面临停止问题。
不过,对于这类事情,有一个逃生舱口:你可以从 Halide 管道内部调用外部函数(用 C 或其他任何东西实现(。extern 函数的接口看起来与编译管道的接口相同(它采用标量和缓冲区参数,最终缓冲区是输出,如果使用 null 缓冲区调用,则必须根据其输出请求的边界计算其输入所需的边界(。查看extern_*
测试程序以获取一些示例,例如 https://github.com/halide/Halide/blob/master/test/correctness/extern_stage.cpp。快速浏览您的代码,我相信它应该可以使用您已有的 C 代码在外部阶段轻松实现。
- 彩色图像的卤化物处理平均值
- 具有 GPU 时间表的卤化物产生黑色图像
- 卤化物:X86汇编代码生成
- 更快地将卤化物图像转换为 opencv 垫?
- 卤化物::GPU 上的缓冲区
- 有没有办法将两个输入图像堆叠到卤化物发生器中的单个 4 维缓冲区中?
- 定义一个带有缓冲区的函数作为卤化物中的边界框参数
- 卤化物:较大图像的去马赛克算法错误.似乎适用于 16x16 图像
- 如何使以下卤化物代码更加高效
- 如何让卤化物使用滑动窗口优化?
- 卤化物最佳计划
- 之一卤化物中的Cholesky分解
- 卤化物:将C 功能传递到卤化物弹性中
- 卤化物中的可变域还原
- 卤化物检查是否可以分开
- 如何使用卤化物轮廓仪
- 卤化物表达式:_pFirstBlock == pHead 在简单程序上崩溃
- 将卤化物与表示为浮点数组的 HDR 图像一起使用
- 更改卤化物输出缓冲器布局
- 卤化物 - 而回路等效