blob: 0b125e5ee573841ff4965db51f5bf8953abdc546 [file] [log] [blame]
/*
* 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.varying<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.varying<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;
}