Я могу понять объяснение в учебном пособии 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 выглядит странно для меня, так как я думаю, что мы пытаемся вычислить результат задом наперед. Более естественный способ - сначала оценить входные данные, а затем вычислить гистограмму.
Итак, как работает «реализовать» во втором примере?