Как работает Fun c .realize в Halide? - PullRequest
0 голосов
/ 23 апреля 2020

Я могу понять объяснение в учебном пособии 6 , а именно:

// Func gradient("gradient");
// Var x("x"), y("y");
// gradient(x, y) = x + y;
// gradient.realize(8, 8);
//
// This does three things internally:
// 1) Generates code than can evaluate gradient over an arbitrary
// rectangle.
// 2) Allocates a new 8 x 8 image.
// 3) Runs the generated code to evaluate gradient for all x, y
// from (0, 0) to (7, 7) and puts the result into the image.
// 4) Returns the new image as the result of the realize call.

Однако, следуя описанию, я не могу понять, как работает такой пример:

    Func histogram("hist_serial");
    histogram(i) = 0;
    RDom r(0, input.width(), 0, input.height());
    histogram(input(r.x, r.y) / 32) += 1;

    histogram.vectorize(i, 8);
    histogram.realize(8);

Что меня смущает: в примере с «градиентом» оценка градиента для всех x, y от (0,0) до (7,7) может дать нам результат, такой как градиент (1 , 1) = 1 + 1 = 2. Но во втором примере оценка гистограммы для i от 0 до 7 выглядит странно для меня, так как я думаю, что мы пытаемся вычислить результат задом наперед. Более естественный способ - сначала оценить входные данные, а затем вычислить гистограмму.

Итак, как работает «реализовать» во втором примере?

1 Ответ

1 голос
/ 23 апреля 2020

Halide автоматически выводит все значения, которые необходимо вычислить для получения запрошенной области вывода. realize просто просит конвейер вычислить запрошенную область выходных данных Func (s). Затем Halide автоматически определяет, какие области требуются ранее Func s, и рекурсивно оценивает все из них, вплоть до входных данных, перед созданием запрошенной области выходных данных.

...