diff --git a/EvenPerfectBitScanner/Program.cs b/EvenPerfectBitScanner/Program.cs index 7d7c741..ddd2498 100644 --- a/EvenPerfectBitScanner/Program.cs +++ b/EvenPerfectBitScanner/Program.cs @@ -118,10 +118,18 @@ private static ThreadLocal? MersenneTesters; EnvironmentConfiguration.MinK = _cliArguments.MinK; EnvironmentConfiguration.GpuBatchSize = Math.Max(1, _cliArguments.ScanBatchSize); EnvironmentConfiguration.GpuRatio = _cliArguments.GpuRatio; + EnvironmentConfiguration.MersenneDevice = _cliArguments.MersenneDevice; EnvironmentConfiguration.OrderDevice = _cliArguments.OrderDevice; EnvironmentConfiguration.UsePow2GroupDivisors = _cliArguments.ByDivisorKIncrementMode == ByDivisorKIncrementMode.Pow2Groups; EnvironmentConfiguration.ByDivisorSpecialRange = _cliArguments.ByDivisorSpecialRange; - EnvironmentConfiguration.RollingAccelerators = Math.Min(Math.Min(PerfectNumberConstants.RollingAccelerators, gpuPrimeThreads), threadCount); + + bool useGpu = _cliArguments.OrderDevice == ComputationDevice.Hybrid || _cliArguments.OrderDevice == ComputationDevice.Gpu || + _cliArguments.MersenneDevice == ComputationDevice.Hybrid || _cliArguments.MersenneDevice == ComputationDevice.Gpu; + + EnvironmentConfiguration.RollingAccelerators = useGpu + ? Math.Min(Math.Min(PerfectNumberConstants.RollingAccelerators, gpuPrimeThreads), threadCount) + : 0; + EnvironmentConfiguration.Initialize(); // NttGpuMath.GpuTransformBackend = _cliArguments.NttBackend; @@ -137,8 +145,12 @@ private static ThreadLocal? MersenneTesters; UnboundedTaskScheduler.ConfigureThreadCount(threadCount); PrimeTester.GpuBatchSize = gpuPrimeBatch; GpuPrimeWorkLimiter.SetLimit(gpuPrimeThreads); - Console.WriteLine("Warming up GPU kernels"); - PrimeTester.WarmUpGpuKernels(EnvironmentConfiguration.RollingAccelerators); + if (useGpu) + { + Console.WriteLine("Warming up GPU kernels"); + PrimeTester.WarmUpGpuKernels(EnvironmentConfiguration.RollingAccelerators); + } + // PrimeTester.WarmUpGpuKernels(gpuPrimeThreads >> 4); Console.WriteLine("Starting up threads..."); _ = UnboundedTaskScheduler.Instance; diff --git a/PerfectNumbers.Core/DivisorCycleCache.cs b/PerfectNumbers.Core/DivisorCycleCache.cs index 4725bf1..417fede 100644 --- a/PerfectNumbers.Core/DivisorCycleCache.cs +++ b/PerfectNumbers.Core/DivisorCycleCache.cs @@ -33,12 +33,20 @@ public sealed class DivisorCycleCache private DivisorCycleCache(int divisorCyclesBatchSize) { + bool useGpu = EnvironmentConfiguration.MersenneDevice == ComputationDevice.Hybrid || + EnvironmentConfiguration.MersenneDevice == ComputationDevice.Gpu || + !EnvironmentConfiguration.UseCpuOrder; + _divisorCyclesBatchSize = Math.Max(1, divisorCyclesBatchSize); - var acceleratorIndex = AcceleratorPool.Shared.Rent(); - _acceleratorIndex = acceleratorIndex; - Accelerator accelerator = AcceleratorPool.Shared.Accelerators[acceleratorIndex]; - _accelerator = accelerator; - _gpuKernel = LoadKernel(accelerator); + if (useGpu) + { + var acceleratorIndex = AcceleratorPool.Shared.Rent(); + _acceleratorIndex = acceleratorIndex; + Accelerator accelerator = AcceleratorPool.Shared.Accelerators[acceleratorIndex]; + _accelerator = accelerator; + _gpuKernel = LoadKernel(accelerator); + } + _snapshot = MersenneDivisorCyclesCpu.Shared.ExportSmallCyclesSnapshot(); } diff --git a/PerfectNumbers.Core/EnvironmentConfiguration.cs b/PerfectNumbers.Core/EnvironmentConfiguration.cs index 1a0f1c2..00a98e5 100644 --- a/PerfectNumbers.Core/EnvironmentConfiguration.cs +++ b/PerfectNumbers.Core/EnvironmentConfiguration.cs @@ -11,6 +11,7 @@ public static class EnvironmentConfiguration public static ulong DivisorLimit = ulong.MaxValue; public static int GpuBatchSize = GpuConstants.ScanBatchSize; 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;