Skip to content

Make conversion to/from arrays generic, take 2 - #292

Open
Shnatsel wants to merge 1 commit into
linebender:mainfrom
Shnatsel:remove-duplicate-array-codegen
Open

Make conversion to/from arrays generic, take 2#292
Shnatsel wants to merge 1 commit into
linebender:mainfrom
Shnatsel:remove-duplicate-array-codegen

Conversation

@Shnatsel

Copy link
Copy Markdown
Contributor

A different take on #286: reduce duplicate code and allow all the same generic programming perks, without creating extra traits and disrupting the existing trait hierarchy.

This is a draft. I am going to port Vello to this to see how it feels in practice before committing to the design.

@Shnatsel

Copy link
Copy Markdown
Contributor Author

Vello does not need any code changes, unlike for #286.

Vello benchmarks improvements:

  • 18% on fine/blend/normal_u8_avx2
  • 70% on fine/blend/clear_u8_sse4_2
  • 23% on fine/blend/dest_over_u8_sse4_2
  • 10% on fine/image/extend/reflect_u8_sse4_2
  • 11% on fine/image/extend/reflect_u8_avx2

Vello benchmark regressions:

  • 18% on fine/blend/clear_u8_avx2
  • 16% on fine/blend/src_out_u8_sse4_2
  • 271% on fine/blend/plus_u8_sse4_2
  • 261% on fine/blend/plus_lighter_u8_sse4_2

The rest is noise - small movements both ways.

Full benchmark run


