描述符匹配的rfactor调度

时间:2017-10-25 20:40:57

标签: halide

我正在尝试将Halide用于强力描述符(例如SIFT)匹配。我想在时间表中尝试rfactor,但我似乎无法得到关联性证明。到目前为止,我有以下内容:

Var c("c"), i("i");

Func diff("diff"), diffSq("diffSq"), dotp("dotp"), out("out"),
     inp1("inp1"), inp2("inp2"), minVal("minVal");

inp1(c,x) = input1(c,x);
inp2(c,y) = input2(c,y);

diff(x,y,c) = inp1(c, x) - inp2(c, y);
diffSq(x,y,c) = diff(x,y,c) * diff(x,y,c);

RDom rc(0,128);
dotp(x, y) = 0.f;
dotp(x, y) += diffSq(x, y, rc);

// Argmin, see https://github.com/halide/Halide/blob/master/test/correctness/rfactor.cpp#L804
RDom ry(0, input2.height(), "ry");
minVal(x) = {-1, std::numeric_limits<float>::max()};
minVal(x) = {
    select(minVal(x)[1] < dotp(x, ry)
          ,minVal(x)[0]
          ,ry),
    min(minVal(x)[1], dotp(x, ry))
};

out(x) = minVal(x)[0];

// Schedule
RVar ryo("ryo"), ryi("ryi");
Var yy("yy");
Func intermediate("inter");

dotp.compute_root();

minVal.update(0).split(ry, ryo, ryi, 16);
//intermediate = minVal.update(0).rfactor(ryo, yy);

最后一条未注释的行遗憾地失败了:

|| Failed to call rfactor() on minVal.update(0) since it can't prove associativity of the operator

感谢关于如何解决这个问题的任何指示!

1 个答案:

答案 0 :(得分:0)

快速回答:只有一个元组元素的顺序匹配。翻转它们应该允许rfactor。列表中将有一个更完整的答案,我们将看一下概括匹配器。 (回答确保SO方面不会被遗忘。)