Divisor checking optimized to only flag if divisor was found or not without returning complete array of hits. We'll now also track residues for 13, 17 & 19 as the most frequent ones.
This commit is contained in:
1 parent
85a90c70bf
commit
86192a71b0
7 files changed
+158
-62
No files matched your search
@@ -717,13 +717,13 @@ public sealed partial class MersenneNumberDivisorByDivisorGpuTester : IMersenneN
|
||||
}
|
||||
}
|
||||
|
||||
public void CheckDivisor(ulong divisor, in MontgomeryDivisorData divisorData, ulong divisorCycle, in ReadOnlySpan<ulong> primes, Span<byte> hits)
|
||||
public bool CheckDivisor(ulong divisor, in MontgomeryDivisorData divisorData, ulong divisorCycle, in ReadOnlySpan<ulong> primes)
|
||||
{
|
||||
int length = primes.Length;
|
||||
// EvenPerfectBitScanner always supplies at least one exponent per divisor check, so the guard stays commented out.
|
||||
// if (length == 0)
|
||||
// {
|
||||
// return;
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// The GPU divisor sessions only materialize odd moduli greater than one (q = 2kp + 1),
|
||||
@@ -792,12 +792,11 @@ public sealed partial class MersenneNumberDivisorByDivisorGpuTester : IMersenneN
|
||||
|
||||
kernel(stream, new Index1D(1), divisorView, offsetView, countView, exponentView, cycleView, hitView, firstHitView);
|
||||
|
||||
Span<byte> hitSlice = hits.Slice(0, length);
|
||||
ref byte hitRef = ref MemoryMarshal.GetReference(hitSlice);
|
||||
hitView.CopyToCPU(stream, ref hitRef, length);
|
||||
firstHitView.CopyToCPU(stream, ref sentinel, 1);
|
||||
stream.Synchronize();
|
||||
|
||||
// Monitor.Exit(_lease.ExecutionLock);
|
||||
return sentinel == 0;
|
||||
}
|
||||
|
||||
public void Return()
|
||||
|
||||
Reference in new issue
Block a user