)]}'
{
  "commit": "0f68f5e6794292955639fb92597cf51cdc2117ca",
  "tree": "5b7160cec228c474bebefebd708656fc51bffdbd",
  "parents": [
    "d19e557ac3175dc4f9e52d86dd1476c4dfe06a3e"
  ],
  "author": {
    "name": "Kaylee Lubick",
    "email": "kjlubick@google.com",
    "time": "Wed Jul 01 15:34:17 2026 +0000"
  },
  "committer": {
    "name": "skcq-be@skia-corp.google.com.iam.gserviceaccount.com",
    "email": "skcq-be@skia-corp.google.com.iam.gserviceaccount.com",
    "time": "Wed Jul 01 10:04:26 2026 -0700"
  },
  "message": "Add new tool for easily comparing raster pipeline benchmarks\n\nOne workflow I have for running benchmarks on SkRP is to build\na control version of nanobench, then comment out the ML4 (AVX512)\nbranch, then re-compile for a control version of ML3 (AVX2) and\nthen comment out the ML3 branch and get a control version of SSE2.\nThen make my changes. Then build experimental versions of nanobench\nto mirror those three settings.\n\nThis has gotten tedious, so I made a script to make this easier.\n\n```\n$ python3 tools/raster_pipeline/run_benchmarks.py --compile\nChecking Git status of src/opts/SkRasterPipeline_opts.h...\n\n--- Checking out Control baseline (origin/main) ---\n\nConfiguring SkOpts.cpp for Control ML4...\nCompiling nanobench_control_ml4...\nSaved binary to out/Release/nanobenches/nanobench_ml4_control\n\nConfiguring SkOpts.cpp for Control ML3...\nCompiling nanobench_control_ml3...\nSaved binary to out/Release/nanobenches/nanobench_ml3_control\n\nConfiguring SkOpts.cpp for Control SSE2...\nCompiling nanobench_control_sse2...\nSaved binary to out/Release/nanobenches/nanobench_sse2_control\n\n--- Checking out HEAD (Optimized) ---\n\nConfiguring SkOpts.cpp for Optimized ML4...\nCompiling nanobench_with_changes_ml4...\nSaved binary to out/Release/nanobenches/nanobench_ml4_with_changes\n...\n$ python3 tools/raster_pipeline/run_benchmarks.py --run --match rp_div\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n Running nanobench_ml4_control...\nTimer overhead: 23.8ns\ncurr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\tsamples   \tconfig\tbench\n  96/93  MB\t38\t303ns\t304ns\t304ns\t305ns\t0%\t█▂▄▃▆▃▃█▅▁\tnonrendering\tskrp_div_uint_4\n  96/93  MB\t215\t76ns\t76.2ns\t78.3ns\t96.9ns\t8%\t▁▁▁▁▁▁█▁▁▁\tnonrendering\tskrp_div_uint_1\n  96/93  MB\t247\t302ns\t303ns\t303ns\t312ns\t1%\t▂▁▁█▁▁▁▁▁▁\tnonrendering\tskrp_div_int_4\n  96/93  MB\t593\t75.9ns\t75.9ns\t76.7ns\t81ns\t2%\t▁█▁▁▁▁▁▁▁▆\tnonrendering\tskrp_div_int_1\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n Running nanobench_ml4_with_changes...\nTimer overhead: 23.3ns\ncurr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\tsamples   \tconfig\tbench\n  96/94  MB\t39\t303ns\t304ns\t309ns\t358ns\t6%\t▁▁▁▁█▁▁▁▁▁\tnonrendering\tskrp_div_uint_4\n  96/94  MB\t256\t75.9ns\t76.1ns\t76.1ns\t76.3ns\t0%\t▆█▁▄▁▄▁▆▆▁\tnonrendering\tskrp_div_uint_1\n  96/94  MB\t247\t302ns\t303ns\t304ns\t319ns\t2%\t▁▁▁▁▁█▁▁▁▁\tnonrendering\tskrp_div_int_4\n  96/94  MB\t506\t75.8ns\t76.1ns\t76.1ns\t76.5ns\t0%\t▃▄▁▂▂█▂▄▇▄\tnonrendering\tskrp_div_int_1\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n Running nanobench_ml3_control...\nTimer overhead: 24.7ns\ncurr/maxrss\tloops\tmin\tmedian\tmean\tmax\tstddev\tsamples   \tconfig\tbench\n  95/93  MB\t33\t303ns\t304ns\t304ns\t306ns\t0%\t█▂▄▁▅▁▄▁▅▄\tnonrendering\tskrp_div_uint_4\n  95/93  MB\t327\t162ns\t162ns\t162ns\t164ns\t0%\t▂▃▃▃▂█▂▁▂▁\tnonrendering\tskrp_div_uint_1\n  95/93  MB\t350\t302ns\t302ns\t306ns\t339ns\t4%\t▁▁▁▁▁▁▁▁▁█\tnonrendering\tskrp_div_int_4\n  95/93  MB\t606\t142ns\t143ns\t143ns\t148ns\t1%\t▂▂▂▂▂▁▃▁▃█\tnonrendering\tskrp_div_int_1\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n...\n\n```\n\nI also tweaked llvm_mca_analysis.py so one can add --reset-experiments\nto remove all but the first (control) set of data. This is handy\nwhen on the 3rd+ thing to try and the spreadsheet gets unweildy\nwith no-longer-useful info. It doesn\u0027t remove the assembly files\n(in case we do want to go back), just the data from the .tsv\n\nChange-Id: I85362ab6fdbfffc8cca29a6ba91ea8ccc23b231d\nReviewed-on: https://skia-review.googlesource.com/c/skia/+/1283016\nAuto-Submit: Kaylee Lubick \u003ckjlubick@google.com\u003e\nReviewed-by: Florin Malita \u003cfmalita@google.com\u003e\nCommit-Queue: Florin Malita \u003cfmalita@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "cd106a515cb2d48863da278bf4d563a1491005b2",
      "old_mode": 33188,
      "old_path": "tools/raster_pipeline/llvm_mca_analysis.py",
      "new_id": "ffac6b76f953b946517dd38365157f67abf175f2",
      "new_mode": 33188,
      "new_path": "tools/raster_pipeline/llvm_mca_analysis.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7b28d39097fe3404699bb534dd755f70e3206ced",
      "new_mode": 33188,
      "new_path": "tools/raster_pipeline/run_benchmarks.py"
    }
  ]
}