allocator/alloc_1000_varied_8_128
                        time:   [297.68 µs 297.71 µs 297.76 µs]
                        change: [+0.7412% +0.7922% +0.8431%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  1 (1.00%) low mild
  1 (1.00%) high mild
  1 (1.00%) high severe

allocator/alloc_until_full_32x32
                        time:   [330.19 µs 330.21 µs 330.22 µs]
                        change: [-0.5530% -0.5196% -0.4898%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) low severe
  2 (2.00%) high mild
  3 (3.00%) high severe

allocator/churn_500_steady_state
                        time:   [242.03 µs 242.06 µs 242.09 µs]
                        change: [+1.2235% +1.2658% +1.3059%] (p = 0.00 < 0.05)
                        Performance has regressed.

tile_aaa/Ghostscript_Tiger
                        time:   [72.006 µs 72.012 µs 72.019 µs]
                        change: [+4.5791% +4.6784% +4.7726%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 2 outliers among 50 measurements (4.00%)
  1 (2.00%) high mild
  1 (2.00%) high severe
tile_aaa/coat_of_arms   time:   [942.53 µs 942.60 µs 942.68 µs]
                        change: [+3.2055% +3.2779% +3.3493%] (p = 0.00 < 0.05)
                        Performance has regressed.
tile_aaa/Saimaa_Canal_(map)
                        time:   [2.6468 ms 2.6470 ms 2.6472 ms]
                        change: [-1.5211% -1.3925% -1.2637%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 2 outliers among 50 measurements (4.00%)
  1 (2.00%) low mild
  1 (2.00%) high severe
tile_aaa/heraldry       time:   [545.83 µs 546.11 µs 546.46 µs]
                        change: [+3.1864% +3.2484% +3.3097%] (p = 0.00 < 0.05)
                        Performance has regressed.

tile_msaa/Ghostscript_Tiger
                        time:   [206.01 µs 206.01 µs 206.03 µs]
                        change: [-0.2539% -0.1679% -0.0873%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 50 measurements (8.00%)
  2 (4.00%) high mild
  2 (4.00%) high severe
tile_msaa/coat_of_arms  time:   [1.8940 ms 1.8941 ms 1.8942 ms]
                        change: [+0.6204% +0.6445% +0.6677%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 50 measurements (12.00%)
  1 (2.00%) low severe
  1 (2.00%) low mild
  4 (8.00%) high mild
tile_msaa/Saimaa_Canal_(map)
                        time:   [5.5862 ms 5.5870 ms 5.5877 ms]
                        change: [-0.9080% -0.8621% -0.8159%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 2 outliers among 50 measurements (4.00%)
  1 (2.00%) high mild
  1 (2.00%) high severe
tile_msaa/heraldry      time:   [1.2647 ms 1.2648 ms 1.2649 ms]
                        change: [-0.3442% -0.3166% -0.2882%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 50 measurements (8.00%)
  1 (2.00%) low mild
  1 (2.00%) high mild
  2 (4.00%) high severe

tile_aaa_shift50/Ghostscript_Tiger
                        time:   [56.659 µs 56.661 µs 56.663 µs]
                        change: [+5.6428% +5.6885% +5.7315%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 4 outliers among 50 measurements (8.00%)
  2 (4.00%) high mild
  2 (4.00%) high severe
tile_aaa_shift50/coat_of_arms
                        time:   [647.46 µs 647.57 µs 647.68 µs]
                        change: [+6.5828% +6.6188% +6.6523%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 1 outliers among 50 measurements (2.00%)
  1 (2.00%) high mild
tile_aaa_shift50/Saimaa_Canal_(map)
                        time:   [2.3434 ms 2.3437 ms 2.3439 ms]
                        change: [+1.6456% +1.6751% +1.7025%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 3 outliers among 50 measurements (6.00%)
  1 (2.00%) low mild
  2 (4.00%) high mild
tile_aaa_shift50/heraldry
                        time:   [273.84 µs 273.86 µs 273.87 µs]
                        change: [+4.7110% +5.3995% +5.7679%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 3 outliers among 50 measurements (6.00%)
  1 (2.00%) high mild
  2 (4.00%) high severe

render_strips/Ghostscript_Tiger_simd
                        time:   [124.61 µs 124.61 µs 124.62 µs]
                        change: [-0.0266% -0.0122% +0.0083%] (p = 0.16 > 0.05)
                        No change in performance detected.
Found 4 outliers among 50 measurements (8.00%)
  1 (2.00%) high mild
  3 (6.00%) high severe
render_strips/coat_of_arms_simd
                        time:   [1.3299 ms 1.3300 ms 1.3301 ms]
                        change: [-0.1053% -0.0339% +0.0271%] (p = 0.35 > 0.05)
                        No change in performance detected.
Found 3 outliers among 50 measurements (6.00%)
  3 (6.00%) high severe
render_strips/Saimaa_Canal_(map)_simd
                        time:   [3.5440 ms 3.5442 ms 3.5444 ms]
                        change: [+0.1073% +0.1552% +0.2037%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 50 measurements (8.00%)
  1 (2.00%) high mild
  3 (6.00%) high severe
render_strips/heraldry_simd
                        time:   [878.70 µs 878.79 µs 878.89 µs]
                        change: [-0.2476% -0.2244% -0.1937%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 50 measurements (6.00%)
  1 (2.00%) high mild
  2 (4.00%) high severe

render_strips_culled50/Ghostscript_Tiger
                        time:   [49.341 µs 49.343 µs 49.345 µs]
                        change: [-0.0610% -0.0343% -0.0136%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 50 measurements (8.00%)
  2 (4.00%) high mild
  2 (4.00%) high severe
render_strips_culled50/coat_of_arms
                        time:   [558.66 µs 558.72 µs 558.77 µs]
                        change: [+0.1571% +0.1985% +0.2518%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 50 measurements (8.00%)
  4 (8.00%) high severe
render_strips_culled50/Saimaa_Canal_(map)
                        time:   [2.5417 ms 2.5420 ms 2.5423 ms]
                        change: [-0.2105% -0.1556% -0.1043%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 50 measurements (10.00%)
  2 (4.00%) high mild
  3 (6.00%) high severe
render_strips_culled50/heraldry
                        time:   [393.97 µs 394.02 µs 394.08 µs]
                        change: [+0.0446% +0.1354% +0.2144%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 50 measurements (6.00%)
  2 (4.00%) high mild
  1 (2.00%) high severe

render_rect/14x14_via_path
                        time:   [200.12 ns 200.25 ns 200.38 ns]
                        change: [-2.5070% -2.3662% -2.2245%] (p = 0.00 < 0.05)
                        Performance has improved.
render_rect/14x14_via_rect
                        time:   [112.93 ns 112.95 ns 112.97 ns]
                        change: [+1.4954% +1.5447% +1.5901%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 4 outliers among 50 measurements (8.00%)
  1 (2.00%) low severe
  2 (4.00%) high mild
  1 (2.00%) high severe

flatten/Ghostscript_Tiger
                        time:   [154.64 µs 154.66 µs 154.69 µs]
                        change: [-1.0189% -0.8792% -0.7439%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high severe
flatten/coat_of_arms    time:   [593.41 µs 593.48 µs 593.55 µs]
                        change: [-0.5604% -0.3820% -0.2059%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
  2 (2.00%) high mild
  3 (3.00%) high severe
flatten/Saimaa_Canal_(map)
                        time:   [1.1010 ms 1.1015 ms 1.1021 ms]
                        change: [-1.1109% -0.1692% +0.7302%] (p = 0.74 > 0.05)
                        No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
  4 (4.00%) high mild
  8 (8.00%) high severe
flatten/heraldry        time:   [315.02 µs 315.55 µs 316.08 µs]
                        change: [+0.7514% +0.9131% +1.0871%] (p = 0.00 < 0.05)
                        Change within noise threshold.

strokes/Ghostscript_Tiger
                        time:   [124.35 µs 124.35 µs 124.36 µs]
                        change: [-0.2591% -0.2347% -0.2142%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) high mild
  2 (2.00%) high severe
strokes/coat_of_arms    time:   [1.1359 ms 1.1360 ms 1.1361 ms]
                        change: [-1.1469% -1.0162% -0.8845%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) low mild
  5 (5.00%) high mild
strokes/Saimaa_Canal_(map)
                        time:   [7.4082 ms 7.4113 ms 7.4147 ms]
                        change: [-0.7548% -0.6869% -0.6180%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) high mild
  1 (1.00%) high severe
strokes/heraldry        time:   [847.68 µs 848.10 µs 848.69 µs]
                        change: [-0.2445% -0.2165% -0.1833%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 13 outliers among 100 measurements (13.00%)
  4 (4.00%) high mild
  9 (9.00%) high severe

glyph/cached_hinted     time:   [37.745 µs 37.757 µs 37.769 µs]
                        change: [-2.7768% -2.6917% -2.6058%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) low mild
  4 (4.00%) high mild
  1 (1.00%) high severe
glyph/uncached_hinted   time:   [52.507 µs 52.515 µs 52.523 µs]
                        change: [-1.0035% -0.9088% -0.8162%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  5 (5.00%) high mild
  1 (1.00%) high severe
glyph/cached_unhinted   time:   [37.369 µs 37.415 µs 37.458 µs]
                        change: [-3.5066% -3.3864% -3.2692%] (p = 0.00 < 0.05)
                        Performance has improved.
glyph/uncached_unhinted time:   [51.519 µs 51.527 µs 51.536 µs]
                        change: [-0.9800% -0.8883% -0.7965%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
  1 (1.00%) low severe
  1 (1.00%) low mild
  7 (7.00%) high mild
  3 (3.00%) high severe

fine/fill/opaque_short_u8_sse4_2
                        time:   [6.9125 ns 6.9197 ns 6.9269 ns]
                        change: [-7.1323% -7.0262% -6.9287%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  4 (4.00%) high mild

fine/fill/opaque_short_u8_avx2
                        time:   [5.6816 ns 5.6961 ns 5.7139 ns]
                        change: [+3.3571% +3.6992% +4.0928%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 18 outliers among 100 measurements (18.00%)
  2 (2.00%) high mild
  16 (16.00%) high severe

fine/fill/opaque_long_u8_sse4_2
                        time:   [47.271 ns 47.273 ns 47.275 ns]
                        change: [+0.2224% +0.2565% +0.2880%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) low mild
  3 (3.00%) high mild
  3 (3.00%) high severe

fine/fill/opaque_long_u8_avx2
                        time:   [25.925 ns 25.926 ns 25.927 ns]
                        change: [-0.0445% -0.0175% +0.0065%] (p = 0.18 > 0.05)
                        No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
  3 (3.00%) high mild
  7 (7.00%) high severe

fine/fill/transparent_short_u8_sse4_2
                        time:   [19.247 ns 19.259 ns 19.269 ns]
                        change: [+1.5220% +1.6900% +1.8519%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) low mild

fine/fill/transparent_short_u8_avx2
                        time:   [12.474 ns 12.480 ns 12.488 ns]
                        change: [+1.8306% +1.9179% +2.0019%] (p = 0.00 < 0.05)
                        Performance has regressed.

fine/fill/transparent_long_u8_sse4_2
                        time:   [139.19 ns 139.29 ns 139.40 ns]
                        change: [+1.6259% +1.7250% +1.8195%] (p = 0.00 < 0.05)
                        Performance has regressed.

fine/fill/transparent_long_u8_avx2
                        time:   [86.006 ns 86.047 ns 86.085 ns]
                        change: [+0.2716% +0.3282% +0.3819%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/strip/solid_single_u8_sse4_2
                        time:   [8.8285 ns 8.8351 ns 8.8416 ns]
                        change: [+0.3323% +0.3947% +0.4533%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/strip/solid_single_u8_avx2
                        time:   [7.1687 ns 7.1741 ns 7.1803 ns]
                        change: [+0.3781% +0.4361% +0.5040%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/strip/solid_short_u8_sse4_2
                        time:   [15.547 ns 15.552 ns 15.558 ns]
                        change: [-2.0124% -1.8137% -1.6073%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 15 outliers among 100 measurements (15.00%)
  7 (7.00%) low severe
  5 (5.00%) low mild
  2 (2.00%) high mild
  1 (1.00%) high severe

fine/strip/solid_short_u8_avx2
                        time:   [10.552 ns 10.560 ns 10.568 ns]
                        change: [+0.2110% +0.2988% +0.3791%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/strip/solid_medium_u8_sse4_2
                        time:   [28.864 ns 28.905 ns 28.952 ns]
                        change: [+0.1659% +0.2999% +0.4315%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
  6 (6.00%) high mild
  6 (6.00%) high severe

fine/strip/solid_medium_u8_avx2
                        time:   [20.159 ns 20.166 ns 20.173 ns]
                        change: [-0.0286% +0.0137% +0.0565%] (p = 0.53 > 0.05)
                        No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/strip/solid_long_u8_sse4_2
                        time:   [109.61 ns 109.66 ns 109.73 ns]
                        change: [+0.1200% +0.2040% +0.2894%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) low severe
  7 (7.00%) high mild

fine/strip/solid_long_u8_avx2
                        time:   [73.543 ns 73.562 ns 73.584 ns]
                        change: [-0.6422% -0.6064% -0.5697%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

fine/pack/pack_block_u8_sse4_2
                        time:   [53.030 ns 53.036 ns 53.042 ns]
                        change: [-0.9191% -0.8391% -0.7582%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) high mild
  2 (2.00%) high severe

fine/pack/pack_block_u8_avx2
                        time:   [51.374 ns 51.396 ns 51.419 ns]
                        change: [+0.0332% +0.1234% +0.2061%] (p = 0.01 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) low mild
  4 (4.00%) high mild
  1 (1.00%) high severe

fine/pack/unpack_block_u8_sse4_2
                        time:   [58.952 ns 59.012 ns 59.070 ns]
                        change: [+0.6420% +0.7483% +0.8528%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/pack/unpack_block_u8_avx2
                        time:   [53.578 ns 53.642 ns 53.698 ns]
                        change: [-0.0433% +0.0352% +0.1108%] (p = 0.38 > 0.05)
                        No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
  11 (11.00%) high mild

fine/gradient/linear/opaque_u8_sse4_2
                        time:   [557.61 ns 558.23 ns 558.87 ns]
                        change: [+0.7263% +0.8539% +0.9784%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/gradient/linear/opaque_u8_avx2
                        time:   [505.38 ns 505.90 ns 506.50 ns]
                        change: [+0.0086% +0.1247% +0.2477%] (p = 0.04 < 0.05)
                        Change within noise threshold.

fine/gradient/radial/opaque_u8_sse4_2
                        time:   [743.73 ns 744.43 ns 745.19 ns]
                        change: [+0.3918% +0.4679% +0.5444%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 9 outliers among 100 measurements (9.00%)
  8 (8.00%) high mild
  1 (1.00%) high severe

fine/gradient/radial/opaque_u8_avx2
                        time:   [601.95 ns 602.46 ns 602.95 ns]
                        change: [+0.0238% +0.1064% +0.1968%] (p = 0.02 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high severe

fine/gradient/radial/opaque_conical_u8_sse4_2
                        time:   [832.52 ns 833.21 ns 834.04 ns]
                        change: [+0.5035% +0.6115% +0.7269%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

fine/gradient/radial/opaque_conical_u8_avx2
                        time:   [686.30 ns 686.90 ns 687.47 ns]
                        change: [-0.5709% -0.4683% -0.3724%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/gradient/sweep/opaque_u8_sse4_2
                        time:   [1.3760 µs 1.3766 µs 1.3772 µs]
                        change: [+0.3403% +0.3900% +0.4404%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high severe

fine/gradient/sweep/opaque_u8_avx2
                        time:   [936.19 ns 936.37 ns 936.54 ns]
                        change: [-0.8035% -0.7796% -0.7545%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) low mild
  2 (2.00%) high mild

fine/gradient/extend/pad_u8_sse4_2
                        time:   [555.41 ns 555.69 ns 555.97 ns]
                        change: [+0.1575% +0.2609% +0.3637%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

fine/gradient/extend/pad_u8_avx2
                        time:   [503.30 ns 503.50 ns 503.73 ns]
                        change: [-0.4940% -0.4254% -0.3577%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
  1 (1.00%) low mild
  7 (7.00%) high mild
  4 (4.00%) high severe

fine/gradient/extend/repeat_u8_sse4_2
                        time:   [619.77 ns 620.29 ns 620.83 ns]
                        change: [-0.4322% -0.3339% -0.2341%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

fine/gradient/extend/repeat_u8_avx2
                        time:   [535.85 ns 535.99 ns 536.14 ns]
                        change: [-0.3477% -0.3064% -0.2643%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  1 (1.00%) high mild
  3 (3.00%) high severe

fine/gradient/extend/reflect_u8_sse4_2
                        time:   [687.61 ns 688.05 ns 688.49 ns]
                        change: [+0.0514% +0.1413% +0.2313%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/gradient/extend/reflect_u8_avx2
                        time:   [589.12 ns 589.29 ns 589.48 ns]
                        change: [+0.0205% +0.0632% +0.1067%] (p = 0.01 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) low mild
  5 (5.00%) high mild

fine/gradient/many_stops_u8_sse4_2
                        time:   [806.94 ns 807.21 ns 807.47 ns]
                        change: [-0.1546% -0.0975% -0.0431%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) low mild
  1 (1.00%) high mild

fine/gradient/many_stops_u8_avx2
                        time:   [670.90 ns 671.05 ns 671.21 ns]
                        change: [-0.2032% -0.1639% -0.1243%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) low mild
  5 (5.00%) high mild
  2 (2.00%) high severe

fine/gradient/transparent_u8_sse4_2
                        time:   [740.42 ns 740.63 ns 740.86 ns]
                        change: [+0.1559% +0.2519% +0.3574%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 9 outliers among 100 measurements (9.00%)
  7 (7.00%) high mild
  2 (2.00%) high severe

fine/gradient/transparent_u8_avx2
                        time:   [639.12 ns 639.26 ns 639.41 ns]
                        change: [-0.1199% -0.0798% -0.0382%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  1 (1.00%) high mild
  2 (2.00%) high severe

fine/rounded_blurred_rect/with_transform_u8_sse4_2
                        time:   [10.516 µs 10.518 µs 10.520 µs]
                        change: [+0.0222% +0.0555% +0.0877%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 7 outliers among 100 measurements (7.00%)
  5 (5.00%) low mild
  2 (2.00%) high mild

fine/rounded_blurred_rect/with_transform_u8_avx2
                        time:   [9.7963 µs 9.7986 µs 9.8012 µs]
                        change: [-0.1660% -0.1379% -0.1114%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high mild

fine/rounded_blurred_rect/no_transform_u8_sse4_2
                        time:   [10.645 µs 10.648 µs 10.652 µs]
                        change: [+0.0527% +0.0989% +0.1463%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

fine/rounded_blurred_rect/no_transform_u8_avx2
                        time:   [9.9414 µs 9.9447 µs 9.9481 µs]
                        change: [+0.0641% +0.1083% +0.1553%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  2 (2.00%) high mild
  1 (1.00%) high severe

fine/blend/normal_u8_sse4_2
                        time:   [47.427 ns 47.462 ns 47.499 ns]
                        change: [+0.4121% +0.4897% +0.5677%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/blend/normal_u8_avx2
                        time:   [26.026 ns 26.040 ns 26.057 ns]
                        change: [-18.332% -18.287% -18.234%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 14 outliers among 100 measurements (14.00%)
  10 (10.00%) high mild
  4 (4.00%) high severe

fine/blend/multiply_u8_sse4_2
                        time:   [2.3564 µs 2.4088 µs 2.4589 µs]
                        change: [-5.4069% -3.3899% -1.1018%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/blend/multiply_u8_avx2
                        time:   [1.2784 µs 1.2791 µs 1.2798 µs]
                        change: [-0.1201% +0.0756% +0.2390%] (p = 0.43 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  5 (5.00%) high mild
  1 (1.00%) high severe

fine/blend/screen_u8_sse4_2
                        time:   [1.8329 µs 1.8761 µs 1.9252 µs]
                        change: [-3.2994% -1.8209% -0.1020%] (p = 0.03 < 0.05)
                        Change within noise threshold.
Found 21 outliers among 100 measurements (21.00%)
  5 (5.00%) high mild
  16 (16.00%) high severe

fine/blend/screen_u8_avx2
                        time:   [1.2665 µs 1.2682 µs 1.2705 µs]
                        change: [-4.3774% -3.9390% -3.5269%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 11 outliers among 100 measurements (11.00%)
  10 (10.00%) high mild
  1 (1.00%) high severe

fine/blend/overlay_u8_sse4_2
                        time:   [2.0567 µs 2.0648 µs 2.0736 µs]
                        change: [-3.1647% -2.4825% -1.8082%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high mild

fine/blend/overlay_u8_avx2
                        time:   [1.2911 µs 1.2938 µs 1.2963 µs]
                        change: [-0.5660% -0.3972% -0.2219%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
  4 (4.00%) high mild
  1 (1.00%) high severe

fine/blend/darken_u8_sse4_2
                        time:   [1.6757 µs 1.6919 µs 1.7099 µs]
                        change: [+4.2429% +5.4786% +6.7590%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 18 outliers among 100 measurements (18.00%)
  11 (11.00%) high mild
  7 (7.00%) high severe

fine/blend/darken_u8_avx2
                        time:   [1.3373 µs 1.3398 µs 1.3427 µs]
                        change: [+0.8885% +1.0691% +1.2835%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high mild

fine/blend/lighten_u8_sse4_2
                        time:   [1.6637 µs 1.6707 µs 1.6792 µs]
                        change: [-5.9808% -4.5247% -3.1404%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high severe

fine/blend/lighten_u8_avx2
                        time:   [1.3511 µs 1.3515 µs 1.3519 µs]
                        change: [-0.1222% -0.0684% -0.0163%] (p = 0.01 < 0.05)
                        Change within noise threshold.
Found 15 outliers among 100 measurements (15.00%)
  5 (5.00%) low mild
  10 (10.00%) high mild

fine/blend/color_dodge_u8_sse4_2
                        time:   [6.1797 µs 6.2307 µs 6.2868 µs]
                        change: [+1.8494% +2.6377% +3.4231%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/blend/color_dodge_u8_avx2
                        time:   [4.2804 µs 4.2826 µs 4.2847 µs]
                        change: [-3.1557% -3.1048% -3.0553%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 7 outliers among 100 measurements (7.00%)
  4 (4.00%) low mild
  3 (3.00%) high mild

fine/blend/color_burn_u8_sse4_2
                        time:   [6.1894 µs 6.2227 µs 6.2594 µs]
                        change: [+0.5146% +1.1612% +1.8307%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high mild

fine/blend/color_burn_u8_avx2
                        time:   [4.4286 µs 4.4302 µs 4.4319 µs]
                        change: [-1.0331% -0.9792% -0.9216%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/blend/hard_light_u8_sse4_2
                        time:   [2.2752 µs 2.3004 µs 2.3327 µs]
                        change: [-2.6572% -0.9095% +0.8145%] (p = 0.31 > 0.05)
                        No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) high mild
  1 (1.00%) high severe

fine/blend/hard_light_u8_avx2
                        time:   [1.3132 µs 1.3157 µs 1.3179 µs]
                        change: [+0.1370% +0.3661% +0.6023%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/blend/soft_light_u8_sse4_2
                        time:   [5.9459 µs 5.9679 µs 5.9887 µs]
                        change: [+0.4284% +1.4208% +2.3797%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high mild

fine/blend/soft_light_u8_avx2
                        time:   [5.1935 µs 5.1976 µs 5.2018 µs]
                        change: [+0.1220% +0.1683% +0.2222%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

fine/blend/difference_u8_sse4_2
                        time:   [2.2687 µs 2.4010 µs 2.5483 µs]
                        change: [-4.6277% -1.2819% +2.4445%] (p = 0.50 > 0.05)
                        No change in performance detected.
Found 15 outliers among 100 measurements (15.00%)
  1 (1.00%) high mild
  14 (14.00%) high severe

fine/blend/difference_u8_avx2
                        time:   [1.2534 µs 1.2555 µs 1.2576 µs]
                        change: [+0.7522% +0.9206% +1.0865%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/blend/exclusion_u8_sse4_2
                        time:   [1.7478 µs 1.8423 µs 1.9440 µs]
                        change: [+4.5130% +7.0576% +10.322%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 13 outliers among 100 measurements (13.00%)
  13 (13.00%) high severe

fine/blend/exclusion_u8_avx2
                        time:   [1.3728 µs 1.3749 µs 1.3770 µs]
                        change: [-0.1715% -0.0236% +0.1273%] (p = 0.76 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  8 (8.00%) high mild
  1 (1.00%) high severe

fine/blend/hue_u8_sse4_2
                        time:   [8.8913 µs 8.9303 µs 8.9724 µs]
                        change: [+4.6586% +4.9657% +5.3021%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
  2 (2.00%) high mild
  4 (4.00%) high severe

fine/blend/hue_u8_avx2  time:   [7.5768 µs 7.5825 µs 7.5882 µs]
                        change: [+1.4558% +1.5616% +1.6679%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 8 outliers among 100 measurements (8.00%)
  4 (4.00%) low mild
  2 (2.00%) high mild
  2 (2.00%) high severe

fine/blend/saturation_u8_sse4_2
                        time:   [8.6111 µs 8.6221 µs 8.6332 µs]
                        change: [-2.2313% -1.9316% -1.6141%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

fine/blend/saturation_u8_avx2
                        time:   [7.5972 µs 7.6032 µs 7.6087 µs]
                        change: [+1.4421% +1.5354% +1.6274%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 13 outliers among 100 measurements (13.00%)
  1 (1.00%) low severe
  5 (5.00%) low mild
  5 (5.00%) high mild
  2 (2.00%) high severe

fine/blend/color_u8_sse4_2
                        time:   [7.2227 µs 7.2323 µs 7.2421 µs]
                        change: [-6.0269% -5.6816% -5.3208%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/blend/color_u8_avx2
                        time:   [6.2791 µs 6.2829 µs 6.2872 µs]
                        change: [-6.1108% -6.0246% -5.9408%] (p = 0.00 < 0.05)
                        Performance has improved.

fine/blend/luminosity_u8_sse4_2
                        time:   [7.0038 µs 7.0183 µs 7.0337 µs]
                        change: [+0.8341% +1.0873% +1.3563%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/blend/luminosity_u8_avx2
                        time:   [6.3247 µs 6.3258 µs 6.3270 µs]
                        change: [-5.6774% -5.6139% -5.5502%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

fine/blend/clear_u8_sse4_2
                        time:   [769.66 ns 800.20 ns 838.71 ns]
                        change: [-70.956% -70.001% -69.057%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 14 outliers among 100 measurements (14.00%)
  14 (14.00%) high severe

fine/blend/clear_u8_avx2
                        time:   [414.78 ns 427.33 ns 441.23 ns]
                        change: [+13.160% +18.047% +23.021%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/blend/copy_u8_sse4_2
                        time:   [701.26 ns 709.18 ns 717.76 ns]
                        change: [-2.5891% -1.7479% -0.8735%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high mild

fine/blend/copy_u8_avx2 time:   [332.29 ns 333.05 ns 334.00 ns]
                        change: [-2.0480% -1.8584% -1.6574%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  4 (4.00%) high mild
  5 (5.00%) high severe

fine/blend/dest_u8_sse4_2
                        time:   [621.74 ns 623.40 ns 625.22 ns]
                        change: [-3.5330% -3.2362% -2.9137%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  1 (1.00%) low mild
  3 (3.00%) high mild

fine/blend/dest_u8_avx2 time:   [333.83 ns 334.01 ns 334.19 ns]
                        change: [+1.9951% +2.0718% +2.1501%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 9 outliers among 100 measurements (9.00%)
  3 (3.00%) low mild
  6 (6.00%) high mild

fine/blend/dest_over_u8_sse4_2
                        time:   [1.5267 µs 1.5732 µs 1.6150 µs]
                        change: [-25.806% -23.333% -20.881%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/blend/dest_over_u8_avx2
                        time:   [405.62 ns 405.95 ns 406.31 ns]
                        change: [+0.1987% +0.2542% +0.3133%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high mild

fine/blend/src_out_u8_sse4_2
                        time:   [732.45 ns 755.53 ns 782.43 ns]
                        change: [+14.329% +16.534% +19.247%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 9 outliers among 100 measurements (9.00%)
  6 (6.00%) high mild
  3 (3.00%) high severe

fine/blend/src_out_u8_avx2
                        time:   [351.70 ns 352.03 ns 352.39 ns]
                        change: [-0.3847% -0.2523% -0.1181%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  4 (4.00%) high mild

fine/blend/src_in_u8_sse4_2
                        time:   [999.38 ns 1.0428 µs 1.0893 µs]
                        change: [+3.5879% +8.5566% +13.742%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/blend/src_in_u8_avx2
                        time:   [345.04 ns 345.78 ns 346.67 ns]
                        change: [+0.1911% +0.3431% +0.5116%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 9 outliers among 100 measurements (9.00%)
  8 (8.00%) high mild
  1 (1.00%) high severe

fine/blend/dest_in_u8_sse4_2
                        time:   [674.01 ns 676.37 ns 679.00 ns]
                        change: [+5.6029% +5.9960% +6.4338%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 7 outliers among 100 measurements (7.00%)
  7 (7.00%) high mild

fine/blend/dest_in_u8_avx2
                        time:   [349.30 ns 349.83 ns 350.43 ns]
                        change: [-0.4608% -0.2749% -0.0827%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 17 outliers among 100 measurements (17.00%)
  15 (15.00%) high mild
  2 (2.00%) high severe

fine/blend/dest_out_u8_sse4_2
                        time:   [632.70 ns 636.54 ns 640.93 ns]
                        change: [-2.5117% -1.9782% -1.4275%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  4 (4.00%) high mild

fine/blend/dest_out_u8_avx2
                        time:   [352.07 ns 352.34 ns 352.63 ns]
                        change: [-0.7760% -0.6166% -0.4429%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
  3 (3.00%) high mild
  9 (9.00%) high severe

fine/blend/src_atop_u8_sse4_2
                        time:   [2.3023 µs 2.3363 µs 2.3695 µs]
                        change: [+4.7026% +6.5639% +8.5803%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 10 outliers among 100 measurements (10.00%)
  1 (1.00%) low severe
  9 (9.00%) low mild

fine/blend/src_atop_u8_avx2
                        time:   [432.57 ns 432.93 ns 433.31 ns]
                        change: [-0.4606% -0.3826% -0.2974%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  1 (1.00%) high mild
  2 (2.00%) high severe

fine/blend/dest_atop_u8_sse4_2
                        time:   [1.7374 µs 1.7665 µs 1.7971 µs]
                        change: [-2.4494% -0.8432% +0.8725%] (p = 0.32 > 0.05)
                        No change in performance detected.

fine/blend/dest_atop_u8_avx2
                        time:   [434.69 ns 434.82 ns 434.95 ns]
                        change: [-0.1680% -0.1180% -0.0665%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
  1 (1.00%) low mild
  4 (4.00%) high mild

fine/blend/xor_u8_sse4_2
                        time:   [2.3208 µs 2.3292 µs 2.3370 µs]
                        change: [-2.2415% -1.8288% -1.4306%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild

fine/blend/xor_u8_avx2  time:   [443.22 ns 443.38 ns 443.56 ns]
                        change: [-0.0584% +0.0465% +0.1509%] (p = 0.39 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high mild

fine/blend/plus_u8_sse4_2
                        time:   [2.3860 µs 2.3911 µs 2.3958 µs]
                        change: [+270.86% +271.63% +272.37%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 9 outliers among 100 measurements (9.00%)
  2 (2.00%) low severe
  7 (7.00%) low mild

fine/blend/plus_u8_avx2 time:   [367.90 ns 368.11 ns 368.34 ns]
                        change: [-0.4824% -0.3732% -0.2575%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 13 outliers among 100 measurements (13.00%)
  1 (1.00%) low mild
  8 (8.00%) high mild
  4 (4.00%) high severe

fine/blend/plus_lighter_u8_sse4_2
                        time:   [2.3564 µs 2.3648 µs 2.3728 µs]
                        change: [+261.08% +262.86% +264.57%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) low severe
  4 (4.00%) low mild
  1 (1.00%) high mild

fine/blend/plus_lighter_u8_avx2
                        time:   [369.10 ns 369.33 ns 369.56 ns]
                        change: [-0.0191% +0.0484% +0.1121%] (p = 0.16 > 0.05)
                        No change in performance detected.

fine/image/transform/none_u8_sse4_2
                        time:   [613.44 ns 613.55 ns 613.66 ns]
                        change: [+0.0219% +0.0728% +0.1200%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

fine/image/transform/none_u8_avx2
                        time:   [615.22 ns 615.36 ns 615.57 ns]
                        change: [-0.2091% -0.1639% -0.1204%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 14 outliers among 100 measurements (14.00%)
  1 (1.00%) low severe
  1 (1.00%) low mild
  1 (1.00%) high mild
  11 (11.00%) high severe

fine/image/transform/scale_u8_sse4_2
                        time:   [612.55 ns 612.66 ns 612.79 ns]
                        change: [+0.0045% +0.0545% +0.1001%] (p = 0.03 < 0.05)
                        Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
  1 (1.00%) low mild
  3 (3.00%) high mild

fine/image/transform/scale_u8_avx2
                        time:   [615.62 ns 615.82 ns 616.04 ns]
                        change: [-0.5152% -0.4771% -0.4382%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 19 outliers among 100 measurements (19.00%)
  2 (2.00%) low mild
  5 (5.00%) high mild
  12 (12.00%) high severe

fine/image/transform/rotate_u8_sse4_2
                        time:   [776.76 ns 776.84 ns 776.95 ns]
                        change: [-5.8679% -5.8284% -5.7838%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  5 (5.00%) high mild
  1 (1.00%) high severe

fine/image/transform/rotate_u8_avx2
                        time:   [795.37 ns 795.48 ns 795.62 ns]
                        change: [-5.4546% -5.4328% -5.4112%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  3 (3.00%) high mild
  1 (1.00%) high severe

fine/image/quality/low_u8_sse4_2
                        time:   [612.59 ns 612.67 ns 612.77 ns]
                        change: [-0.1397% -0.0861% -0.0366%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) low severe
  1 (1.00%) high mild

fine/image/quality/low_u8_avx2
                        time:   [615.54 ns 615.76 ns 616.00 ns]
                        change: [-0.8438% -0.7706% -0.6984%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 13 outliers among 100 measurements (13.00%)
  1 (1.00%) low mild
  12 (12.00%) high mild

fine/image/quality/medium_u8_sse4_2
                        time:   [2.4362 µs 2.4374 µs 2.4387 µs]
                        change: [-0.0651% +0.0029% +0.0677%] (p = 0.93 > 0.05)
                        No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) high mild
  1 (1.00%) high severe

fine/image/quality/medium_u8_avx2
                        time:   [5.2194 µs 5.3467 µs 5.4814 µs]
                        change: [-1.4855% +2.1459% +6.2357%] (p = 0.27 > 0.05)
                        No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
  6 (6.00%) high mild

fine/image/quality/high_u8_sse4_2
                        time:   [13.729 µs 13.730 µs 13.731 µs]
                        change: [-0.1407% -0.1233% -0.1068%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild

fine/image/quality/high_u8_avx2
                        time:   [11.074 µs 11.082 µs 11.092 µs]
                        change: [+2.5554% +2.6397% +2.7251%] (p = 0.00 < 0.05)
                        Performance has regressed.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) high mild
  10 (10.00%) high severe

fine/image/extend/pad_u8_sse4_2
                        time:   [612.47 ns 612.56 ns 612.66 ns]
                        change: [-0.8765% -0.8087% -0.7401%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 7 outliers among 100 measurements (7.00%)
  6 (6.00%) high mild
  1 (1.00%) high severe

fine/image/extend/pad_u8_avx2
                        time:   [615.30 ns 615.53 ns 615.79 ns]
                        change: [-0.4973% -0.4500% -0.4024%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 14 outliers among 100 measurements (14.00%)
  7 (7.00%) high mild
  7 (7.00%) high severe

fine/image/extend/repeat_u8_sse4_2
                        time:   [603.49 ns 603.61 ns 603.74 ns]
                        change: [-3.3875% -3.3541% -3.3216%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  2 (2.00%) high mild
  3 (3.00%) high severe

fine/image/extend/repeat_u8_avx2
                        time:   [613.32 ns 613.77 ns 614.21 ns]
                        change: [-0.9102% -0.8460% -0.7816%] (p = 0.00 < 0.05)
                        Change within noise threshold.

fine/image/extend/reflect_u8_sse4_2
                        time:   [970.34 ns 971.06 ns 971.86 ns]
                        change: [-10.314% -10.247% -10.177%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

fine/image/extend/reflect_u8_avx2
                        time:   [1.0065 µs 1.0070 µs 1.0075 µs]
                        change: [-11.485% -11.426% -11.360%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high mild

sort/Ghostscript_Tiger  time:   [92.455 µs 92.648 µs 92.802 µs]
                        change: [+0.2407% +0.3925% +0.5602%] (p = 0.00 < 0.05)
                        Change within noise threshold.
sort/coat_of_arms       time:   [1.0200 ms 1.0218 ms 1.0235 ms]
                        change: [-0.0576% +0.0624% +0.1902%] (p = 0.34 > 0.05)
                        No change in performance detected.
sort/Saimaa_Canal_(map) time:   [3.1034 ms 3.1079 ms 3.1119 ms]
                        change: [+0.5295% +0.6388% +0.7504%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 1 outliers among 50 measurements (2.00%)
  1 (2.00%) high mild
sort/heraldry           time:   [659.22 µs 659.48 µs 659.81 µs]
                        change: [-0.6923% -0.6446% -0.5950%] (p = 0.00 < 0.05)
                        Change within noise threshold.
Found 5 outliers among 50 measurements (10.00%)
  2 (4.00%) high mild
  3 (6.00%) high severe

images/overlapping      time:   [2.8189 ms 2.8214 ms 2.8239 ms]
                        change: [-0.0488% +0.0516% +0.1439%] (p = 0.26 > 0.05)
                        No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild

Codex analysis of assembly changes

Verdict

The refactor introduces a small, localized performance regression in vello_cpu’s generated x86 code. Most load/store-heavy kernels are unchanged, but several hot loops now have less favorable optimization.

Compared revisions:

  • Before: 0a7408a2217767e2232140309bdb1d8eb97050d0
  • After: d7ce2b1d13728b1a19171b3a08a0b000f0e4f606
  • Rust 1.97.1, LLVM 22.1.6, optimized release builds
  • Checked default, f32, and all-feature configurations

What stayed unchanged

The straightforward load/store users—copy_solid, apply_mask, apply_tint, and alpha-composite loops—produce identical assembly across SSE2, SSE4.2, AVX2, and AVX-512. The SIMD code in vello_common is also unchanged.

This confirms the new generic array conversion implementations inline successfully in the normal cases.

What regressed

The most notable change is the u8 blend loop in [lowp/mod.rs (line 478)](/home/shnatsel/Code/vello/sparse_strips/vello_cpu/src/fine/lowp/mod.rs:478):

  • Previously LLVM hoisted default_mix outside the loop and emitted two specialized loop bodies.
  • Afterwards it emits one smaller loop with the default_mix branch inside every 32-byte SIMD iteration.
  • This affects SSE2, SSE4.2, AVX2, and AVX-512.
  • Code size improves, but steady-state throughput is likely slightly worse because of the extra per-chunk branch and additional stack traffic.

There are also register-allocation regressions in the high-quality filtered-image path in [image.rs (line 181)](/home/shnatsel/Code/vello/sparse_strips/vello_cpu/src/fine/common/image.rs:181):

  • AVX2 paint_f32: 780 → 793 instructions; stack frame 552 → 600 bytes.
  • AVX2 paint_u8: 816 → 829 instructions.
  • Image bounds are repeatedly compared against a stack-resident length instead of a register.
  • AVX-512 gradient painting grows from 225 → 249 instructions.

Static SIMD instruction totals actually decrease slightly because LLVM merges duplicated loops:

Level Static instruction delta
SSE2 −63
SSE4.2 −53
AVX2 −37
AVX-512 −32
Fallback unchanged

That reduction is primarily a code-size improvement, not a throughput improvement: some once-per-call decisions moved into hot loops.

So I would classify the result as mostly unchanged, but slightly worse in important u8 blend and filtered-image paths. It does not look like a broad load/store regression, but it is enough that I would not call the refactor performance-neutral without benchmark confirmation. No workspace files were changed during the analysis.

@Shnatsel
Shnatsel marked this pull request as ready for review July 29, 2026 12:29
@Shnatsel
Shnatsel requested a review from LaurenzV July 29, 2026 19:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant