Proposal Details
This proposal introduce ARM64 SVE based implementation of Green Tea GC scan kernel.
Implementation details
Current AMD64 Green Tea GC kernel consists of 2 main parts: expander and scan kernel.
Expander makes objmask same size as ptrmask.
Scan kernel intersects expanded mask with ptrmask and then loads and filters valid pointers from span.
Scan kernel on ARM64
Implementation of scan kernel for ARM64 are almost the same as for AMD64.
However there are several key differences.
- Mask register semantic: on AVX512 operation on any vector element size take consecutive bits from mask register.
On ARM64 bits must be interleaved according to vector element size.
Example: compact/compress operation used in scan kernel:


Chain of punpklo/hi instructions used to interleave bits.
It looks like:
ldr p0, [x4]
punpkhi p4.h, p0.b
punpklo p0.h, p0.b
punpkhi p2.h, p0.b
punpklo p0.h, p0.b
punpkhi p6.h, p4.b
punpklo p4.h, p4.b
punpkhi p1.h, p0.b
punpklo p0.h, p0.b
punpkhi p3.h, p2.b
punpklo p2.h, p2.b
punpkhi p5.h, p4.b
punpklo p4.h, p4.b
punpkhi p7.h, p6.b
punpklo p6.h, p6.b
In this snippet dense bitmask is loaded to p0 and then unpacked to p0-p7 register.
- Vectors scalability. SVE vector size may be different across architectures.
On my machine SVE vector size is 256 bit.
Main scan kernel logic can be seen in following snippet:
// Load next line to z0 register
ldr z0, [x0, 0, mul vl]
// Filter out nil pointers
cmpne p0.d, p0/z, z0.d, #0
compact z0.d, p0, z0.d
// Count how much pointers we got
cntp x5, p0, p0.d
// Put in output buffer
str z0, [x1]
// Advanve outbuf buffer pointer to number of valid pointers
add x1, x1, x5, lsl #3
Issue with expand kernel. Proposal of sparse inline mark bits
AMD64 expand kernel implementation relies on GF2P8AFFINEQB instruction.
There is nothing like it in ARM64 SIMD extensions.
Emulating it would be too costly.
In order to overcome this issue I propose change semantic of inline mark bits.
Inline make bits has fixed size, enough to fit all objects in Green Tea span.
In other words it has pageSize / 16 bits.
Now i'th bit corresponds to i'th object.
In proposed change i'th bit corresponds to object starting on offset 16*i bytes (if such object exists).
This require span.elemsize be multiple of 16. Now it only excludes elemsize == 24.
In this implementation expand operation is replaced by multiplication to 2^(elemsize/16)-1 which is much more simple and does not require GF2P8AFFINEQB instruction.
Implementation
Proposed changes has 2 commits:
-
First one introduces sparse inline mark bits and ready to merge.
It is tested using Intel SDE. So I was unable to measure performance impact of this change.
-
Second one has ARM64 SVE Green Tea kernel implementation.
As for now go does not have support of SVE instructions, implementation is done using WORD directives.
It may be worth waiting official SVE support.
Benchmark results
I measured this implementation on tests in src/internal/runtime/gc/scan and got following results:
goos: linux
goarch: arm64
pkg: internal/runtime/gc/scan
│ Go │ Platform │
│ sec/op │ sec/op vs base │
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=0-4 20.95n ± 3% 27.64n ± 6% +31.90% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=10-4 296.8n ± 3% 277.9n ± 0% -6.34% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=20-4 568.9n ± 3% 323.9n ± 0% -43.07% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=30-4 864.9n ± 3% 323.5n ± 0% -62.59% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=40-4 1169.0n ± 2% 323.7n ± 0% -72.31% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=50-4 1451.5n ± 3% 324.7n ± 0% -77.63% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=60-4 1687.0n ± 2% 323.2n ± 0% -80.84% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=70-4 1971.5n ± 4% 323.8n ± 0% -83.57% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=80-4 2244.0n ± 1% 323.9n ± 0% -85.57% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=90-4 2481.5n ± 2% 324.0n ± 0% -86.94% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=2/pct=100-4 2804.0n ± 3% 323.1n ± 0% -88.48% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=0-4 21.25n ± 3% 27.00n ± 17% +27.03% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=10-4 257.6n ± 6% 324.0n ± 0% +25.77% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=20-4 490.4n ± 4% 323.3n ± 0% -34.07% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=30-4 742.0n ± 6% 323.8n ± 0% -56.36% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=40-4 1005.3n ± 8% 324.9n ± 0% -67.68% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=50-4 1182.5n ± 5% 323.8n ± 1% -72.62% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=60-4 1444.5n ± 8% 323.9n ± 0% -77.58% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=70-4 1747.0n ± 4% 323.3n ± 0% -81.49% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=80-4 1893.0n ± 5% 323.7n ± 0% -82.90% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=90-4 2141.0n ± 4% 323.6n ± 0% -84.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=4/pct=100-4 2361.5n ± 8% 324.1n ± 0% -86.28% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=0-4 21.04n ± 4% 29.79n ± 9% +41.62% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=10-4 236.3n ± 6% 323.6n ± 1% +36.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=20-4 480.0n ± 5% 323.8n ± 0% -32.54% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=30-4 687.7n ± 8% 324.0n ± 0% -52.88% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=40-4 931.9n ± 10% 325.0n ± 0% -65.13% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=50-4 1137.0n ± 7% 323.4n ± 0% -71.56% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=60-4 1350.5n ± 3% 323.6n ± 1% -76.04% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=70-4 1612.0n ± 7% 324.1n ± 0% -79.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=80-4 1877.0n ± 7% 324.2n ± 0% -82.73% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=90-4 2056.5n ± 6% 323.9n ± 0% -84.25% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=5/pct=100-4 2212.5n ± 7% 324.2n ± 0% -85.34% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=0-4 21.04n ± 4% 27.41n ± 11% +30.24% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=10-4 234.8n ± 6% 286.7n ± 1% +22.10% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=20-4 465.0n ± 4% 323.9n ± 0% -30.34% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=30-4 636.6n ± 5% 323.5n ± 1% -49.18% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=40-4 890.9n ± 10% 324.0n ± 0% -63.63% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=50-4 1124.5n ± 9% 323.8n ± 0% -71.21% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=60-4 1338.0n ± 5% 323.8n ± 1% -75.80% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=70-4 1534.5n ± 3% 323.8n ± 0% -78.90% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=80-4 1725.5n ± 8% 323.9n ± 0% -81.23% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=90-4 1991.0n ± 4% 323.6n ± 0% -83.75% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=6/pct=100-4 2180.0n ± 4% 323.2n ± 0% -85.17% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=0-4 21.33n ± 2% 28.49n ± 6% +33.57% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=10-4 232.5n ± 9% 304.2n ± 0% +30.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=20-4 423.2n ± 10% 323.9n ± 1% -23.45% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=30-4 682.4n ± 9% 323.8n ± 0% -52.55% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=40-4 893.4n ± 6% 324.0n ± 0% -63.73% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=50-4 1088.0n ± 3% 324.1n ± 1% -70.21% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=60-4 1343.0n ± 6% 323.9n ± 0% -75.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=70-4 1494.0n ± 3% 323.8n ± 1% -78.33% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=80-4 1761.0n ± 6% 324.0n ± 0% -81.60% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=90-4 1939.5n ± 3% 324.4n ± 0% -83.27% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=7/pct=100-4 2132.5n ± 8% 323.8n ± 0% -84.82% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=0-4 21.50n ± 7% 29.52n ± 15% +37.30% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=10-4 244.7n ± 5% 266.2n ± 1% +8.83% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=20-4 422.1n ± 10% 323.7n ± 0% -23.30% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=30-4 661.6n ± 4% 323.9n ± 0% -51.05% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=40-4 883.4n ± 6% 323.9n ± 0% -63.34% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=50-4 1091.0n ± 6% 323.7n ± 0% -70.33% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=60-4 1298.0n ± 7% 323.8n ± 0% -75.06% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=70-4 1491.0n ± 5% 323.8n ± 1% -78.28% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=80-4 1688.0n ± 9% 323.9n ± 0% -80.81% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=90-4 1985.5n ± 13% 323.9n ± 1% -83.69% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=8/pct=100-4 2115.5n ± 2% 323.8n ± 1% -84.69% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=0-4 21.81n ± 4% 28.50n ± 15% +30.67% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=10-4 219.0n ± 9% 266.8n ± 0% +21.80% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=20-4 470.2n ± 6% 304.6n ± 0% -35.20% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=30-4 637.2n ± 7% 323.8n ± 0% -49.19% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=40-4 861.1n ± 3% 323.8n ± 1% -62.40% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=50-4 1123.5n ± 6% 323.8n ± 1% -71.18% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=60-4 1274.5n ± 9% 323.9n ± 0% -74.58% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=70-4 1537.5n ± 5% 324.4n ± 0% -78.90% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=80-4 1690.5n ± 4% 324.4n ± 0% -80.81% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=90-4 1904.5n ± 9% 324.3n ± 1% -82.97% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=9/pct=100-4 2128.5n ± 3% 323.9n ± 0% -84.78% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=0-4 20.82n ± 2% 27.99n ± 6% +34.44% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=10-4 212.3n ± 6% 304.9n ± 0% +43.56% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=20-4 445.8n ± 12% 305.0n ± 0% -31.59% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=30-4 606.9n ± 10% 304.9n ± 0% -49.77% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=40-4 852.8n ± 11% 304.4n ± 0% -64.30% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=50-4 1030.0n ± 6% 305.0n ± 0% -70.39% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=60-4 1297.5n ± 7% 323.2n ± 1% -75.09% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=70-4 1456.0n ± 3% 323.4n ± 0% -77.79% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=80-4 1641.0n ± 14% 324.1n ± 1% -80.25% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=90-4 1858.5n ± 4% 323.4n ± 0% -82.60% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=10/pct=100-4 2099.0n ± 9% 324.4n ± 0% -84.55% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=0-4 21.21n ± 7% 27.86n ± 15% +31.35% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=10-4 237.5n ± 7% 190.4n ± 0% -19.85% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=20-4 409.2n ± 6% 287.9n ± 0% -29.64% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=30-4 623.0n ± 6% 304.7n ± 0% -51.10% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=40-4 817.6n ± 6% 304.9n ± 0% -62.71% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=50-4 1036.5n ± 5% 324.4n ± 0% -68.70% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=60-4 1241.0n ± 7% 325.1n ± 0% -73.80% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=70-4 1421.0n ± 4% 323.9n ± 1% -77.20% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=80-4 1622.5n ± 14% 324.3n ± 0% -80.01% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=90-4 1802.0n ± 16% 324.6n ± 0% -81.99% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=11/pct=100-4 2074.0n ± 13% 323.4n ± 0% -84.41% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=0-4 21.20n ± 6% 27.80n ± 10% +31.14% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=10-4 220.7n ± 12% 304.7n ± 0% +38.09% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=20-4 425.4n ± 3% 304.7n ± 0% -28.37% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=30-4 601.4n ± 2% 323.9n ± 0% -46.15% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=40-4 815.1n ± 7% 323.9n ± 1% -60.26% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=50-4 1031.5n ± 5% 323.9n ± 0% -68.59% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=60-4 1246.5n ± 16% 324.1n ± 0% -74.00% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=70-4 1471.0n ± 13% 324.7n ± 0% -77.93% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=80-4 1649.5n ± 12% 323.8n ± 0% -80.37% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=90-4 1842.0n ± 4% 323.4n ± 0% -82.45% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=12/pct=100-4 2061.5n ± 15% 324.1n ± 0% -84.28% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=0-4 21.14n ± 4% 27.25n ± 11% +28.91% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=10-4 238.2n ± 4% 305.1n ± 0% +28.09% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=20-4 414.8n ± 8% 324.4n ± 0% -21.80% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=30-4 641.1n ± 7% 325.4n ± 1% -49.25% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=40-4 829.1n ± 3% 324.0n ± 0% -60.92% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=50-4 1079.5n ± 8% 323.8n ± 0% -70.00% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=60-4 1222.5n ± 12% 323.8n ± 0% -73.52% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=70-4 1512.5n ± 5% 323.4n ± 0% -78.61% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=80-4 1628.0n ± 7% 323.4n ± 0% -80.14% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=90-4 1774.0n ± 14% 323.2n ± 0% -81.78% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=13/pct=100-4 2035.5n ± 13% 323.9n ± 0% -84.08% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=0-4 20.97n ± 5% 27.97n ± 6% +33.37% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=10-4 207.6n ± 11% 323.8n ± 1% +55.95% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=20-4 399.1n ± 15% 323.9n ± 0% -18.84% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=30-4 631.8n ± 8% 323.6n ± 0% -48.79% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=40-4 844.3n ± 9% 324.0n ± 1% -61.63% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=50-4 1040.0n ± 5% 324.5n ± 0% -68.80% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=60-4 1223.0n ± 8% 323.8n ± 1% -73.53% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=70-4 1422.0n ± 8% 324.1n ± 0% -77.21% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=80-4 1707.0n ± 10% 323.4n ± 0% -81.06% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=90-4 1797.0n ± 3% 323.9n ± 0% -81.98% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=14/pct=100-4 1945.0n ± 9% 323.8n ± 0% -83.35% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=0-4 21.49n ± 6% 27.88n ± 7% +29.71% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=10-4 232.5n ± 4% 324.1n ± 0% +39.39% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=20-4 451.7n ± 4% 324.0n ± 0% -28.26% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=30-4 637.0n ± 11% 323.4n ± 1% -49.23% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=40-4 822.9n ± 6% 324.4n ± 0% -60.57% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=50-4 1084.5n ± 9% 323.8n ± 0% -70.15% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=60-4 1177.5n ± 10% 324.2n ± 0% -72.47% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=70-4 1410.5n ± 4% 323.8n ± 0% -77.04% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=80-4 1636.5n ± 10% 324.1n ± 1% -80.20% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=90-4 1828.0n ± 6% 324.1n ± 0% -82.27% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=15/pct=100-4 2008.0n ± 10% 323.6n ± 0% -83.88% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=0-4 21.45n ± 9% 27.45n ± 4% +27.98% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=10-4 248.8n ± 6% 323.8n ± 1% +30.14% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=20-4 397.3n ± 7% 323.9n ± 1% -18.46% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=30-4 644.7n ± 6% 323.3n ± 0% -49.85% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=40-4 830.7n ± 8% 324.0n ± 1% -60.99% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=50-4 1043.0n ± 7% 323.9n ± 0% -68.95% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=60-4 1274.0n ± 10% 323.7n ± 1% -74.59% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=70-4 1410.5n ± 9% 324.4n ± 0% -77.00% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=80-4 1586.5n ± 3% 323.4n ± 0% -79.61% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=90-4 1757.5n ± 5% 324.0n ± 1% -81.56% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=16/pct=100-4 1953.0n ± 7% 323.4n ± 0% -83.44% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=0-4 21.30n ± 3% 28.39n ± 5% +33.31% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=10-4 200.2n ± 5% 171.3n ± 0% -14.43% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=20-4 422.7n ± 8% 323.3n ± 0% -23.51% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=30-4 618.7n ± 7% 323.7n ± 0% -47.69% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=40-4 843.8n ± 9% 323.2n ± 0% -61.69% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=50-4 1015.0n ± 7% 323.5n ± 0% -68.13% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=60-4 1205.0n ± 6% 323.1n ± 0% -73.19% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=70-4 1440.0n ± 5% 323.6n ± 1% -77.53% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=80-4 1614.5n ± 3% 323.2n ± 1% -79.98% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=90-4 1844.5n ± 6% 324.6n ± 0% -82.40% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=17/pct=100-4 1961.5n ± 5% 323.6n ± 0% -83.50% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=0-4 21.27n ± 4% 28.50n ± 9% +33.99% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=10-4 208.7n ± 2% 305.5n ± 0% +46.42% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=20-4 388.5n ± 8% 324.2n ± 0% -16.53% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=30-4 650.4n ± 8% 324.6n ± 0% -50.10% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=40-4 808.0n ± 8% 324.1n ± 0% -59.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=50-4 1045.5n ± 8% 323.8n ± 0% -69.03% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=60-4 1218.0n ± 7% 323.3n ± 0% -73.46% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=70-4 1435.0n ± 11% 323.5n ± 0% -77.46% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=80-4 1664.5n ± 9% 323.7n ± 1% -80.56% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=90-4 1822.5n ± 12% 323.7n ± 1% -82.24% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=18/pct=100-4 1978.5n ± 2% 323.6n ± 0% -83.65% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=0-4 21.58n ± 5% 28.55n ± 7% +32.28% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=10-4 229.5n ± 9% 324.0n ± 1% +41.21% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=20-4 451.8n ± 2% 323.6n ± 0% -28.39% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=30-4 613.0n ± 4% 324.0n ± 0% -47.14% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=40-4 799.5n ± 4% 323.9n ± 0% -59.48% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=50-4 1029.5n ± 6% 324.0n ± 1% -68.53% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=60-4 1182.5n ± 5% 324.2n ± 0% -72.58% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=70-4 1456.0n ± 5% 323.6n ± 0% -77.77% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=80-4 1596.5n ± 6% 323.8n ± 0% -79.72% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=90-4 1791.0n ± 6% 323.6n ± 0% -81.93% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=19/pct=100-4 1915.5n ± 15% 323.6n ± 0% -83.11% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=0-4 21.50n ± 4% 27.33n ± 12% +27.12% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=10-4 252.4n ± 10% 172.2n ± 0% -31.81% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=20-4 410.7n ± 3% 322.6n ± 0% -21.44% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=30-4 672.3n ± 8% 324.2n ± 0% -51.78% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=40-4 804.0n ± 8% 323.8n ± 0% -59.73% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=50-4 1035.5n ± 6% 323.8n ± 0% -68.73% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=60-4 1235.5n ± 6% 323.4n ± 0% -73.82% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=70-4 1480.0n ± 11% 323.4n ± 0% -78.15% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=80-4 1580.5n ± 3% 324.1n ± 0% -79.50% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=90-4 1823.0n ± 9% 324.6n ± 0% -82.20% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=20/pct=100-4 1955.0n ± 6% 323.2n ± 1% -83.47% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=0-4 21.57n ± 5% 28.27n ± 6% +31.06% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=10-4 193.0n ± 7% 317.6n ± 0% +64.58% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=20-4 446.0n ± 7% 323.4n ± 0% -27.49% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=30-4 618.7n ± 4% 323.9n ± 0% -47.65% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=40-4 795.0n ± 10% 323.9n ± 0% -59.27% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=50-4 1047.0n ± 6% 323.3n ± 0% -69.12% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=60-4 1222.5n ± 4% 323.6n ± 1% -73.53% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=70-4 1368.5n ± 6% 324.2n ± 1% -76.31% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=80-4 1621.0n ± 13% 324.1n ± 1% -80.01% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=90-4 1813.0n ± 6% 323.7n ± 0% -82.15% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=21/pct=100-4 1986.5n ± 7% 324.2n ± 1% -83.68% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=0-4 21.42n ± 6% 27.22n ± 11% +27.13% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=10-4 209.6n ± 4% 313.1n ± 0% +49.32% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=20-4 413.0n ± 6% 313.8n ± 0% -24.03% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=30-4 585.9n ± 8% 313.8n ± 0% -46.45% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=40-4 798.0n ± 7% 314.0n ± 0% -60.65% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=50-4 1033.0n ± 10% 313.8n ± 0% -69.62% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=60-4 1224.5n ± 6% 313.7n ± 0% -74.38% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=70-4 1423.0n ± 7% 323.7n ± 1% -77.25% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=80-4 1584.5n ± 8% 323.7n ± 0% -79.57% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=90-4 1776.0n ± 10% 324.1n ± 0% -81.75% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=22/pct=100-4 1980.0n ± 3% 323.8n ± 0% -83.64% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=0-4 21.27n ± 3% 29.02n ± 15% +36.44% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=10-4 235.6n ± 5% 313.1n ± 0% +32.92% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=20-4 430.0n ± 12% 313.3n ± 0% -27.14% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=30-4 625.8n ± 5% 313.6n ± 0% -49.89% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=40-4 837.5n ± 8% 313.9n ± 0% -62.51% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=50-4 1019.5n ± 6% 313.4n ± 0% -69.25% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=60-4 1133.0n ± 7% 314.2n ± 0% -72.26% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=70-4 1318.0n ± 6% 324.0n ± 0% -75.42% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=80-4 1526.0n ± 6% 323.8n ± 0% -78.78% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=90-4 1674.0n ± 13% 323.8n ± 1% -80.66% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=23/pct=100-4 1892.5n ± 11% 323.7n ± 0% -82.90% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=0-4 21.31n ± 2% 28.23n ± 13% +32.45% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=10-4 235.5n ± 4% 205.2n ± 0% -12.87% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=20-4 460.9n ± 12% 305.1n ± 0% -33.82% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=30-4 551.9n ± 11% 305.3n ± 1% -44.69% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=40-4 778.9n ± 4% 305.0n ± 1% -60.85% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=50-4 1056.5n ± 10% 296.1n ± 0% -71.97% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=60-4 1230.0n ± 4% 324.5n ± 0% -73.62% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=70-4 1440.5n ± 7% 323.9n ± 0% -77.51% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=80-4 1558.0n ± 6% 324.5n ± 0% -79.17% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=90-4 1734.0n ± 7% 324.0n ± 0% -81.31% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=24/pct=100-4 1983.5n ± 6% 323.5n ± 0% -83.69% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=0-4 21.14n ± 5% 27.69n ± 21% +30.95% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=10-4 247.65n ± 4% 67.96n ± 2% -72.56% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=20-4 389.9n ± 7% 121.8n ± 0% -68.76% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=30-4 606.6n ± 11% 182.1n ± 0% -69.98% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=40-4 844.1n ± 10% 238.4n ± 0% -71.76% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=50-4 1084.5n ± 8% 313.6n ± 0% -71.08% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=60-4 1234.5n ± 8% 323.7n ± 0% -73.78% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=70-4 1356.5n ± 6% 323.5n ± 0% -76.16% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=80-4 1667.5n ± 11% 324.4n ± 1% -80.54% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=90-4 1763.5n ± 10% 323.5n ± 1% -81.66% (p=0.000 n=10)
ScanSpanPacked/cache=tiny/pages=1/sizeclass=25/pct=100-4 2036.0n ± 6% 323.4n ± 0% -84.12% (p=0.000 n=10)
geomean 685.1n 251.3n -63.32%
Proposal Details
This proposal introduce ARM64 SVE based implementation of Green Tea GC scan kernel.
Implementation details
Current AMD64 Green Tea GC kernel consists of 2 main parts: expander and scan kernel.
Expander makes
objmasksame size asptrmask.Scan kernel intersects expanded mask with
ptrmaskand then loads and filters valid pointers from span.Scan kernel on ARM64
Implementation of scan kernel for ARM64 are almost the same as for AMD64.
However there are several key differences.
On ARM64 bits must be interleaved according to vector element size.
Example: compact/compress operation used in scan kernel:
Chain of
punpklo/hiinstructions used to interleave bits.It looks like:
In this snippet dense bitmask is loaded to
p0and then unpacked top0-p7register.On my machine SVE vector size is 256 bit.
Main scan kernel logic can be seen in following snippet:
Issue with expand kernel. Proposal of sparse inline mark bits
AMD64 expand kernel implementation relies on
GF2P8AFFINEQBinstruction.There is nothing like it in ARM64 SIMD extensions.
Emulating it would be too costly.
In order to overcome this issue I propose change semantic of inline mark bits.
Inline make bits has fixed size, enough to fit all objects in Green Tea span.
In other words it has
pageSize / 16bits.Now i'th bit corresponds to i'th object.
In proposed change i'th bit corresponds to object starting on offset 16*i bytes (if such object exists).
This require
span.elemsizebe multiple of 16. Now it only excludeselemsize == 24.In this implementation expand operation is replaced by multiplication to
2^(elemsize/16)-1which is much more simple and does not requireGF2P8AFFINEQBinstruction.Implementation
Proposed changes has 2 commits:
First one introduces sparse inline mark bits and ready to merge.
It is tested using Intel SDE. So I was unable to measure performance impact of this change.
Second one has ARM64 SVE Green Tea kernel implementation.
As for now go does not have support of SVE instructions, implementation is done using
WORDdirectives.It may be worth waiting official SVE support.
Benchmark results
I measured this implementation on tests in
src/internal/runtime/gc/scanand got following results: