Enable residue-aware GPU sieve in PrimeTester
This commit is contained in:
1 parent
3d43d52f2e
commit
c53966e481
7 files changed
+359
-168
No files matched your search
@@ -121,7 +121,7 @@ public class GpuKernelCompilationTests
|
||||
private static readonly Action<Index1D, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> MersenneDivisorCyclesKernel =
|
||||
DivisorCycleKernels.GpuDivisorCycleKernel;
|
||||
|
||||
private static readonly Action<Index1D, ArrayView<ulong>, ArrayView<uint>, ArrayView<byte>> PrimeTesterSmallPrimeKernel =
|
||||
private static readonly Action<Index1D, ArrayView<ulong>, ArrayView<uint>, ArrayView<uint>, ArrayView<uint>, ArrayView<uint>, ArrayView<uint>, ArrayView<byte>> PrimeTesterSmallPrimeKernel =
|
||||
PrimeTesterKernels.SmallPrimeSieveKernel;
|
||||
|
||||
private static readonly Action<Index1D, ArrayView<ulong>, ArrayView<byte>> PrimeTesterSharesFactorKernel =
|
||||
@@ -336,7 +336,7 @@ public class GpuKernelCompilationTests
|
||||
|
||||
private static void CompilePrimeTesterSmallPrimeKernel(Accelerator accelerator)
|
||||
{
|
||||
var kernel = accelerator.LoadAutoGroupedStreamKernel<Index1D, ArrayView<ulong>, ArrayView<uint>, ArrayView<byte>>(PrimeTesterSmallPrimeKernel);
|
||||
var kernel = accelerator.LoadAutoGroupedStreamKernel<Index1D, ArrayView<ulong>, ArrayView<uint>, ArrayView<uint>, ArrayView<uint>, ArrayView<uint>, ArrayView<uint>, ArrayView<byte>>(PrimeTesterSmallPrimeKernel);
|
||||
_ = kernel;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,10 @@ public class PrimeTesterIsPrimeTests
|
||||
[InlineData(97UL, true)]
|
||||
[InlineData(133UL, false)]
|
||||
[InlineData(137UL, true)]
|
||||
[InlineData(143UL, false)]
|
||||
[InlineData(199UL, true)]
|
||||
[InlineData(209UL, false)]
|
||||
[InlineData(403UL, false)]
|
||||
[InlineData(341UL, false)]
|
||||
public void IsPrime_returns_expected_results(ulong n, bool expected)
|
||||
{
|
||||
@@ -25,6 +29,20 @@ public class PrimeTesterIsPrimeTests
|
||||
tester.IsPrime(n, CancellationToken.None).Should().Be(expected);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[Trait("Category", "Fast")]
|
||||
[InlineData(139UL, true)]
|
||||
[InlineData(189UL, false)]
|
||||
[InlineData(193UL, true)]
|
||||
[InlineData(279UL, false)]
|
||||
public void IsPrimeGpu_uses_residue_specific_tables(ulong n, bool expected)
|
||||
{
|
||||
GpuContextPool.ForceCpu = false;
|
||||
var tester = new PrimeTester();
|
||||
|
||||
tester.IsPrimeGpu(n, CancellationToken.None).Should().Be(expected);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[Trait("Category", "Fast")]
|
||||
public void IsPrimeGpu_falls_back_to_cpu_when_forced()
|
||||
|
||||
@@ -32,14 +32,24 @@ public class PrimesGeneratorTests
|
||||
var lastOnePow2 = PrimesGenerator.SmallPrimesPow2LastOne;
|
||||
var lastSeven = PrimesGenerator.SmallPrimesLastSeven;
|
||||
var lastSevenPow2 = PrimesGenerator.SmallPrimesPow2LastSeven;
|
||||
var lastThree = DivisorGenerator.SmallPrimesLastThree;
|
||||
var lastThreePow2 = DivisorGenerator.SmallPrimesPow2LastThree;
|
||||
var lastNine = DivisorGenerator.SmallPrimesLastNine;
|
||||
var lastNinePow2 = DivisorGenerator.SmallPrimesPow2LastNine;
|
||||
|
||||
lastOne.Length.Should().Be((int)PerfectNumberConstants.PrimesLimit);
|
||||
lastSeven.Length.Should().Be((int)PerfectNumberConstants.PrimesLimit);
|
||||
lastThree.Length.Should().Be((int)PerfectNumberConstants.PrimesLimit);
|
||||
lastNine.Length.Should().Be((int)PerfectNumberConstants.PrimesLimit);
|
||||
lastOnePow2.Length.Should().Be(lastOne.Length);
|
||||
lastSevenPow2.Length.Should().Be(lastSeven.Length);
|
||||
lastThreePow2.Length.Should().Be(lastThree.Length);
|
||||
lastNinePow2.Length.Should().Be(lastNine.Length);
|
||||
|
||||
lastOne[..5].Should().Equal([3U, 7U, 11U, 13U, 19U]);
|
||||
lastSeven[..5].Should().Equal([3U, 7U, 11U, 13U, 17U]);
|
||||
lastThree[..6].Should().Equal([3U, 7U, 11U, 13U, 17U, 19U]);
|
||||
lastNine[..6].Should().Equal([3U, 7U, 11U, 13U, 17U, 19U]);
|
||||
|
||||
for (int i = 0; i < lastOne.Length; i++)
|
||||
{
|
||||
@@ -58,6 +68,23 @@ public class PrimesGeneratorTests
|
||||
.Should().BeTrue();
|
||||
lastSevenPow2[i].Should().Be(prime * (ulong)prime);
|
||||
}
|
||||
|
||||
for (int i = 0; i < lastThree.Length; i++)
|
||||
{
|
||||
uint prime = lastThree[i];
|
||||
uint mod10 = prime % 10U;
|
||||
(mod10 == 3U || mod10 == 7U || prime == 11U || prime == 19U)
|
||||
.Should().BeTrue();
|
||||
lastThreePow2[i].Should().Be(prime * (ulong)prime);
|
||||
}
|
||||
|
||||
for (int i = 0; i < lastNine.Length; i++)
|
||||
{
|
||||
uint prime = lastNine[i];
|
||||
uint mod10 = prime % 10U;
|
||||
(mod10 == 3U || mod10 == 7U || mod10 == 9U || prime == 11U)
|
||||
.Should().BeTrue();
|
||||
lastNinePow2[i].Should().Be(prime * (ulong)prime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user