From 54fdff0a4e05802b4d7e2efc76043d62a8ed885c Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Wed, 19 Nov 2025 21:38:07 +0100 Subject: [PATCH] GPU calculations frequency adjusted --- PerfectNumbers.Core/PerfectNumberConstants.cs | 3 ++- .../PrimeOrderCalculator.Cpu.cs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/PerfectNumbers.Core/PerfectNumberConstants.cs b/PerfectNumbers.Core/PerfectNumberConstants.cs index 98dd3ee..945e7c5 100644 --- a/PerfectNumbers.Core/PerfectNumberConstants.cs +++ b/PerfectNumbers.Core/PerfectNumberConstants.cs @@ -8,11 +8,12 @@ public static class PerfectNumberConstants public const int DefaultSmallPrimeFactorSlotCount = 64; public const int DefaultSpecialMaxFactorCapacity = 1024; public const ulong ExtraDivisorCycleSearchLimit = 64UL; + public const int GpuFrequency = 768 - 1; public const int MaxQForDivisorCycles = 4_000_000; public static readonly uint PrimesLimit = 1_000_000; //(ulong)Array.MaxLength;// 1_000_000; public const int MaxOddPowersCount = 128; public const int PooledArrayThreshold = 64; - public static readonly int RollingAccelerators = 298; //SharedGpuContext.Device.MaxNumThreadsPerGroup; + public static readonly int RollingAccelerators = 298; //SharedGpuContext.Device.MaxNumThreadsPerGroup; public const int ThreadsByAccelerator = 1; // TODO: Load these limits from the benchmark-driven configuration so CPU and GPU scans stay aligned with the optimal // divisor-cycle datasets we generate offline. diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs index 7d4da13..777238a 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs @@ -1177,7 +1177,7 @@ internal static partial class PrimeOrderCalculator // bool isPrime = HeuristicCombinedPrimeTester.IsPrimeGpu(gpu, composite); bool runOnGpu = RunOnGpu(); - bool isPrime = runOnGpu ? PrimeTester.IsPrime(composite) : HeuristicCombinedPrimeTester.IsPrimeGpu(gpu, composite); + bool isPrime = !runOnGpu ? PrimeTester.IsPrime(composite) : HeuristicCombinedPrimeTester.IsPrimeGpu(gpu, composite); // bool isPrime = PrimeTester.IsPrime(composite); // bool isPrime = Open.Numeric.Primes.Prime.Numbers.IsPrime(composite); @@ -1375,19 +1375,19 @@ internal static partial class PrimeOrderCalculator private static bool RunOnGpu() { - const int GpuFrequency = 1024 - 1; - - int cpuCount = Atomic.Add(target: ref _cpuCount, 1); - if (cpuCount == GpuFrequency) + // return true; + int cpuCount = Atomic.Add(ref _cpuCount, 1); + // return (cpuCount % GpuFrequency) == 0; + if (cpuCount == PerfectNumberConstants.GpuFrequency) { - Atomic.Add(ref _cpuCount, -GpuFrequency); + Atomic.Add(ref _cpuCount, -PerfectNumberConstants.GpuFrequency); } - else if (cpuCount > GpuFrequency) + else if (cpuCount > PerfectNumberConstants.GpuFrequency) { - cpuCount -= GpuFrequency; + cpuCount -= PerfectNumberConstants.GpuFrequency; } - return cpuCount != GpuFrequency; + return cpuCount == PerfectNumberConstants.GpuFrequency; } private static void PopulateSmallPrimeFactorsCpu(