using System.Runtime.CompilerServices; using ILGPU; using ILGPU.Runtime; namespace PerfectNumbers.Core.Gpu; internal readonly struct HeuristicGpuDivisorTables { public static readonly HeuristicGpuDivisorTables Shared = default; public readonly ArrayView1D GroupADivisors; public readonly ArrayView1D GroupBDivisorsEnding1; public readonly ArrayView1D GroupBDivisorsEnding7; public readonly ArrayView1D GroupBDivisorsEnding9; public HeuristicGpuDivisorTables( ArrayView1D groupADivisors, ArrayView1D groupBDivisorsEnding1, ArrayView1D groupBDivisorsEnding7, ArrayView1D groupBDivisorsEnding9) { GroupADivisors = groupADivisors; GroupBDivisorsEnding1 = groupBDivisorsEnding1; GroupBDivisorsEnding7 = groupBDivisorsEnding7; GroupBDivisorsEnding9 = groupBDivisorsEnding9; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectGroupB(byte ending) { return ending switch { 1 => GroupBDivisorsEnding1, 7 => GroupBDivisorsEnding7, 9 => GroupBDivisorsEnding9, _ => ArrayView1D.Empty, }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectDivisors(HeuristicGpuDivisorTableKind kind, byte ending) { return kind switch { HeuristicGpuDivisorTableKind.GroupA => GroupADivisors, HeuristicGpuDivisorTableKind.GroupBEnding1 => GroupBDivisorsEnding1, HeuristicGpuDivisorTableKind.GroupBEnding7 => GroupBDivisorsEnding7, HeuristicGpuDivisorTableKind.GroupBEnding9 => GroupBDivisorsEnding9, _ => ArrayView1D.Empty, }; } internal static void InitializeShared(in HeuristicGpuDivisorTables tables) { Unsafe.AsRef(in Shared) = tables; } } internal readonly struct HeuristicGpuCombinedDivisorTables { public static readonly HeuristicGpuCombinedDivisorTables Shared = default; public readonly ArrayView1D CombinedDivisorsEnding1; public readonly ArrayView1D CombinedDivisorsEnding3; public readonly ArrayView1D CombinedDivisorsEnding7; public readonly ArrayView1D CombinedDivisorsEnding9; public HeuristicGpuCombinedDivisorTables( ArrayView1D combinedDivisorsEnding1, ArrayView1D combinedDivisorsEnding3, ArrayView1D combinedDivisorsEnding7, ArrayView1D combinedDivisorsEnding9) { CombinedDivisorsEnding1 = combinedDivisorsEnding1; CombinedDivisorsEnding3 = combinedDivisorsEnding3; CombinedDivisorsEnding7 = combinedDivisorsEnding7; CombinedDivisorsEnding9 = combinedDivisorsEnding9; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectCombined(byte ending) { return ending switch { 1 => CombinedDivisorsEnding1, 3 => CombinedDivisorsEnding3, 7 => CombinedDivisorsEnding7, 9 => CombinedDivisorsEnding9, _ => ArrayView1D.Empty, }; } internal static void InitializeShared(in HeuristicGpuCombinedDivisorTables tables) { Unsafe.AsRef(in Shared) = tables; } }