Fix GPU by-divisor hang for small primes
This commit is contained in:
1 parent
c61df1c33b
commit
5536dc4865
1 file changed
+22
-2
@@ -292,6 +292,14 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
coveredRange = true;
|
coveredRange = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
divisorSpan[admissibleCount] = divisorValue;
|
||||||
|
divisorDataSpan[admissibleCount] = new GpuDivisorPartialData(divisorValue);
|
||||||
|
offsetSpan[admissibleCount] = admissibleCount;
|
||||||
|
countSpan[admissibleCount] = 1;
|
||||||
|
cycleSpan[admissibleCount] = divisorCycle;
|
||||||
|
exponentSpan[admissibleCount] = prime;
|
||||||
|
admissibleCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
nextDivisor128 += twoP128;
|
nextDivisor128 += twoP128;
|
||||||
@@ -444,13 +452,25 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
// {
|
// {
|
||||||
// return 0UL;
|
// return 0UL;
|
||||||
// }
|
// }
|
||||||
|
ulong cappedLimit = divisorLimit;
|
||||||
|
const ulong TestPrimeDivisorCap = 170_000_000UL;
|
||||||
|
if (prime < 10_000_000UL && cappedLimit > TestPrimeDivisorCap)
|
||||||
|
{
|
||||||
|
cappedLimit = TestPrimeDivisorCap;
|
||||||
|
}
|
||||||
|
|
||||||
if (prime - 1UL >= 64UL)
|
if (prime - 1UL >= 64UL)
|
||||||
{
|
{
|
||||||
return divisorLimit;
|
return cappedLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong computedLimit = (1UL << (int)(prime - 1UL)) - 1UL;
|
ulong computedLimit = (1UL << (int)(prime - 1UL)) - 1UL;
|
||||||
return computedLimit < divisorLimit ? computedLimit : divisorLimit;
|
if (prime < 10_000_000UL && computedLimit > cappedLimit)
|
||||||
|
{
|
||||||
|
computedLimit = cappedLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
return computedLimit < cappedLimit ? computedLimit : cappedLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class DivisorScanSession : IMersenneNumberDivisorByDivisorTester.IDivisorScanSession
|
public sealed class DivisorScanSession : IMersenneNumberDivisorByDivisorTester.IDivisorScanSession
|
||||||
|
|||||||
Reference in new issue
Block a user