From 34681b9738acdc2f77c94a25d727592511db0b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Thu, 25 Sep 2025 05:49:32 +0200 Subject: [PATCH] Small optimizations and more TODOs added. --- EvenPerfectBitScanner/Program.cs | 3 +- ...MersenneNumberDivisorByDivisorGpuTester.cs | 33 +++++++------------ 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/EvenPerfectBitScanner/Program.cs b/EvenPerfectBitScanner/Program.cs index a960476..bc43a58 100644 --- a/EvenPerfectBitScanner/Program.cs +++ b/EvenPerfectBitScanner/Program.cs @@ -918,8 +918,7 @@ internal static class Program cycleValues = cycleLease.Values ?? throw new InvalidOperationException("Divisor cycle cache returned no values for acquired lease."); } - ulong offset = divisor - cycleLeaseStart; - divisorCycle = offset < (ulong)cycleValues.Length ? cycleValues[(int)offset] : cycleLease.GetCycle(divisor); + divisorCycle = cycleValues[(int)(divisor - cycleLeaseStart)]; } else { diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs index a5931ae..2fbec3e 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs @@ -1,11 +1,9 @@ -using System; using System.Buffers; using System.Collections.Concurrent; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using ILGPU; using ILGPU.Runtime; -using PerfectNumbers.Core; namespace PerfectNumbers.Core.Gpu; @@ -401,14 +399,10 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv throw new ObjectDisposedException(nameof(DivisorScanSession)); } - int primesLength = primes.Length; - if (primesLength == 0) - { - return; - } - MersenneNumberDivisorByDivisorGpuTester owner = _owner; - int gpuBatchSize = owner._gpuBatchSize; + int gpuBatchSize = owner._gpuBatchSize, + primesLength = primes.Length; + EnsureCapacity(gpuBatchSize); MontgomeryDivisorData divisorData = CreateMontgomeryDivisorData(divisor); @@ -418,8 +412,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv return; } - ulong cycle = divisorCycle; - bool cycleEnabled = owner._useDivisorCycles && cycle != 0UL; Accelerator accelerator = _accelerator; Action, ArrayView> kernel = _kernel; @@ -428,11 +420,12 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv ArrayView1D resultsView = _resultsBuffer.View; ArrayView1D cycleMaskViewFull = _cycleMaskBuffer.View; - int offset = 0; Span hostSpan = _hostBuffer.AsSpan(); Span primeSpan = _primeBuffer.AsSpan(); Span positionSpan = _positionBuffer.AsSpan(); + int offset = 0; + bool cycleEnabled = owner._useDivisorCycles; while (offset < primesLength) { int batchSize = Math.Min(gpuBatchSize, primesLength - offset); @@ -447,7 +440,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv ArrayView1D primeInputView = _resultsBuffer.View.SubView(0, batchSize); primeInputView.CopyFromCPU(ref MemoryMarshal.GetReference(primesSlice), batchSize); ArrayView1D cycleMaskView = cycleMaskViewFull.SubView(0, batchSize); - cycleKernel(batchSize, cycle, primeInputView, cycleMaskView); + // TODO: Move this back to CPU side and make sure that we only pass primes here which passed the cycle test, when cycles are in use. + cycleKernel(batchSize, divisorCycle, primeInputView, cycleMaskView); accelerator.Synchronize(); cycleMaskView.CopyToCPU(ref MemoryMarshal.GetReference(cycleMaskSpan), batchSize); @@ -480,7 +474,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv for (int i = 0; i < computeCount; i++) { ulong prime = primeSpan[i]; - exponentSlice[i] = cycleEnabled ? prime % cycle : prime; + // TODO: Let's calculate prime % divisorCycle on CPU side, too. When we check the cycle, we calculate the residue. Let's put them into an array and re-use here. + exponentSlice[i] = cycleEnabled ? prime % divisorCycle : prime; } ArrayView1D exponentView = exponentsView.SubView(0, computeCount); @@ -541,8 +536,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv return; } - ulong exponent = exponents[index]; - results[index] = exponent.Pow2MontgomeryMod(divisor); + results[index] = exponents[index].Pow2MontgomeryMod(divisor); } private static MontgomeryDivisorData CreateMontgomeryDivisorData(ulong modulus) @@ -604,7 +598,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv private void ReturnBatchResources(Accelerator accelerator, BatchResources resources) { - _resourcePools.GetOrAdd(accelerator, static _ => new ConcurrentBag()).Add(resources); + _resourcePools.GetOrAdd(accelerator, static _ => []).Add(resources); } private sealed class BatchResources : IDisposable @@ -711,9 +705,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv } } - IMersenneNumberDivisorByDivisorTester.IDivisorScanSession IMersenneNumberDivisorByDivisorTester.CreateDivisorSession() - { - return CreateDivisorSession(); - } + IMersenneNumberDivisorByDivisorTester.IDivisorScanSession IMersenneNumberDivisorByDivisorTester.CreateDivisorSession() => CreateDivisorSession(); }