Reuse GPU by-divisor buffers to curb host allocations

This commit is contained in:
Marek Lemańczyk committed 2025-10-25 03:45:46 +02:00
1 parent 2b00a53c78
commit 6b1c2d0665
1 file changed
+7 -5
@@ -113,6 +113,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
resources.HitIndexBuffer, resources.HitIndexBuffer,
resources.Divisors, resources.Divisors,
resources.Exponents, resources.Exponents,
resources.FilteredDivisors,
resources.DivisorData, resources.DivisorData,
resources.Offsets, resources.Offsets,
resources.Counts, resources.Counts,
@@ -177,8 +178,9 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
MemoryBuffer1D<ulong, Stride1D.Dense> exponentBuffer, MemoryBuffer1D<ulong, Stride1D.Dense> exponentBuffer,
MemoryBuffer1D<byte, Stride1D.Dense> hitsBuffer, MemoryBuffer1D<byte, Stride1D.Dense> hitsBuffer,
MemoryBuffer1D<int, Stride1D.Dense> hitIndexBuffer, MemoryBuffer1D<int, Stride1D.Dense> hitIndexBuffer,
in ulong[] divisors, ulong[] divisors,
ulong[] exponents, ulong[] exponents,
ulong[] filteredDivisors,
GpuDivisorPartialData[] divisorData, GpuDivisorPartialData[] divisorData,
int[] offsets, int[] offsets,
int[] counts, int[] counts,
@@ -229,8 +231,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
byte remainder11 = (byte)((ulong)(currentDivisor128 % 11UL)); byte remainder11 = (byte)((ulong)(currentDivisor128 % 11UL));
bool lastIsSeven = (prime & 3UL) == 3UL; bool lastIsSeven = (prime & 3UL) == 3UL;
ArrayPool<ulong> ulongPool = ThreadStaticPools.UlongPool;
ulong[] filteredDivisors = ulongPool.Rent(chunkCapacity);
Span<ulong> filteredStorage = filteredDivisors.AsSpan(); Span<ulong> filteredStorage = filteredDivisors.AsSpan();
Span<ulong> divisorStorage = divisors.AsSpan(); Span<ulong> divisorStorage = divisors.AsSpan();
Span<ulong> exponentStorage = exponents.AsSpan(); Span<ulong> exponentStorage = exponents.AsSpan();
@@ -373,8 +373,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
lastProcessed = hitFound ? divisorSpan[hitIndex] : divisorSpan[lastIndex]; lastProcessed = hitFound ? divisorSpan[hitIndex] : divisorSpan[lastIndex];
} }
ulongPool.Return(filteredDivisors, clearArray: false);
coveredRange = composite || processedAll || (currentDivisor128 > allowedMax128); coveredRange = composite || processedAll || (currentDivisor128 > allowedMax128);
return composite; return composite;
} }
@@ -725,6 +723,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
Divisors = ulongPool.Rent(actualCapacity); Divisors = ulongPool.Rent(actualCapacity);
Exponents = ulongPool.Rent(actualCapacity); Exponents = ulongPool.Rent(actualCapacity);
FilteredDivisors = ulongPool.Rent(actualCapacity);
DivisorData = partialPool.Rent(actualCapacity); DivisorData = partialPool.Rent(actualCapacity);
Offsets = intPool.Rent(actualCapacity); Offsets = intPool.Rent(actualCapacity);
Counts = intPool.Rent(actualCapacity); Counts = intPool.Rent(actualCapacity);
@@ -753,6 +752,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
internal readonly ulong[] Exponents; internal readonly ulong[] Exponents;
internal readonly ulong[] FilteredDivisors;
internal readonly GpuDivisorPartialData[] DivisorData; internal readonly GpuDivisorPartialData[] DivisorData;
internal readonly int[] Offsets; internal readonly int[] Offsets;
@@ -780,6 +781,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
ArrayPool<GpuDivisorPartialData> partialPool = ThreadStaticPools.GpuDivisorPartialDataPool; ArrayPool<GpuDivisorPartialData> partialPool = ThreadStaticPools.GpuDivisorPartialDataPool;
ulongPool.Return(Divisors, clearArray: false); ulongPool.Return(Divisors, clearArray: false);
ulongPool.Return(Exponents, clearArray: false); ulongPool.Return(Exponents, clearArray: false);
ulongPool.Return(FilteredDivisors, clearArray: false);
partialPool.Return(DivisorData, clearArray: false); partialPool.Return(DivisorData, clearArray: false);
intPool.Return(Offsets, clearArray: false); intPool.Return(Offsets, clearArray: false);
intPool.Return(Counts, clearArray: false); intPool.Return(Counts, clearArray: false);