From 67b30466d582981d0ebe3ad8228023051583cd0b Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Sun, 18 Sep 2022 00:04:38 -0700 Subject: [PATCH 1/4] isa --- .../Lfu/SketchFrequency.cs | 4 ++-- .../Lfu/SketchIncrement.cs | 4 ++-- BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs | 8 ++++---- BitFaster.Caching/Intrinsics.cs | 14 +++++++------- BitFaster.Caching/Lfu/CmSketch.cs | 6 +++--- BitFaster.Caching/Lfu/ConcurrentLfu.cs | 8 ++++---- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs b/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs index cd6fef90..101f3356 100644 --- a/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs +++ b/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs @@ -12,8 +12,8 @@ namespace BitFaster.Caching.Benchmarks.Lfu public class SketchFrequency { const int iterations = 512; - private static CmSketch std = new CmSketch(10, EqualityComparer.Default); - private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); + private static CmSketch std = new CmSketch(10, EqualityComparer.Default); + private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); [GlobalSetup] public void Setup() diff --git a/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs b/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs index c1c38732..ab1946ad 100644 --- a/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs +++ b/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs @@ -12,8 +12,8 @@ namespace BitFaster.Caching.Benchmarks.Lfu public class SketchIncrement { const int iterations = 1024; - private static CmSketch std = new CmSketch(10, EqualityComparer.Default); - private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); + private static CmSketch std = new CmSketch(10, EqualityComparer.Default); + private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); [Benchmark(Baseline = true)] public void Inc() diff --git a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs index f04c5813..632a4e4b 100644 --- a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs +++ b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs @@ -8,16 +8,16 @@ namespace BitFaster.Caching.UnitTests.Lfu { // Test with AVX2 if it is supported - public class CMSketchAvx2Tests : CmSketchTestBase + public class CMSketchAvx2Tests : CmSketchTestBase { } // Test with AVX2 disabled - public class CmSketchTests : CmSketchTestBase + public class CmSketchTests : CmSketchTestBase { } - public abstract class CmSketchTestBase where AVX2 : struct, IAvx2 + public abstract class CmSketchTestBase where AVX2 : struct, Isa { private CmSketch sketch = new CmSketch(512, EqualityComparer.Default); @@ -101,7 +101,7 @@ public void WhenClearedCountIsReset() private static void SkipAvxIfNotSupported() { // when we are trying to test Avx2, skip the test if it's not supported - Skip.If(typeof(AVX2) == typeof(DetectAvx2) && !Avx2.IsSupported); + Skip.If(typeof(AVX2) == typeof(Detect) && !Avx2.IsSupported); } } } diff --git a/BitFaster.Caching/Intrinsics.cs b/BitFaster.Caching/Intrinsics.cs index 4c487ecc..5ebae772 100644 --- a/BitFaster.Caching/Intrinsics.cs +++ b/BitFaster.Caching/Intrinsics.cs @@ -7,34 +7,34 @@ namespace BitFaster.Caching /// /// Represents a marker interface to enable AVX2 specific optimization. /// - public interface IAvx2 + public interface Isa { /// /// Gets a value indicating whether Avx2 is supported /// - bool IsSupported { get; } + bool IsAvx2Supported { get; } } /// /// Detect AVX2 support and enable if available. /// - public struct DetectAvx2 : IAvx2 + public struct Detect : Isa { #if NETSTANDARD2_0 /// - public bool IsSupported => false; + public bool IsAvx2Supported => false; #else /// - public bool IsSupported => Avx2.IsSupported; + public bool IsAvx2Supported => Avx2.IsSupported; #endif } /// /// Force disable AVX2. /// - public struct DisableAvx2 : IAvx2 + public struct Disable : Isa { /// - public bool IsSupported => false; + public bool IsAvx2Supported => false; } } diff --git a/BitFaster.Caching/Lfu/CmSketch.cs b/BitFaster.Caching/Lfu/CmSketch.cs index 73e744fe..936a7171 100644 --- a/BitFaster.Caching/Lfu/CmSketch.cs +++ b/BitFaster.Caching/Lfu/CmSketch.cs @@ -15,7 +15,7 @@ namespace BitFaster.Caching.Lfu /// /// This is a direct C# translation of FrequencySketch in the Caffeine library by ben.manes@gmail.com (Ben Manes). /// https://github.com/ben-manes/caffeine - public sealed class CmSketch where AVX2 : struct, IAvx2 + public sealed class CmSketch where AVX2 : struct, Isa { // A mixture of seeds from FNV-1a, CityHash, and Murmur3 private static readonly ulong[] Seed = { 0xc3a5c85c97cb3127L, 0xb492b66fbe98f273L, 0x9ae16a3b2f90404fL, 0xcbf29ce484222325L}; @@ -63,7 +63,7 @@ public int EstimateFrequency(T value) AVX2 avx2 = default; - if (avx2.IsSupported) + if (avx2.IsAvx2Supported) { return EstimateFrequencyAvx(value); } @@ -86,7 +86,7 @@ public void Increment(T value) AVX2 avx2 = default; - if (avx2.IsSupported) + if (avx2.IsAvx2Supported) { IncrementAvx(value); } diff --git a/BitFaster.Caching/Lfu/ConcurrentLfu.cs b/BitFaster.Caching/Lfu/ConcurrentLfu.cs index d3410891..8aaef1c4 100644 --- a/BitFaster.Caching/Lfu/ConcurrentLfu.cs +++ b/BitFaster.Caching/Lfu/ConcurrentLfu.cs @@ -57,7 +57,7 @@ public sealed class ConcurrentLfu : ICache, IAsyncCache, IBoun private readonly CacheMetrics metrics = new CacheMetrics(); - private readonly CmSketch cmSketch; + private readonly CmSketch cmSketch; private readonly LfuNodeList windowLru; private readonly LfuNodeList probationLru; @@ -100,7 +100,7 @@ public ConcurrentLfu(int concurrencyLevel, int capacity, IScheduler scheduler, I int writeBufferSize = Math.Min(BitOps.CeilingPowerOfTwo(capacity), 128); this.writeBuffer = new MpscBoundedBuffer>(writeBufferSize); - this.cmSketch = new CmSketch(capacity, comparer); + this.cmSketch = new CmSketch(capacity, comparer); this.windowLru = new LfuNodeList(); this.probationLru = new LfuNodeList(); this.protectedLru = new LfuNodeList(); @@ -617,11 +617,11 @@ private LfuNode EvictFromWindow() private ref struct EvictIterator { - private readonly CmSketch sketch; + private readonly CmSketch sketch; public LfuNode node; public int freq; - public EvictIterator(CmSketch sketch, LfuNode node) + public EvictIterator(CmSketch sketch, LfuNode node) { this.sketch = sketch; this.node = node; From 303eca36ccc1526f6bea18629c45acac0aa55b18 Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Sun, 18 Sep 2022 00:08:33 -0700 Subject: [PATCH 2/4] rename --- BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs | 10 +++++----- BitFaster.Caching/Lfu/CmSketch.cs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs index 632a4e4b..4757bfd5 100644 --- a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs +++ b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs @@ -17,9 +17,9 @@ public class CmSketchTests : CmSketchTestBase { } - public abstract class CmSketchTestBase where AVX2 : struct, Isa + public abstract class CmSketchTestBase where TISA : struct, Isa { - private CmSketch sketch = new CmSketch(512, EqualityComparer.Default); + private CmSketch sketch = new CmSketch(512, EqualityComparer.Default); public CmSketchTestBase() { @@ -29,7 +29,7 @@ public CmSketchTestBase() [SkippableFact] public void WhenCapacityIsZeroDefaultsSelected() { - sketch = new CmSketch(0, EqualityComparer.Default); + sketch = new CmSketch(0, EqualityComparer.Default); sketch.ResetSampleSize.Should().Be(10); } @@ -68,7 +68,7 @@ public void WhenSampleSizeExceededCountIsReset() { bool reset = false; - sketch = new CmSketch(64, EqualityComparer.Default); + sketch = new CmSketch(64, EqualityComparer.Default); for (int i = 1; i < 20 * 64; i++) { @@ -101,7 +101,7 @@ public void WhenClearedCountIsReset() private static void SkipAvxIfNotSupported() { // when we are trying to test Avx2, skip the test if it's not supported - Skip.If(typeof(AVX2) == typeof(Detect) && !Avx2.IsSupported); + Skip.If(typeof(TISA) == typeof(Detect) && !Avx2.IsSupported); } } } diff --git a/BitFaster.Caching/Lfu/CmSketch.cs b/BitFaster.Caching/Lfu/CmSketch.cs index 936a7171..58050a5a 100644 --- a/BitFaster.Caching/Lfu/CmSketch.cs +++ b/BitFaster.Caching/Lfu/CmSketch.cs @@ -15,7 +15,7 @@ namespace BitFaster.Caching.Lfu /// /// This is a direct C# translation of FrequencySketch in the Caffeine library by ben.manes@gmail.com (Ben Manes). /// https://github.com/ben-manes/caffeine - public sealed class CmSketch where AVX2 : struct, Isa + public sealed class CmSketch where TISA : struct, Isa { // A mixture of seeds from FNV-1a, CityHash, and Murmur3 private static readonly ulong[] Seed = { 0xc3a5c85c97cb3127L, 0xb492b66fbe98f273L, 0x9ae16a3b2f90404fL, 0xcbf29ce484222325L}; @@ -61,7 +61,7 @@ public int EstimateFrequency(T value) return EstimateFrequencyStd(value); #else - AVX2 avx2 = default; + TISA avx2 = default; if (avx2.IsAvx2Supported) { @@ -84,7 +84,7 @@ public void Increment(T value) IncrementStd(value); #else - AVX2 avx2 = default; + TISA avx2 = default; if (avx2.IsAvx2Supported) { From f06f446d6ad1905fda2066eb0d2db52c4867959f Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Sun, 18 Sep 2022 00:19:00 -0700 Subject: [PATCH 3/4] rename --- BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs | 10 +++++----- BitFaster.Caching/Intrinsics.cs | 14 +++++++------- BitFaster.Caching/Lfu/CmSketch.cs | 10 +++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs index 4757bfd5..43150ece 100644 --- a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs +++ b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs @@ -17,9 +17,9 @@ public class CmSketchTests : CmSketchTestBase { } - public abstract class CmSketchTestBase where TISA : struct, Isa + public abstract class CmSketchTestBase where I : struct, IsaProbe { - private CmSketch sketch = new CmSketch(512, EqualityComparer.Default); + private CmSketch sketch = new CmSketch(512, EqualityComparer.Default); public CmSketchTestBase() { @@ -29,7 +29,7 @@ public CmSketchTestBase() [SkippableFact] public void WhenCapacityIsZeroDefaultsSelected() { - sketch = new CmSketch(0, EqualityComparer.Default); + sketch = new CmSketch(0, EqualityComparer.Default); sketch.ResetSampleSize.Should().Be(10); } @@ -68,7 +68,7 @@ public void WhenSampleSizeExceededCountIsReset() { bool reset = false; - sketch = new CmSketch(64, EqualityComparer.Default); + sketch = new CmSketch(64, EqualityComparer.Default); for (int i = 1; i < 20 * 64; i++) { @@ -101,7 +101,7 @@ public void WhenClearedCountIsReset() private static void SkipAvxIfNotSupported() { // when we are trying to test Avx2, skip the test if it's not supported - Skip.If(typeof(TISA) == typeof(Detect) && !Avx2.IsSupported); + Skip.If(typeof(I) == typeof(Detect) && !Avx2.IsSupported); } } } diff --git a/BitFaster.Caching/Intrinsics.cs b/BitFaster.Caching/Intrinsics.cs index 5ebae772..6308047f 100644 --- a/BitFaster.Caching/Intrinsics.cs +++ b/BitFaster.Caching/Intrinsics.cs @@ -5,20 +5,20 @@ namespace BitFaster.Caching { /// - /// Represents a marker interface to enable AVX2 specific optimization. + /// Represents a marker interface to enable instruction set hardware intrinsics. /// - public interface Isa + public interface IsaProbe { /// - /// Gets a value indicating whether Avx2 is supported + /// Gets a value indicating whether Avx2 is supported. /// bool IsAvx2Supported { get; } } /// - /// Detect AVX2 support and enable if available. + /// Detect support for hardware intrinsics. /// - public struct Detect : Isa + public struct Detect : IsaProbe { #if NETSTANDARD2_0 /// @@ -30,9 +30,9 @@ public struct Detect : Isa } /// - /// Force disable AVX2. + /// Force disable hardware intrinsics. /// - public struct Disable : Isa + public struct Disable : IsaProbe { /// public bool IsAvx2Supported => false; diff --git a/BitFaster.Caching/Lfu/CmSketch.cs b/BitFaster.Caching/Lfu/CmSketch.cs index 58050a5a..f0ea491d 100644 --- a/BitFaster.Caching/Lfu/CmSketch.cs +++ b/BitFaster.Caching/Lfu/CmSketch.cs @@ -15,7 +15,7 @@ namespace BitFaster.Caching.Lfu /// /// This is a direct C# translation of FrequencySketch in the Caffeine library by ben.manes@gmail.com (Ben Manes). /// https://github.com/ben-manes/caffeine - public sealed class CmSketch where TISA : struct, Isa + public sealed class CmSketch where I : struct, IsaProbe { // A mixture of seeds from FNV-1a, CityHash, and Murmur3 private static readonly ulong[] Seed = { 0xc3a5c85c97cb3127L, 0xb492b66fbe98f273L, 0x9ae16a3b2f90404fL, 0xcbf29ce484222325L}; @@ -61,9 +61,9 @@ public int EstimateFrequency(T value) return EstimateFrequencyStd(value); #else - TISA avx2 = default; + I isa = default; - if (avx2.IsAvx2Supported) + if (isa.IsAvx2Supported) { return EstimateFrequencyAvx(value); } @@ -84,9 +84,9 @@ public void Increment(T value) IncrementStd(value); #else - TISA avx2 = default; + I isa = default; - if (avx2.IsAvx2Supported) + if (isa.IsAvx2Supported) { IncrementAvx(value); } From db641a912f16aca6347d6136643623e006c49f08 Mon Sep 17 00:00:00 2001 From: Alex Peck Date: Sun, 18 Sep 2022 16:59:20 -0700 Subject: [PATCH 4/4] rename --- BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs | 4 ++-- BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs | 4 ++-- BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs | 6 +++--- BitFaster.Caching/Intrinsics.cs | 10 +++++----- BitFaster.Caching/Lfu/ConcurrentLfu.cs | 8 ++++---- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs b/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs index 101f3356..e3f84544 100644 --- a/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs +++ b/BitFaster.Caching.Benchmarks/Lfu/SketchFrequency.cs @@ -12,8 +12,8 @@ namespace BitFaster.Caching.Benchmarks.Lfu public class SketchFrequency { const int iterations = 512; - private static CmSketch std = new CmSketch(10, EqualityComparer.Default); - private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); + private static CmSketch std = new CmSketch(10, EqualityComparer.Default); + private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); [GlobalSetup] public void Setup() diff --git a/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs b/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs index ab1946ad..33aba15a 100644 --- a/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs +++ b/BitFaster.Caching.Benchmarks/Lfu/SketchIncrement.cs @@ -12,8 +12,8 @@ namespace BitFaster.Caching.Benchmarks.Lfu public class SketchIncrement { const int iterations = 1024; - private static CmSketch std = new CmSketch(10, EqualityComparer.Default); - private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); + private static CmSketch std = new CmSketch(10, EqualityComparer.Default); + private static CmSketch avx = new CmSketch(10, EqualityComparer.Default); [Benchmark(Baseline = true)] public void Inc() diff --git a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs index 43150ece..54e29b6c 100644 --- a/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs +++ b/BitFaster.Caching.UnitTests/Lfu/CmSketchTests.cs @@ -8,12 +8,12 @@ namespace BitFaster.Caching.UnitTests.Lfu { // Test with AVX2 if it is supported - public class CMSketchAvx2Tests : CmSketchTestBase + public class CMSketchAvx2Tests : CmSketchTestBase { } // Test with AVX2 disabled - public class CmSketchTests : CmSketchTestBase + public class CmSketchTests : CmSketchTestBase { } @@ -101,7 +101,7 @@ public void WhenClearedCountIsReset() private static void SkipAvxIfNotSupported() { // when we are trying to test Avx2, skip the test if it's not supported - Skip.If(typeof(I) == typeof(Detect) && !Avx2.IsSupported); + Skip.If(typeof(I) == typeof(DetectIsa) && !Avx2.IsSupported); } } } diff --git a/BitFaster.Caching/Intrinsics.cs b/BitFaster.Caching/Intrinsics.cs index 6308047f..8a1bd29a 100644 --- a/BitFaster.Caching/Intrinsics.cs +++ b/BitFaster.Caching/Intrinsics.cs @@ -10,15 +10,15 @@ namespace BitFaster.Caching public interface IsaProbe { /// - /// Gets a value indicating whether Avx2 is supported. + /// Gets a value indicating whether AVX2 is supported. /// bool IsAvx2Supported { get; } } /// - /// Detect support for hardware intrinsics. + /// Detect support for hardware instructions via intrinsics. /// - public struct Detect : IsaProbe + public readonly struct DetectIsa : IsaProbe { #if NETSTANDARD2_0 /// @@ -30,9 +30,9 @@ public struct Detect : IsaProbe } /// - /// Force disable hardware intrinsics. + /// Force disable hardware instructions via intrinsics. /// - public struct Disable : IsaProbe + public readonly struct DisableHardwareIntrinsics : IsaProbe { /// public bool IsAvx2Supported => false; diff --git a/BitFaster.Caching/Lfu/ConcurrentLfu.cs b/BitFaster.Caching/Lfu/ConcurrentLfu.cs index 8aaef1c4..949f4ea9 100644 --- a/BitFaster.Caching/Lfu/ConcurrentLfu.cs +++ b/BitFaster.Caching/Lfu/ConcurrentLfu.cs @@ -57,7 +57,7 @@ public sealed class ConcurrentLfu : ICache, IAsyncCache, IBoun private readonly CacheMetrics metrics = new CacheMetrics(); - private readonly CmSketch cmSketch; + private readonly CmSketch cmSketch; private readonly LfuNodeList windowLru; private readonly LfuNodeList probationLru; @@ -100,7 +100,7 @@ public ConcurrentLfu(int concurrencyLevel, int capacity, IScheduler scheduler, I int writeBufferSize = Math.Min(BitOps.CeilingPowerOfTwo(capacity), 128); this.writeBuffer = new MpscBoundedBuffer>(writeBufferSize); - this.cmSketch = new CmSketch(capacity, comparer); + this.cmSketch = new CmSketch(capacity, comparer); this.windowLru = new LfuNodeList(); this.probationLru = new LfuNodeList(); this.protectedLru = new LfuNodeList(); @@ -617,11 +617,11 @@ private LfuNode EvictFromWindow() private ref struct EvictIterator { - private readonly CmSketch sketch; + private readonly CmSketch sketch; public LfuNode node; public int freq; - public EvictIterator(CmSketch sketch, LfuNode node) + public EvictIterator(CmSketch sketch, LfuNode node) { this.sketch = sketch; this.node = node;