Ejemplo n.º 1
0
RDom::RDom(ImageParam p) {
    static string var_names[] = {"x", "y", "z", "w"};
    std::vector<ReductionVariable> vars;
    for (int i = 0; i < p.dimensions(); i++) {
        ReductionVariable var = {
            p.name() + "$" + var_names[i],
            p.dim(i).min(),
            p.dim(i).extent()
        };
        vars.push_back(var);
    }

    dom = ReductionDomain(vars);
    init_vars(p.name());
}
Ejemplo n.º 2
0
void blur(std::string suffix, ImageParam input) {
    input.dim(2).set_bounds(0, 4).set_stride(1).dim(0).set_stride(4);

    Var x("x"), y("y"), c("c");

    Func clamped("clamped");
    clamped = BoundaryConditions::repeat_edge(input);

    Func blur_x("blur_x");
    blur_x(x, y, c) = (clamped(x - 1, y, c) +
                       clamped(x, y, c) +
                       clamped(x + 1, y, c)) / 3;

    Func result("avg_filter");
    result(x, y, c) = (blur_x(x, y - 1, c) +
                       blur_x(x, y, c) +
                       blur_x(x, y + 1, c)) / 3;

    result.output_buffer().dim(2).set_bounds(0, 4).set_stride(1).dim(0).set_stride(4);

    Target target = get_target_from_environment();
    result.bound(c, 0, 4)
          .reorder_storage(c, x, y)
          .reorder(c, x, y);
    if (target.has_gpu_feature() || target.has_feature(Target::OpenGLCompute)) {
        Var xi("xi"), yi("yi");
        result.unroll(c)
              .gpu_tile(x, y, xi, yi, 64, 64);
    } else {
        Var yi("yi");
        result
            .unroll(c)
            .split(y, y, yi, 32)
            .parallel(y)
            .vectorize(x, 4);
        blur_x.store_at(result, y)
            .compute_at(result, yi)
            .reorder(c, x, y)
            .unroll(c)
            .vectorize(x, 4);
    }

    std::string fn_name = std::string("avg_filter") + suffix;
    result.compile_to_file(fn_name, {input}, fn_name);
}