123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- * 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 <chrono>
- #include <stdio.h>
- #include <stdlib.h>
- 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<int>();
- 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<int>();
- 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 <typename Fn>
- static double measure(Fn&& fn) {
- using clock = std::chrono::steady_clock;
- int loops = 0;
- auto start = clock::now();
- std::chrono::duration<double> elapsed;
- do {
- fn();
- loops++;
- elapsed = clock::now() - start;
- } while (elapsed < std::chrono::milliseconds(100));
- return loops / elapsed.count();
- }
- template <typename... Args>
- 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;
- }
|