diff --git a/PerfectNumbers.Core/PartialFactorPendingEntry.cs b/PerfectNumbers.Core/PartialFactorPendingEntry.cs index 71d71b5..c6f541d 100644 --- a/PerfectNumbers.Core/PartialFactorPendingEntry.cs +++ b/PerfectNumbers.Core/PartialFactorPendingEntry.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; namespace PerfectNumbers.Core; -internal sealed class PartialFactorPendingEntry(ulong value, bool knownComposite) +public sealed class PartialFactorPendingEntry(ulong value, bool knownComposite) { [ThreadStatic] private static PartialFactorPendingEntry? _poolHead; diff --git a/PerfectNumbers.Core/PartialFactorResult.cs b/PerfectNumbers.Core/PartialFactorResult.cs index f95eace..197f730 100644 --- a/PerfectNumbers.Core/PartialFactorResult.cs +++ b/PerfectNumbers.Core/PartialFactorResult.cs @@ -9,6 +9,8 @@ namespace PerfectNumbers.Core public readonly ulong[] Factors = new ulong[PrimeOrderConstants.GpuSmallPrimeFactorSlots]; public readonly int[] Exponents = new int[PrimeOrderConstants.GpuSmallPrimeFactorSlots]; + public readonly FixedCapacityStack CompositeStack = new (PrimeOrderConstants.GpuSmallPrimeFactorSlots); + public readonly List PendingFactors = new (PrimeOrderConstants.GpuSmallPrimeFactorSlots); private PartialFactorResult? _next; public ulong Cofactor; public bool FullyFactored; diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs index b9d820e..da43a29 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs @@ -1310,7 +1310,8 @@ internal static partial class PrimeOrderCalculator // primeSlots.Clear(); // exponentSlots.Clear(); - List pending = ThreadStaticPools.RentPrimeOrderPendingEntryList(PrimeOrderConstants.GpuSmallPrimeFactorSlots); + List pending = result.PendingFactors; + pending.Clear(); PopulateSmallPrimeFactorsCpu( value, @@ -1325,7 +1326,8 @@ internal static partial class PrimeOrderCalculator if (config.PollardRhoMilliseconds > 0) { long deadlineTimestamp = CreateDeadlineTimestamp(config.PollardRhoMilliseconds); - FixedCapacityStack compositeStack = ThreadStaticPools.RentUlongStack(PrimeOrderConstants.GpuSmallPrimeFactorSlots); + FixedCapacityStack compositeStack = result.CompositeStack; + compositeStack.Clear(); compositeStack.Push(remaining); CollectFactorsCpu(primeSlots, exponentSlots, ref factorCount, pending, compositeStack, deadlineTimestamp, out bool limitReached); @@ -1337,9 +1339,6 @@ internal static partial class PrimeOrderCalculator pending.Add(PartialFactorPendingEntry.Rent(compositeStack.Pop(), knownComposite: false)); } } - - compositeStack.Clear(); - ThreadStaticPools.ReturnUlongStack(compositeStack); } else { @@ -1351,10 +1350,6 @@ internal static partial class PrimeOrderCalculator bool cofactorContainsComposite = false; int pendingCount = pending.Count; int index = 0; - if (pending.Capacity > PrimeOrderConstants.GpuSmallPrimeFactorSlots) - { - Console.WriteLine($"Initial capacity is too small. Required capacity: {pending.Capacity}"); - } for (; index < pendingCount; index++) { @@ -1427,8 +1422,6 @@ internal static partial class PrimeOrderCalculator result.Count = factorCount; result.CofactorIsPrime = cofactorIsPrime; - pending.Clear(); - ThreadStaticPools.ReturnPrimeOrderPendingEntryList(pending); return result; }