Tiny optimizations
This commit is contained in:
1 parent
05077f7e90
commit
b40c61b527
1 file changed
+10
-15
@@ -136,7 +136,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
Action<Index1D, ulong, byte, ulong, ArrayView<MontgomeryDivisorData>, ArrayView<byte>> kernel,
|
Action<Index1D, ulong, byte, ulong, ArrayView<MontgomeryDivisorData>, ArrayView<byte>> kernel,
|
||||||
MemoryBuffer1D<MontgomeryDivisorData, Stride1D.Dense> divisorsBuffer,
|
MemoryBuffer1D<MontgomeryDivisorData, Stride1D.Dense> divisorsBuffer,
|
||||||
MemoryBuffer1D<byte, Stride1D.Dense> hitsBuffer,
|
MemoryBuffer1D<byte, Stride1D.Dense> hitsBuffer,
|
||||||
ulong[] divisors,
|
in ulong[] divisors,
|
||||||
byte[] hits,
|
byte[] hits,
|
||||||
MontgomeryDivisorData[] divisorData,
|
MontgomeryDivisorData[] divisorData,
|
||||||
out ulong lastProcessed,
|
out ulong lastProcessed,
|
||||||
@@ -167,6 +167,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
ArrayView1D<byte, Stride1D.Dense> hitsView;
|
ArrayView1D<byte, Stride1D.Dense> hitsView;
|
||||||
DivisorCycleCache divisorCyclesCache = DivisorCycleCache.Shared;
|
DivisorCycleCache divisorCyclesCache = DivisorCycleCache.Shared;
|
||||||
DivisorCycleCache.CycleBlock? cycleLease = useCycles ? divisorCyclesCache.Acquire(currentDivisor) : null;
|
DivisorCycleCache.CycleBlock? cycleLease = useCycles ? divisorCyclesCache.Acquire(currentDivisor) : null;
|
||||||
|
ulong cycleLeaseEnd = cycleLease?.End ?? 0UL;
|
||||||
|
|
||||||
while (currentDivisor <= allowedMax)
|
while (currentDivisor <= allowedMax)
|
||||||
{
|
{
|
||||||
@@ -181,12 +182,13 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
bool includeDivisor = true;
|
bool includeDivisor = true;
|
||||||
if (useCycles)
|
if (useCycles)
|
||||||
{
|
{
|
||||||
if (currentDivisor > cycleLease!.End)
|
if (currentDivisor > cycleLeaseEnd)
|
||||||
{
|
{
|
||||||
cycleLease = divisorCyclesCache.Acquire(currentDivisor);
|
cycleLease = divisorCyclesCache.Acquire(currentDivisor);
|
||||||
|
cycleLeaseEnd = cycleLease.End;
|
||||||
}
|
}
|
||||||
|
|
||||||
cycle = prime % cycleLease.GetCycle(currentDivisor);
|
cycle = prime % cycleLease!.GetCycle(currentDivisor);
|
||||||
if (cycle != 0UL)
|
if (cycle != 0UL)
|
||||||
{
|
{
|
||||||
includeDivisor = false;
|
includeDivisor = false;
|
||||||
@@ -358,11 +360,6 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
|
|
||||||
public void CheckDivisor(ulong divisor, ulong divisorCycle, ReadOnlySpan<ulong> primes, Span<byte> hits)
|
public void CheckDivisor(ulong divisor, ulong divisorCycle, ReadOnlySpan<ulong> primes, Span<byte> hits)
|
||||||
{
|
{
|
||||||
if (_disposed)
|
|
||||||
{
|
|
||||||
throw new ObjectDisposedException(nameof(DivisorScanSession));
|
|
||||||
}
|
|
||||||
|
|
||||||
MersenneNumberDivisorByDivisorGpuTester owner = _owner;
|
MersenneNumberDivisorByDivisorGpuTester owner = _owner;
|
||||||
int gpuBatchSize = owner._gpuBatchSize,
|
int gpuBatchSize = owner._gpuBatchSize,
|
||||||
primesLength = primes.Length;
|
primesLength = primes.Length;
|
||||||
@@ -379,8 +376,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
ArrayView1D<ulong, Stride1D.Dense> exponentView, exponentsView = _exponentsBuffer.View;
|
ArrayView1D<ulong, Stride1D.Dense> exponentView, exponentsView = _exponentsBuffer.View;
|
||||||
ArrayView1D<ulong, Stride1D.Dense> resultView, resultsView = _resultsBuffer.View;
|
ArrayView1D<ulong, Stride1D.Dense> resultView, resultsView = _resultsBuffer.View;
|
||||||
|
|
||||||
Span<ulong> exponentSlice, hostSpan = _hostBuffer.AsSpan();
|
Span<ulong> exponentSlice, hostSpan = new(_hostBuffer);
|
||||||
Span<int> positionSpan = _positionBuffer.AsSpan();
|
Span<int> positionSpan = new(_positionBuffer);
|
||||||
Span<byte> hitsSlice;
|
Span<byte> hitsSlice;
|
||||||
ReadOnlySpan<ulong> primesSlice;
|
ReadOnlySpan<ulong> primesSlice;
|
||||||
|
|
||||||
@@ -406,8 +403,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
hostSpan[computeCount] = residue;
|
|
||||||
positionSpan[computeCount] = i;
|
positionSpan[computeCount] = i;
|
||||||
|
hostSpan[computeCount] = residue;
|
||||||
computeCount++;
|
computeCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -415,8 +412,8 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
{
|
{
|
||||||
for (i = 0; i < batchSize; i++)
|
for (i = 0; i < batchSize; i++)
|
||||||
{
|
{
|
||||||
hostSpan[computeCount] = primesSlice[i];
|
|
||||||
positionSpan[computeCount] = i;
|
positionSpan[computeCount] = i;
|
||||||
|
hostSpan[computeCount] = primesSlice[i];
|
||||||
computeCount++;
|
computeCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,12 +447,10 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
}
|
}
|
||||||
|
|
||||||
_disposed = true;
|
_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<ulong> exponents, ArrayView<ulong> results)
|
private static void ComputePrimeExponentKernel(Index1D index, MontgomeryDivisorData divisor, ArrayView<ulong> exponents, ArrayView<ulong> results)
|
||||||
{
|
{
|
||||||
ulong modulus = divisor.Modulus;
|
ulong modulus = divisor.Modulus;
|
||||||
|
|||||||
Reference in new issue
Block a user