/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/core/SkCpu.h" #include "src/core/SkVM.h" #include "tools/SkVMBuilders.h" #include #include #include void sk_abort_no_print() { abort(); } void SkDebugf(const char* fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } static skvm::Program plus_one() { skvm::Builder b; skvm::Arg ptr = b.arg(); skvm::I32 v = b.load32(ptr); b.store32(ptr, b.add(v, b.splat(1))); return b.done("plus_one"); } static skvm::Program square() { skvm::Builder b; skvm::Arg ptr = b.arg(); skvm::I32 v = b.load32(ptr); b.store32(ptr, b.mul(v,v)); return b.done("square"); } static void print(double val, const char* units) { const char* scales[] = { "", "K", "M", "G", "T" }; const char** scale = scales; while (val > 10000.0) { val *= 1/1000.0; scale++; } printf("%4d %s%s", (int)val, *scale, units); } template static double measure(Fn&& fn) { using clock = std::chrono::steady_clock; int loops = 0; auto start = clock::now(); std::chrono::duration elapsed; do { fn(); loops++; elapsed = clock::now() - start; } while (elapsed < std::chrono::milliseconds(100)); return loops / elapsed.count(); } template static void time(const char* name, const skvm::Program& program, Args... args) { printf("%20s", name); for (int N : { 15, 255, 4095 }) { double loops_per_sec = measure([&]{ program.eval(N, args...); }); printf("\t"); print(N*loops_per_sec, "px/s"); } printf("\n"); } int main(int argc, char** argv) { #if defined(__x86_64__) SkCpu::CacheRuntimeFeatures(); #endif int src[4096], dst[4096]; time("plus_one", plus_one(), dst); time( "square", square(), dst); time("srcover_f32" , SrcoverBuilder_F32 ().done("srcover_f32" ), src, dst); time("srcover_i32" , SrcoverBuilder_I32 ().done("srcover_i32" ), src, dst); time("srcover_i32_naive", SrcoverBuilder_I32_Naive().done("srcover_i32_naive"), src, dst); time("srcover_i32_SWAR" , SrcoverBuilder_I32_SWAR ().done("srcover_i32_SWAR" ), src, dst); return 0; }