Files
even-perfect-numbers-scanner/PerfectNumbers.Core/EnvironmentConfiguration.cs
T

67 lines
2.8 KiB
C#

using System.Numerics;
using System.Runtime.CompilerServices;
using PerfectNumbers.Core.Gpu;
namespace PerfectNumbers.Core;
#pragma warning disable CA2211 // Non-constant fields should not be visible
public static class EnvironmentConfiguration
{
public static ulong DivisorLimit = ulong.MaxValue;
public static int GpuBatchSize = GpuConstants.ScanBatchSize;
public static int GpuPrimeThreads = 1;
public static int GpuRatio = PerfectNumberConstants.GpuRatio;
public static ComputationDevice MersenneDevice = ComputationDevice.Cpu;
public static BigInteger MinK = BigInteger.One;
public static ComputationDevice OrderDevice = ComputationDevice.Cpu;
public static int RollingAccelerators = PerfectNumberConstants.RollingAccelerators;
public static string? StateFilePath;
public static int ThreadCount;
public static bool UseGpu;
public static bool UseGpuOrder;
public static bool UseHybridOrder;
public static bool UseCpuOrder;
public static bool UsePow2GroupDivisors;
public static int ByDivisorSpecialRange;
public static ByDivisor.ByDivisorClassModel? ByDivisorClassModel;
public static ByDivisor.ByDivisorScanTuning ByDivisorScanTuning = ByDivisor.ByDivisorScanTuning.Default;
public static double ByDivisorCheapKLimit = 10_000d;
public static ByDivisorKIncrementMode ByDivisorKIncrementMode = ByDivisorKIncrementMode.Sequential;
public static Persistence.ByDivisorClassModelRepository? ByDivisorClassModelRepository;
public static Persistence.KStateRepository? ByDivisorKStateRepository;
public static Persistence.KStateRepository? ByDivisorCheapKStateRepository;
public static Persistence.KStateRepository? ByDivisorSpecialStateRepository;
public static Persistence.KStateRepository? ByDivisorGroupsStateRepository;
public static Persistence.Pow2Minus1StateRepository? ByDivisorPow2Minus1Repository;
public static Persistence.BitContradictionStateRepository? BitContradictionStateRepository;
public static CalculationMethod CalculationMethod = CalculationMethod.Residue;
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public static void Initialize()
{
if (MersenneDevice == ComputationDevice.Gpu &&
ByDivisorKIncrementMode == ByDivisorKIncrementMode.BitContradiction)
{
OrderDevice = ComputationDevice.Gpu;
}
UseGpuOrder = OrderDevice == ComputationDevice.Gpu;
UseHybridOrder = OrderDevice == ComputationDevice.Hybrid;
UseCpuOrder = OrderDevice == ComputationDevice.Cpu;
UseGpu =
UseGpuOrder || UseHybridOrder ||
MersenneDevice is ComputationDevice.Hybrid or ComputationDevice.Gpu;
RollingAccelerators = UseGpu
? Math.Min(Math.Min(
PerfectNumberConstants.RollingAccelerators, GpuPrimeThreads), ThreadCount)
: 0;
UsePow2GroupDivisors = ByDivisorKIncrementMode == ByDivisorKIncrementMode.Pow2Groups;
}
}
#pragma warning restore CA2211 // Non-constant fields should not be visible