From 834dc72f699f1e93f23850d7fd63289cdf1d83f5 Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Mon, 1 Jul 2024 09:46:36 -0700 Subject: [PATCH] SIMD optimizations --- .github/workflows/build.yml | 4 +--- Solver/Intrinsics.cs | 21 ++++++--------------- Solver/RootScores.cs | 2 -- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4c50a55..f69bb04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -90,9 +90,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: | - 8.0 - 9.0 + dotnet-version: '8.0' - name: Download Dalamud run: | diff --git a/Solver/Intrinsics.cs b/Solver/Intrinsics.cs index f4ae781..46e6bbd 100644 --- a/Solver/Intrinsics.cs +++ b/Solver/Intrinsics.cs @@ -5,9 +5,11 @@ using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.X86; namespace Craftimizer.Solver; + +[SkipLocalsInit] +[Pure] internal static class Intrinsics { - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] // https://stackoverflow.com/a/73439472 private static Vector128 HMax(Vector256 v1) @@ -21,7 +23,6 @@ internal static class Intrinsics return v7; } - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int HMaxIndexScalar(Vector256 v, int len) { @@ -34,7 +35,6 @@ internal static class Intrinsics return m; } - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector256 ClearLastN(Vector256 data, int len) { @@ -43,7 +43,6 @@ internal static class Intrinsics return Avx.And(Avx2.CompareGreaterThan(threshold, index).AsSingle(), data); } - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] // https://stackoverflow.com/a/23592221 private static int HMaxIndexAVX2(Vector256 v, int len) @@ -57,21 +56,17 @@ internal static class Intrinsics // Find the highest index with that value, respecting len var vcmp = Avx.CompareEqual(vfilt, vmax); - var mask = unchecked((uint)Avx2.MoveMask(vcmp.AsByte())); + var mask = unchecked((uint)Avx.MoveMask(vcmp)); - var inverseIdx = BitOperations.LeadingZeroCount(mask << ((8 - len) << 2)) >> 2; - - return len - 1 - inverseIdx; + return BitOperations.TrailingZeroCount(mask); } - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int HMaxIndex(Vector256 v, int len) => Avx2.IsSupported ? HMaxIndexAVX2(v, len) : HMaxIndexScalar(v, len); - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int NthBitSetScalar(ulong value, int n) { @@ -101,12 +96,10 @@ internal static class Intrinsics return _base; } - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int NthBitSetBMI2(ulong value, int n) => BitOperations.TrailingZeroCount(Bmi2.X64.ParallelBitDeposit(1ul << n, value)); - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int NthBitSet(ulong value, int n) { @@ -118,12 +111,10 @@ internal static class Intrinsics NthBitSetScalar(value, n); } - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] - [SkipLocalsInit] public static Vector256 ReciprocalSqrt(Vector256 data) { - if (Avx.IsSupported && Vector256.Count >= Vector256.Count) + if (Avx.IsSupported) return Avx.ReciprocalSqrt(data); Unsafe.SkipInit(out Vector256 ret); diff --git a/Solver/RootScores.cs b/Solver/RootScores.cs index 43b8420..47fd772 100644 --- a/Solver/RootScores.cs +++ b/Solver/RootScores.cs @@ -5,13 +5,11 @@ namespace Craftimizer.Solver; [StructLayout(LayoutKind.Auto)] public sealed class RootScores { - public float ScoreSum; public float MaxScore; public int Visits; public void Visit(float score) { - ScoreSum += score; MaxScore = Math.Max(MaxScore, score); Visits++; }