From b40c61b52742dff9323b45faeed6d1a1136e0aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Thu, 25 Sep 2025 12:43:38 +0200 Subject: [PATCH] Tiny optimizations --- ...MersenneNumberDivisorByDivisorGpuTester.cs | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs index 0ad07a4..534dddf 100644 --- a/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs +++ b/PerfectNumbers.Core/Gpu/MersenneNumberDivisorByDivisorGpuTester.cs @@ -136,7 +136,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv Action, ArrayView> kernel, MemoryBuffer1D divisorsBuffer, MemoryBuffer1D hitsBuffer, - ulong[] divisors, + in ulong[] divisors, byte[] hits, MontgomeryDivisorData[] divisorData, out ulong lastProcessed, @@ -167,6 +167,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv ArrayView1D hitsView; DivisorCycleCache divisorCyclesCache = DivisorCycleCache.Shared; DivisorCycleCache.CycleBlock? cycleLease = useCycles ? divisorCyclesCache.Acquire(currentDivisor) : null; + ulong cycleLeaseEnd = cycleLease?.End ?? 0UL; while (currentDivisor <= allowedMax) { @@ -181,12 +182,13 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv bool includeDivisor = true; if (useCycles) { - if (currentDivisor > cycleLease!.End) + if (currentDivisor > cycleLeaseEnd) { cycleLease = divisorCyclesCache.Acquire(currentDivisor); + cycleLeaseEnd = cycleLease.End; } - cycle = prime % cycleLease.GetCycle(currentDivisor); + cycle = prime % cycleLease!.GetCycle(currentDivisor); if (cycle != 0UL) { includeDivisor = false; @@ -358,11 +360,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv public void CheckDivisor(ulong divisor, ulong divisorCycle, ReadOnlySpan primes, Span hits) { - if (_disposed) - { - throw new ObjectDisposedException(nameof(DivisorScanSession)); - } - MersenneNumberDivisorByDivisorGpuTester owner = _owner; int gpuBatchSize = owner._gpuBatchSize, primesLength = primes.Length; @@ -379,8 +376,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv ArrayView1D exponentView, exponentsView = _exponentsBuffer.View; ArrayView1D resultView, resultsView = _resultsBuffer.View; - Span exponentSlice, hostSpan = _hostBuffer.AsSpan(); - Span positionSpan = _positionBuffer.AsSpan(); + Span exponentSlice, hostSpan = new(_hostBuffer); + Span positionSpan = new(_positionBuffer); Span hitsSlice; ReadOnlySpan primesSlice; @@ -406,8 +403,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv continue; } - hostSpan[computeCount] = residue; positionSpan[computeCount] = i; + hostSpan[computeCount] = residue; computeCount++; } } @@ -415,8 +412,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv { for (i = 0; i < batchSize; i++) { - hostSpan[computeCount] = primesSlice[i]; positionSpan[computeCount] = i; + hostSpan[computeCount] = primesSlice[i]; computeCount++; } } @@ -450,12 +447,10 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv } _disposed = true; - _owner.ReturnSession(this); + _owner._sessionPool.Add(this); } } - internal void ReturnSession(DivisorScanSession session) => _sessionPool.Add(session); - private static void ComputePrimeExponentKernel(Index1D index, MontgomeryDivisorData divisor, ArrayView exponents, ArrayView results) { ulong modulus = divisor.Modulus;