#include "Halide.h" #include #include "halide_benchmark.h" using namespace Halide; using namespace Halide::Tools; int global_to_prevent_opt; int null_call() { return global_to_prevent_opt; } int main(int argc, char **argv) { Target target = get_jit_target_from_environment(); if (target.arch == Target::WebAssembly) { printf("[SKIP] Performance tests are meaningless and/or misleading under WebAssembly interpreter.\n"); return 0; } { global_to_prevent_opt = argc; double t = benchmark([&]() { null_call(); }); std::cout << "No argument native call time " << t * 1e6 << "us.\n"; } { Func f; f() = 42; f.compile_jit(); double t = benchmark([&]() { f.realize(); }); std::cout << "No argument Func realize time " << t * 1e6 << "us.\n"; } { Func f; f() = 42; Pipeline p(f); p.compile_jit(); double t = benchmark([&]() { p.realize(); }); std::cout << "No argument Pipeline realize time " << t * 1e6 << "us.\n"; } { Func f; f() = 42; Pipeline p(f); p.compile_jit(); auto buf = Buffer::make_scalar(); Realization r(buf); Target target; double t = benchmark([&]() { p.realize(r, target); }); std::cout << "No argument Pipeline realize reusing Realization/Target time " << t * 1e6 << "us.\n"; } { Func f; f() = 42; Pipeline p(f); p.compile_jit(); auto buf = Buffer::make_scalar(); Target target; double t = benchmark([&]() { p.realize(buf, target); }); std::cout << "No argument Pipeline realize reusing Buffer/Target time " << t * 1e6 << "us.\n"; } { Func f; f() = 42; Pipeline p(f); p.compile_jit(); // This is probably the most common case auto buf = Buffer::make_scalar(); double t = benchmark([&]() { p.realize(buf); }); std::cout << "No argument Pipeline realize reusing Buffer only time " << t * 1e6 << "us.\n"; } { Func f; f() = 42; Pipeline p(f); p.compile_jit(); auto buf = Buffer::make_scalar(); Realization r(buf); Target target("host-no_asserts-no_bounds_query"); double t = benchmark([&]() { p.realize(r, target); }); std::cout << "No argument Pipeline realize reusing Realization/Target with no_asserts and no_bounds_query time " << t * 1e6 << "us.\n"; } { Func f; Param in; f() = in + 42; f.compile_jit(); in.set(0); auto buf = Buffer::make_scalar(); double t = benchmark([&]() { f.realize(buf); }); std::cout << "One argument Func realize to Buffer time " << t * 1e6 << "us.\n"; } { Func f; Param in; f() = in + 42; in.set(0); Pipeline p(f); p.compile_jit(); auto buf = Buffer::make_scalar(); Realization r(buf); Target target; double t = benchmark([&]() { p.realize(r, target); }); std::cout << "One argument Pipeline realize reusing Realization/Target time " << t * 1e6 << "us.\n"; } for (int i = 10; i < 100; i += 10) { Func f; std::vector> params(i); Expr e = 0; for (auto &p : params) { p.set(1); e += p; } f() = e; f.compile_jit(); auto buf = Buffer::make_scalar(); double t = benchmark([&]() { f.realize(buf); }); std::cout << std::to_string(i) << "-argument Func realize to Buffer time " << t * 1e6 << "us.\n"; } std::cout << "Success!\n"; return 0; }