SkVMTool.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright 2019 Google LLC
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/core/SkCpu.h"
  8. #include "src/core/SkVM.h"
  9. #include "tools/SkVMBuilders.h"
  10. #include <chrono>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. void sk_abort_no_print() {
  14. abort();
  15. }
  16. void SkDebugf(const char* fmt, ...) {
  17. va_list args;
  18. va_start(args, fmt);
  19. vfprintf(stderr, fmt, args);
  20. va_end(args);
  21. }
  22. static skvm::Program plus_one() {
  23. skvm::Builder b;
  24. skvm::Arg ptr = b.arg<int>();
  25. skvm::I32 v = b.load32(ptr);
  26. b.store32(ptr, b.add(v, b.splat(1)));
  27. return b.done("plus_one");
  28. }
  29. static skvm::Program square() {
  30. skvm::Builder b;
  31. skvm::Arg ptr = b.arg<int>();
  32. skvm::I32 v = b.load32(ptr);
  33. b.store32(ptr, b.mul(v,v));
  34. return b.done("square");
  35. }
  36. static void print(double val, const char* units) {
  37. const char* scales[] = { "", "K", "M", "G", "T" };
  38. const char** scale = scales;
  39. while (val > 10000.0) {
  40. val *= 1/1000.0;
  41. scale++;
  42. }
  43. printf("%4d %s%s", (int)val, *scale, units);
  44. }
  45. template <typename Fn>
  46. static double measure(Fn&& fn) {
  47. using clock = std::chrono::steady_clock;
  48. int loops = 0;
  49. auto start = clock::now();
  50. std::chrono::duration<double> elapsed;
  51. do {
  52. fn();
  53. loops++;
  54. elapsed = clock::now() - start;
  55. } while (elapsed < std::chrono::milliseconds(100));
  56. return loops / elapsed.count();
  57. }
  58. template <typename... Args>
  59. static void time(const char* name, const skvm::Program& program, Args... args) {
  60. printf("%20s", name);
  61. for (int N : { 15, 255, 4095 }) {
  62. double loops_per_sec = measure([&]{
  63. program.eval(N, args...);
  64. });
  65. printf("\t");
  66. print(N*loops_per_sec, "px/s");
  67. }
  68. printf("\n");
  69. }
  70. int main(int argc, char** argv) {
  71. #if defined(__x86_64__)
  72. SkCpu::CacheRuntimeFeatures();
  73. #endif
  74. int src[4096],
  75. dst[4096];
  76. time("plus_one", plus_one(), dst);
  77. time( "square", square(), dst);
  78. time("srcover_f32" , SrcoverBuilder_F32 ().done("srcover_f32" ), src, dst);
  79. time("srcover_i32" , SrcoverBuilder_I32 ().done("srcover_i32" ), src, dst);
  80. time("srcover_i32_naive", SrcoverBuilder_I32_Naive().done("srcover_i32_naive"), src, dst);
  81. time("srcover_i32_SWAR" , SrcoverBuilder_I32_SWAR ().done("srcover_i32_SWAR" ), src, dst);
  82. return 0;
  83. }