using System.Runtime.CompilerServices; using ILGPU; using ILGPU.Runtime; namespace PerfectNumbers.Core.Gpu.Accelerators; public readonly struct HeuristicGroupABGpuViews( ArrayView1D groupADivisors, ArrayView1D groupADivisorSquares, ArrayView1D groupBDivisorsEnding1, ArrayView1D groupBDivisorSquaresEnding1, ArrayView1D groupBDivisorsEnding7, ArrayView1D groupBDivisorSquaresEnding7, ArrayView1D groupBDivisorsEnding9, ArrayView1D groupBDivisorSquaresEnding9) { public readonly ArrayView1D GroupADivisors = groupADivisors; public readonly ArrayView1D GroupADivisorSquares = groupADivisorSquares; public readonly ArrayView1D GroupBDivisorsEnding1 = groupBDivisorsEnding1; public readonly ArrayView1D GroupBDivisorSquaresEnding1 = groupBDivisorSquaresEnding1; public readonly ArrayView1D GroupBDivisorsEnding7 = groupBDivisorsEnding7; public readonly ArrayView1D GroupBDivisorSquaresEnding7 = groupBDivisorSquaresEnding7; public readonly ArrayView1D GroupBDivisorsEnding9 = groupBDivisorsEnding9; public readonly ArrayView1D GroupBDivisorSquaresEnding9 = groupBDivisorSquaresEnding9; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectGroupB(byte ending) => ending switch { 1 => GroupBDivisorsEnding1, 7 => GroupBDivisorsEnding7, 9 => GroupBDivisorsEnding9, _ => ArrayView1D.Empty, }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectGroupBSquares(byte ending) => ending switch { 1 => GroupBDivisorSquaresEnding1, 7 => GroupBDivisorSquaresEnding7, 9 => GroupBDivisorSquaresEnding9, _ => ArrayView1D.Empty, }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectDivisors(HeuristicGpuDivisorTableKind kind) => kind switch { HeuristicGpuDivisorTableKind.GroupA => GroupADivisors, HeuristicGpuDivisorTableKind.GroupBEnding1 => GroupBDivisorsEnding1, HeuristicGpuDivisorTableKind.GroupBEnding7 => GroupBDivisorsEnding7, HeuristicGpuDivisorTableKind.GroupBEnding9 => GroupBDivisorsEnding9, _ => ArrayView1D.Empty, }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArrayView1D SelectDivisorSquares(HeuristicGpuDivisorTableKind kind) => kind switch { HeuristicGpuDivisorTableKind.GroupA => GroupADivisorSquares, HeuristicGpuDivisorTableKind.GroupBEnding1 => GroupBDivisorSquaresEnding1, HeuristicGpuDivisorTableKind.GroupBEnding7 => GroupBDivisorSquaresEnding7, HeuristicGpuDivisorTableKind.GroupBEnding9 => GroupBDivisorSquaresEnding9, _ => ArrayView1D.Empty, }; }