PooledContext removal - continuation. GpuKernelLease prepared for removal.
This commit is contained in:
1 parent
f4e365194d
commit
0410fd2c91
20 files changed
+159
-234
No files matched your search
@@ -102,13 +102,11 @@ public class ProgramTests
|
|||||||
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var candidatesField = typeof(MersenneNumberDivisorGpuTester).GetField("_divisorCandidates", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var candidatesField = typeof(MersenneNumberDivisorGpuTester).GetField("_divisorCandidates", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
candidatesField.SetValue(null, new (ulong, uint)[] { (7UL, 3U), (23UL, 11U) });
|
candidatesField.SetValue(null, new (ulong, uint)[] { (7UL, 3U), (23UL, 11U) });
|
||||||
forceCpuProp!.SetValue(null, true);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -122,7 +120,6 @@ public class ProgramTests
|
|||||||
candidatesField.SetValue(null, null);
|
candidatesField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,13 +132,11 @@ public class ProgramTests
|
|||||||
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var candidatesField = typeof(MersenneNumberDivisorGpuTester).GetField("_divisorCandidates", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var candidatesField = typeof(MersenneNumberDivisorGpuTester).GetField("_divisorCandidates", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
candidatesField.SetValue(null, Array.Empty<(ulong, uint)>());
|
candidatesField.SetValue(null, Array.Empty<(ulong, uint)>());
|
||||||
forceCpuProp!.SetValue(null, true);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -155,7 +150,6 @@ public class ProgramTests
|
|||||||
candidatesField.SetValue(null, null);
|
candidatesField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,12 +162,10 @@ public class ProgramTests
|
|||||||
|
|
||||||
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, true);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -186,7 +178,6 @@ public class ProgramTests
|
|||||||
testerField.SetValue(null, null);
|
testerField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,12 +190,10 @@ public class ProgramTests
|
|||||||
|
|
||||||
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var testerField = typeof(Program).GetField("_divisorTester", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
testerField.SetValue(null, new MersenneNumberDivisorGpuTester());
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -221,7 +210,6 @@ public class ProgramTests
|
|||||||
testerField.SetValue(null, null);
|
testerField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -233,12 +221,10 @@ public class ProgramTests
|
|||||||
|
|
||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(useIncremental: true, useResidue: true, maxK: 1_000UL), trackAllValues: true));
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(useIncremental: true, useResidue: true, maxK: 1_000UL), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -255,7 +241,6 @@ public class ProgramTests
|
|||||||
mersenneField.SetValue(null, null);
|
mersenneField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -267,7 +252,6 @@ public class ProgramTests
|
|||||||
|
|
||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
||||||
useIncremental: true,
|
useIncremental: true,
|
||||||
@@ -275,7 +259,6 @@ public class ProgramTests
|
|||||||
maxK: 1_024UL), trackAllValues: true));
|
maxK: 1_024UL), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -292,7 +275,6 @@ public class ProgramTests
|
|||||||
mersenneField.SetValue(null, null);
|
mersenneField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,7 +287,6 @@ public class ProgramTests
|
|||||||
|
|
||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
||||||
useIncremental: true,
|
useIncremental: true,
|
||||||
@@ -313,7 +294,6 @@ public class ProgramTests
|
|||||||
maxK: 5_000_000UL), trackAllValues: true));
|
maxK: 5_000_000UL), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -330,7 +310,6 @@ public class ProgramTests
|
|||||||
mersenneField.SetValue(null, null);
|
mersenneField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,7 +321,6 @@ public class ProgramTests
|
|||||||
|
|
||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
||||||
useIncremental: true,
|
useIncremental: true,
|
||||||
@@ -350,7 +328,6 @@ public class ProgramTests
|
|||||||
maxK: 5_000_000UL), trackAllValues: true));
|
maxK: 5_000_000UL), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -367,7 +344,6 @@ public class ProgramTests
|
|||||||
mersenneField.SetValue(null, null);
|
mersenneField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -380,7 +356,6 @@ public class ProgramTests
|
|||||||
|
|
||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
||||||
useIncremental: true,
|
useIncremental: true,
|
||||||
@@ -390,7 +365,6 @@ public class ProgramTests
|
|||||||
maxK: 1_024UL), trackAllValues: true));
|
maxK: 1_024UL), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, exponent, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, exponent, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, true);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -402,7 +376,6 @@ public class ProgramTests
|
|||||||
mersenneField.SetValue(null, null);
|
mersenneField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -417,7 +390,6 @@ public class ProgramTests
|
|||||||
|
|
||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(
|
||||||
useIncremental: false,
|
useIncremental: false,
|
||||||
@@ -428,7 +400,6 @@ public class ProgramTests
|
|||||||
maxK: configuration.ResidueMaxK), trackAllValues: true));
|
maxK: configuration.ResidueMaxK), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, exponent, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, exponent, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -440,9 +411,7 @@ public class ProgramTests
|
|||||||
mersenneField.SetValue(null, null);
|
mersenneField.SetValue(null, null);
|
||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,12 +475,10 @@ public class ProgramTests
|
|||||||
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var mersenneField = typeof(Program).GetField("MersenneTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var primeField = typeof(Program).GetField("PrimeTesters", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var compositeField = typeof(Program).GetField("_lastCompositeP", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var compositeField = typeof(Program).GetField("_lastCompositeP", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
var forceCpuProp = typeof(GpuContextPool).GetProperty("ForceCpu");
|
|
||||||
|
|
||||||
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(useIncremental: true, useResidue: false, maxK: 1_000UL), trackAllValues: true));
|
mersenneField.SetValue(null, new ThreadLocal<MersenneNumberTester>(() => new MersenneNumberTester(useIncremental: true, useResidue: false, maxK: 1_000UL), trackAllValues: true));
|
||||||
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
primeField.SetValue(null, new ThreadLocal<PrimeTester>(() => new PrimeTester(), trackAllValues: true));
|
||||||
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
CandidatesCalculator.OverrideResidueTrackers(new ThreadLocal<ModResidueTracker>(() => new ModResidueTracker(ResidueModel.Identity, 2UL, true), trackAllValues: true));
|
||||||
forceCpuProp!.SetValue(null, true);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -532,7 +499,6 @@ public class ProgramTests
|
|||||||
primeField.SetValue(null, null);
|
primeField.SetValue(null, null);
|
||||||
CandidatesCalculator.ResetResidueTrackers();
|
CandidatesCalculator.ResetResidueTrackers();
|
||||||
compositeField.SetValue(null, false);
|
compositeField.SetValue(null, false);
|
||||||
forceCpuProp!.SetValue(null, false);
|
|
||||||
ResetCliArguments();
|
ResetCliArguments();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ internal static class Program
|
|||||||
UnboundedTaskScheduler.ConfigureThreadCount(threadCount);
|
UnboundedTaskScheduler.ConfigureThreadCount(threadCount);
|
||||||
PrimeTester.GpuBatchSize = gpuPrimeBatch;
|
PrimeTester.GpuBatchSize = gpuPrimeBatch;
|
||||||
GpuPrimeWorkLimiter.SetLimit(gpuPrimeThreads);
|
GpuPrimeWorkLimiter.SetLimit(gpuPrimeThreads);
|
||||||
GpuContextPool.WarmUpPool(threadCount);
|
|
||||||
PrimeTester.WarmUpGpuKernels(gpuPrimeThreads);
|
PrimeTester.WarmUpGpuKernels(gpuPrimeThreads);
|
||||||
GpuScratchBufferPool.WarmUp(gpuPrimeThreads << 4, 64, 1024);
|
GpuScratchBufferPool.WarmUp(gpuPrimeThreads << 4, 64, 1024);
|
||||||
Console.WriteLine("Starting up threads...");
|
Console.WriteLine("Starting up threads...");
|
||||||
|
|||||||
@@ -352,11 +352,11 @@ public class GpuKernelCompilationTests
|
|||||||
var lease = GpuKernelPool.Rent();
|
var lease = GpuKernelPool.Rent();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ = lease.OrderKernel;
|
_ = GpuKernelLease.OrderKernel;
|
||||||
_ = lease.IncrementalKernel;
|
_ = GpuKernelLease.IncrementalKernel;
|
||||||
_ = lease.Pow2ModKernel;
|
_ = GpuKernelLease.Pow2ModKernel;
|
||||||
_ = lease.IncrementalOrderKernel;
|
_ = GpuKernelLease.IncrementalOrderKernel;
|
||||||
_ = lease.Pow2ModOrderKernel;
|
_ = GpuKernelLease.Pow2ModOrderKernel;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -366,11 +366,11 @@ public class GpuKernelCompilationTests
|
|||||||
var orderLease = GpuKernelPool.Rent();
|
var orderLease = GpuKernelPool.Rent();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ = orderLease.OrderKernel;
|
_ = GpuKernelLease.OrderKernel;
|
||||||
_ = orderLease.IncrementalKernel;
|
_ = GpuKernelLease.IncrementalKernel;
|
||||||
_ = orderLease.Pow2ModKernel;
|
_ = GpuKernelLease.Pow2ModKernel;
|
||||||
_ = orderLease.IncrementalOrderKernel;
|
_ = GpuKernelLease.IncrementalOrderKernel;
|
||||||
_ = orderLease.Pow2ModOrderKernel;
|
_ = GpuKernelLease.Pow2ModOrderKernel;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -150,10 +150,7 @@ public class NttGpuMathTests
|
|||||||
var modulus = new GpuUInt128(0UL, 17UL);
|
var modulus = new GpuUInt128(0UL, 17UL);
|
||||||
var primitiveRoot = new GpuUInt128(0UL, 3UL);
|
var primitiveRoot = new GpuUInt128(0UL, 3UL);
|
||||||
|
|
||||||
GpuContextLease gpu = GpuContextPool.Rent();
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
try
|
|
||||||
{
|
|
||||||
var accelerator = gpu.Accelerator;
|
|
||||||
var stream = accelerator.CreateStream();
|
var stream = accelerator.CreateStream();
|
||||||
|
|
||||||
var method = typeof(NttGpuMath).GetMethod("GetSquareCache", BindingFlags.NonPublic | BindingFlags.Static);
|
var method = typeof(NttGpuMath).GetMethod("GetSquareCache", BindingFlags.NonPublic | BindingFlags.Static);
|
||||||
@@ -180,11 +177,6 @@ public class NttGpuMathTests
|
|||||||
prod.Should().Be(r2);
|
prod.Should().Be(r2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
gpu.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
[Trait("Category", "Fast")]
|
[Trait("Category", "Fast")]
|
||||||
@@ -348,15 +340,14 @@ public class NttGpuMathTests
|
|||||||
values[1] = new GpuUInt128(0UL, 2UL);
|
values[1] = new GpuUInt128(0UL, 2UL);
|
||||||
var modulus = new GpuUInt128(0UL, 17UL);
|
var modulus = new GpuUInt128(0UL, 17UL);
|
||||||
var primitiveRoot = new GpuUInt128(0UL, 3UL);
|
var primitiveRoot = new GpuUInt128(0UL, 3UL);
|
||||||
GpuContextLease gpu = GpuContextPool.Rent();
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = gpu.Accelerator.CreateStream();
|
var stream = accelerator.CreateStream();
|
||||||
var buffer = gpu.Accelerator.Allocate1D<GpuUInt128>(values.Length);
|
var buffer = accelerator.Allocate1D<GpuUInt128>(values.Length);
|
||||||
buffer.View.CopyFromCPU(stream, ref values[0], values.Length);
|
buffer.View.CopyFromCPU(stream, ref values[0], values.Length);
|
||||||
NttGpuMath.SquareDevice(gpu.Accelerator, stream, buffer.View, modulus, primitiveRoot);
|
NttGpuMath.SquareDevice(accelerator, stream, buffer.View, modulus, primitiveRoot);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
buffer.Dispose();
|
|
||||||
stream.Dispose();
|
stream.Dispose();
|
||||||
gpu.Dispose();
|
buffer.Dispose();
|
||||||
|
|
||||||
// Verify that the square cache now holds entries for the accelerator.
|
// Verify that the square cache now holds entries for the accelerator.
|
||||||
var field = typeof(NttGpuMath).GetField("SquareCache", BindingFlags.NonPublic | BindingFlags.Static)!;
|
var field = typeof(NttGpuMath).GetField("SquareCache", BindingFlags.NonPublic | BindingFlags.Static)!;
|
||||||
@@ -364,8 +355,6 @@ public class NttGpuMathTests
|
|||||||
int count = (int)cacheObj.GetType().GetProperty("Count")!.GetValue(cacheObj)!;
|
int count = (int)cacheObj.GetType().GetProperty("Count")!.GetValue(cacheObj)!;
|
||||||
count.Should().BeGreaterThan(0);
|
count.Should().BeGreaterThan(0);
|
||||||
|
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
|
|
||||||
count = (int)cacheObj.GetType().GetProperty("Count")!.GetValue(cacheObj)!;
|
count = (int)cacheObj.GetType().GetProperty("Count")!.GetValue(cacheObj)!;
|
||||||
count.Should().Be(0);
|
count.Should().Be(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ public class NttMontgomeryTests
|
|||||||
NttGpuMath.Square(cpu, modulus, primitiveRoot);
|
NttGpuMath.Square(cpu, modulus, primitiveRoot);
|
||||||
|
|
||||||
// Device execution
|
// Device execution
|
||||||
GpuContextLease context = GpuContextPool.Rent();
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var accelerator = context.Accelerator;
|
|
||||||
var stream = accelerator.CreateStream();
|
var stream = accelerator.CreateStream();
|
||||||
using var buffer = accelerator.Allocate1D<GpuUInt128>(gpu.Length);
|
using var buffer = accelerator.Allocate1D<GpuUInt128>(gpu.Length);
|
||||||
buffer.View.CopyFromCPU(stream, ref gpu[0], gpu.Length);
|
buffer.View.CopyFromCPU(stream, ref gpu[0], gpu.Length);
|
||||||
@@ -48,7 +47,6 @@ public class NttMontgomeryTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
stream.Dispose();
|
stream.Dispose();
|
||||||
context.Dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ public class PrimeTesterGpuTests
|
|||||||
{
|
{
|
||||||
[Fact]
|
[Fact]
|
||||||
public void IsPrimeGpu_accepts_known_primes()
|
public void IsPrimeGpu_accepts_known_primes()
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
var tester = new PrimeTester();
|
var tester = new PrimeTester();
|
||||||
ulong[] primes = [31UL, 61UL, 89UL, 107UL, 127UL, 521UL];
|
ulong[] primes = [31UL, 61UL, 89UL, 107UL, 127UL, 521UL];
|
||||||
@@ -19,16 +17,9 @@ public class PrimeTesterGpuTests
|
|||||||
PrimeTester.IsPrimeGpu(prime).Should().BeTrue();
|
PrimeTester.IsPrimeGpu(prime).Should().BeTrue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void IsPrimeGpu_rejects_composites()
|
public void IsPrimeGpu_rejects_composites()
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
var tester = new PrimeTester();
|
var tester = new PrimeTester();
|
||||||
ulong[] composites = [33UL, 39UL, 51UL, 77UL, 91UL];
|
ulong[] composites = [33UL, 39UL, 51UL, 77UL, 91UL];
|
||||||
@@ -37,10 +28,5 @@ public class PrimeTesterGpuTests
|
|||||||
PrimeTester.IsPrimeGpu(composite).Should().BeFalse();
|
PrimeTester.IsPrimeGpu(composite).Should().BeFalse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -317,7 +317,6 @@ public class MersenneNumberDivisorGpuTesterTests
|
|||||||
tableField.SetValue(cycles, originalTable);
|
tableField.SetValue(cycles, originalTable);
|
||||||
smallCyclesField.SetValue(cycles, originalSmall);
|
smallCyclesField.SetValue(cycles, originalSmall);
|
||||||
DivisorCycleCache.Shared.RefreshSnapshot();
|
DivisorCycleCache.Shared.RefreshSnapshot();
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ public class MersenneNumberOrderGpuTesterTests
|
|||||||
ulong[]? backupSmall = originalSmall is null ? null : (ulong[])originalSmall.Clone();
|
ulong[]? backupSmall = originalSmall is null ? null : (ulong[])originalSmall.Clone();
|
||||||
|
|
||||||
cycles.LoadFrom(tempPath);
|
cycles.LoadFrom(tempPath);
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -75,7 +74,6 @@ public class MersenneNumberOrderGpuTesterTests
|
|||||||
{
|
{
|
||||||
tableField.SetValue(cycles, originalTable);
|
tableField.SetValue(cycles, originalTable);
|
||||||
smallCyclesField.SetValue(cycles, backupSmall);
|
smallCyclesField.SetValue(cycles, backupSmall);
|
||||||
GpuContextPool.DisposeAll();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public sealed class DivisorCycleCache
|
|||||||
var gpuLease = GpuKernelPool.Rent();
|
var gpuLease = GpuKernelPool.Rent();
|
||||||
|
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = gpuLease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
var kernel = _gpuKernel;
|
var kernel = _gpuKernel;
|
||||||
EnsureCapacity(length);
|
EnsureCapacity(length);
|
||||||
|
|
||||||
@@ -338,6 +338,7 @@ public sealed class DivisorCycleCache
|
|||||||
|
|
||||||
resultBuffer.View.CopyToCPU(stream, ref MemoryMarshal.GetReference(resultSpan), length);
|
resultBuffer.View.CopyToCPU(stream, ref MemoryMarshal.GetReference(resultSpan), length);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
stream.Dispose();
|
||||||
|
|
||||||
resultSpan.CopyTo(destination);
|
resultSpan.CopyTo(destination);
|
||||||
if (rentedPow is not null)
|
if (rentedPow is not null)
|
||||||
|
|||||||
@@ -8,122 +8,32 @@ public sealed class GpuKernelLease
|
|||||||
{
|
{
|
||||||
private static readonly ConcurrentQueue<GpuKernelLease> Pool = new();
|
private static readonly ConcurrentQueue<GpuKernelLease> Pool = new();
|
||||||
|
|
||||||
public KernelContainer Kernels;
|
internal static GpuKernelLease Rent()
|
||||||
public AcceleratorStream Stream;
|
|
||||||
|
|
||||||
#pragma warning disable CS8618 // _gpu and Stream will be set by Rent method
|
|
||||||
private GpuKernelLease(KernelContainer kernels)
|
|
||||||
#pragma warning restore CS8618
|
|
||||||
{
|
|
||||||
Kernels = kernels;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static GpuKernelLease Rent(AcceleratorStream stream, KernelContainer kernels)
|
|
||||||
{
|
{
|
||||||
if (!Pool.TryDequeue(out var lease))
|
if (!Pool.TryDequeue(out var lease))
|
||||||
{
|
{
|
||||||
lease = new GpuKernelLease(kernels);
|
lease = new GpuKernelLease();
|
||||||
}
|
}
|
||||||
|
|
||||||
lease.Kernels = kernels;
|
|
||||||
lease.Stream = stream;
|
|
||||||
return lease;
|
return lease;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>> OrderKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>> OrderKernel = GpuKernelPool.Kernels.Order!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.Order, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>>(OrderKernels.OrderKernelScan);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> Pow2ModKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> Pow2ModKernel = GpuKernelPool.Kernels.Pow2Mod!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.Pow2Mod, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>(Pow2ModKernels.Pow2ModKernelScan);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>> IncrementalKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>> IncrementalKernel = GpuKernelPool.Kernels.Incremental!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.Incremental, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>>(IncrementalKernels.IncrementalKernelScan);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>> IncrementalOrderKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>> IncrementalOrderKernel = GpuKernelPool.Kernels.IncrementalOrder!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.IncrementalOrder, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>(IncrementalKernels.IncrementalOrderKernelScan);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>> Pow2ModOrderKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>> Pow2ModOrderKernel = GpuKernelPool.Kernels.Pow2ModOrder!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.Pow2ModOrder, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>(Pow2ModKernels.Pow2ModOrderKernelScan);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> SpecialMaxKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> SpecialMaxKernel = GpuKernelPool.Kernels.SpecialMax!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.SpecialMax, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>(PrimeOrderGpuHeuristics.EvaluateSpecialMaxCandidatesKernel);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> SmallPrimeFactorKernel
|
public static readonly Action<AcceleratorStream, Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>> SmallPrimeFactorKernel = GpuKernelPool.Kernels.SmallPrimeFactor!;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GpuKernelPool.InitOnce(ref Kernels!.SmallPrimeFactor, () =>
|
|
||||||
{
|
|
||||||
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>(SmallPrimeFactorKernels.SmallPrimeFactorKernelScan);
|
|
||||||
var kernel = KernelUtil.GetKernel(loaded);
|
|
||||||
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Stream.Dispose();
|
|
||||||
Pool.Enqueue(this);
|
Pool.Enqueue(this);
|
||||||
GpuPrimeWorkLimiter.Release();
|
GpuPrimeWorkLimiter.Release();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Collections.Concurrent;
|
|
||||||
using ILGPU;
|
using ILGPU;
|
||||||
using ILGPU.Runtime;
|
using ILGPU.Runtime;
|
||||||
|
|
||||||
@@ -24,6 +23,71 @@ public class GpuKernelPool
|
|||||||
var kernels = new KernelContainer();
|
var kernels = new KernelContainer();
|
||||||
var stream = SharedGpuContext.Accelerator.CreateStream();
|
var stream = SharedGpuContext.Accelerator.CreateStream();
|
||||||
PreloadStaticTables(kernels, stream);
|
PreloadStaticTables(kernels, stream);
|
||||||
|
|
||||||
|
InitOnce(ref kernels.Order, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>>(OrderKernels.OrderKernelScan);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>>>();
|
||||||
|
});
|
||||||
|
|
||||||
|
InitOnce(ref kernels.Pow2Mod, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>(Pow2ModKernels.Pow2ModKernelScan);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
||||||
|
});
|
||||||
|
|
||||||
|
InitOnce(ref kernels.Incremental, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>>(IncrementalKernels.IncrementalKernelScan);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
||||||
|
});
|
||||||
|
|
||||||
|
InitOnce(ref kernels.IncrementalOrder, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>(IncrementalKernels.IncrementalOrderKernelScan);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte,
|
||||||
|
ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
||||||
|
});
|
||||||
|
|
||||||
|
InitOnce(ref kernels.Pow2ModOrder, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>(Pow2ModKernels.Pow2ModOrderKernelScan);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong, ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
||||||
|
});
|
||||||
|
|
||||||
|
InitOnce(ref kernels.SpecialMax, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>(PrimeOrderGpuHeuristics.EvaluateSpecialMaxCandidatesKernel);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
||||||
|
});
|
||||||
|
|
||||||
|
InitOnce(ref kernels.SmallPrimeFactor, () =>
|
||||||
|
{
|
||||||
|
var loaded = SharedGpuContext.Accelerator.LoadAutoGroupedStreamKernel<Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>(SmallPrimeFactorKernels.SmallPrimeFactorKernelScan);
|
||||||
|
|
||||||
|
var kernel = KernelUtil.GetKernel(loaded);
|
||||||
|
|
||||||
|
return kernel.CreateLauncherDelegate<Action<AcceleratorStream, Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>>();
|
||||||
|
});
|
||||||
|
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
stream.Dispose();
|
stream.Dispose();
|
||||||
return kernels;
|
return kernels;
|
||||||
@@ -141,7 +205,7 @@ public class GpuKernelPool
|
|||||||
{
|
{
|
||||||
GpuPrimeWorkLimiter.Acquire();
|
GpuPrimeWorkLimiter.Acquire();
|
||||||
var stream = SharedGpuContext.Accelerator.CreateStream();
|
var stream = SharedGpuContext.Accelerator.CreateStream();
|
||||||
return GpuKernelLease.Rent(stream, Kernels);
|
return GpuKernelLease.Rent();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -152,8 +216,10 @@ public class GpuKernelPool
|
|||||||
{
|
{
|
||||||
var lease = Rent();
|
var lease = Rent();
|
||||||
var accelerator = SharedGpuContext.Accelerator;
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = lease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
action(accelerator, stream);
|
action(accelerator, stream);
|
||||||
|
stream.Synchronize();
|
||||||
|
stream.Dispose();
|
||||||
lease.Dispose();
|
lease.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,17 +7,23 @@ public sealed class KernelContainer
|
|||||||
{
|
{
|
||||||
// Serializes first-time initialization of kernels/buffers per accelerator.
|
// Serializes first-time initialization of kernels/buffers per accelerator.
|
||||||
public Action<AcceleratorStream, Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>>? Order;
|
public Action<AcceleratorStream, Index1D, ulong, ulong, ArrayView<GpuUInt128>, ArrayView<ulong>>? Order;
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
||||||
ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>>? Incremental;
|
ulong, ulong, ulong, ulong, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>>? Incremental;
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
||||||
ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>,
|
ResidueAutomatonArgs, ArrayView<ulong>, ArrayView1D<ulong, Stride1D.Dense>,
|
||||||
ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>,
|
ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<uint, Stride1D.Dense>,
|
||||||
ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>? Pow2Mod;
|
ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>? Pow2Mod;
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
||||||
ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>? IncrementalOrder;
|
ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>? IncrementalOrder;
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
public Action<AcceleratorStream, Index1D, ulong, GpuUInt128, GpuUInt128, byte, ulong,
|
||||||
ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>? Pow2ModOrder;
|
ResidueAutomatonArgs, ArrayView<int>, ArrayView1D<ulong, Stride1D.Dense>>? Pow2ModOrder;
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>? SmallPrimeFactor;
|
public Action<AcceleratorStream, Index1D, ulong, uint, ArrayView1D<uint, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>, int, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<int, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>? SmallPrimeFactor;
|
||||||
|
|
||||||
public Action<AcceleratorStream, Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>? SpecialMax;
|
public Action<AcceleratorStream, Index1D, ulong, ArrayView1D<ulong, Stride1D.Dense>, int, MontgomeryDivisorData, ArrayView1D<ulong, Stride1D.Dense>, ArrayView1D<ulong, Stride1D.Dense>>? SpecialMax;
|
||||||
|
|
||||||
// Optional device buffer with small divisor cycles (<= 4M). Index = divisor, value = cycle length.
|
// Optional device buffer with small divisor cycles (<= 4M). Index = divisor, value = cycle length.
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
|
|
||||||
var gpuLease = GpuKernelPool.Rent();
|
var gpuLease = GpuKernelPool.Rent();
|
||||||
var accelerator = SharedGpuContext.Accelerator;
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = gpuLease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
|
|
||||||
// Monitor.Enter(gpuLease.ExecutionLock);
|
// Monitor.Enter(gpuLease.ExecutionLock);
|
||||||
|
|
||||||
@@ -126,6 +126,7 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
out coveredRange,
|
out coveredRange,
|
||||||
out processedCount);
|
out processedCount);
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
ReturnBatchResources(resources);
|
ReturnBatchResources(resources);
|
||||||
// Monitor.Exit(gpuLease.ExecutionLock);
|
// Monitor.Exit(gpuLease.ExecutionLock);
|
||||||
gpuLease.Dispose();
|
gpuLease.Dispose();
|
||||||
@@ -502,8 +503,9 @@ public sealed class MersenneNumberDivisorByDivisorGpuTester : IMersenneNumberDiv
|
|||||||
{
|
{
|
||||||
_owner = owner;
|
_owner = owner;
|
||||||
_lease = GpuKernelPool.Rent();
|
_lease = GpuKernelPool.Rent();
|
||||||
_accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
_stream = _lease.Stream;
|
_accelerator = accelerator;
|
||||||
|
_stream = accelerator.CreateStream();
|
||||||
_capacity = Math.Max(1, owner._gpuBatchSize);
|
_capacity = Math.Max(1, owner._gpuBatchSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ public class MersenneNumberIncrementalGpuTester(GpuKernelType kernelType, bool u
|
|||||||
|
|
||||||
var gpuLease = GpuKernelPool.Rent();
|
var gpuLease = GpuKernelPool.Rent();
|
||||||
var accelerator = SharedGpuContext.Accelerator;
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = gpuLease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
int batchSize = GpuConstants.ScanBatchSize; // large batch improves GPU occupancy
|
int batchSize = GpuConstants.ScanBatchSize; // large batch improves GPU occupancy
|
||||||
UInt128 kStart = 1UL;
|
UInt128 kStart = 1UL;
|
||||||
ulong divMul = (ulong)((((UInt128)1 << 64) - UInt128.One) / exponent) + 1UL;
|
ulong divMul = (ulong)((((UInt128)1 << 64) - UInt128.One) / exponent) + 1UL;
|
||||||
byte last = lastDigit == LastDigit.Seven ? (byte)1 : (byte)0; // ILGPU kernels do not support bool parameters
|
byte last = lastDigit == LastDigit.Seven ? (byte)1 : (byte)0; // ILGPU kernels do not support bool parameters
|
||||||
|
|
||||||
var pow2Kernel = gpuLease.Pow2ModKernel;
|
var pow2Kernel = GpuKernelLease.Pow2ModKernel;
|
||||||
var incKernel = gpuLease.IncrementalKernel;
|
var incKernel = GpuKernelLease.IncrementalKernel;
|
||||||
ulong step10 = (exponent.Mod10() << 1).Mod10();
|
ulong step10 = (exponent.Mod10() << 1).Mod10();
|
||||||
ulong step8 = ((exponent & 7UL) << 1) & 7UL;
|
ulong step8 = ((exponent & 7UL) << 1) & 7UL;
|
||||||
ulong step3 = ((exponent % 3UL) << 1) % 3UL;
|
ulong step3 = ((exponent % 3UL) << 1) % 3UL;
|
||||||
@@ -121,6 +121,7 @@ public class MersenneNumberIncrementalGpuTester(GpuKernelType kernelType, bool u
|
|||||||
kStart += (UInt128)currentSize;
|
kStart += (UInt128)currentSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
ulongPool.Return(orderArray);
|
ulongPool.Return(orderArray);
|
||||||
orderBuffer.Dispose();
|
orderBuffer.Dispose();
|
||||||
gpuLease.Dispose();
|
gpuLease.Dispose();
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ public class MersenneNumberOrderGpuTester(GpuKernelType kernelType, bool useGpuO
|
|||||||
{
|
{
|
||||||
var gpuLease = GpuKernelPool.Rent();
|
var gpuLease = GpuKernelPool.Rent();
|
||||||
var accelerator = SharedGpuContext.Accelerator;
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = gpuLease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
int batchSize = GpuConstants.ScanBatchSize; // large batch improves GPU occupancy and avoids TDR
|
int batchSize = GpuConstants.ScanBatchSize; // large batch improves GPU occupancy and avoids TDR
|
||||||
UInt128 kStart = UInt128.One;
|
UInt128 kStart = UInt128.One;
|
||||||
ulong divMul = (ulong)((((UInt128)1 << 64) - UInt128.One) / exponent) + 1UL;
|
ulong divMul = (ulong)((((UInt128)1 << 64) - UInt128.One) / exponent) + 1UL;
|
||||||
@@ -19,8 +19,8 @@ public class MersenneNumberOrderGpuTester(GpuKernelType kernelType, bool useGpuO
|
|||||||
|
|
||||||
var kernel = _kernelType switch
|
var kernel = _kernelType switch
|
||||||
{
|
{
|
||||||
GpuKernelType.Pow2Mod => gpuLease.Pow2ModOrderKernel,
|
GpuKernelType.Pow2Mod => GpuKernelLease.Pow2ModOrderKernel,
|
||||||
_ => gpuLease.IncrementalOrderKernel,
|
_ => GpuKernelLease.IncrementalOrderKernel,
|
||||||
};
|
};
|
||||||
|
|
||||||
var foundBuffer = accelerator.Allocate1D<int>(1); // TODO: Replace this allocation with the pooled device buffer from GpuOrderKernelBenchmarks so repeated scans reuse the pinned staging memory instead of allocating per run.
|
var foundBuffer = accelerator.Allocate1D<int>(1); // TODO: Replace this allocation with the pooled device buffer from GpuOrderKernelBenchmarks so repeated scans reuse the pinned staging memory instead of allocating per run.
|
||||||
@@ -60,6 +60,7 @@ public class MersenneNumberOrderGpuTester(GpuKernelType kernelType, bool useGpuO
|
|||||||
kStart += (UInt128)currentSize;
|
kStart += (UInt128)currentSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
foundBuffer.Dispose();
|
foundBuffer.Dispose();
|
||||||
gpuLease.Dispose();
|
gpuLease.Dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
{
|
{
|
||||||
var lease = GpuKernelPool.Rent();
|
var lease = GpuKernelPool.Rent();
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
AcceleratorStream stream = lease.Stream;
|
AcceleratorStream stream = accelerator.CreateStream();
|
||||||
|
|
||||||
var kernel = GetPartialFactorKernel(accelerator);
|
var kernel = GetPartialFactorKernel(accelerator);
|
||||||
SmallPrimeDeviceCache cache = GetSmallPrimeDeviceCache(accelerator, stream);
|
SmallPrimeDeviceCache cache = GetSmallPrimeDeviceCache(accelerator, stream);
|
||||||
@@ -243,6 +243,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
byte fullyFactoredFlag = 0;
|
byte fullyFactoredFlag = 0;
|
||||||
fullyFactoredBuffer.View.CopyToCPU(stream, ref fullyFactoredFlag, 1);
|
fullyFactoredBuffer.View.CopyToCPU(stream, ref fullyFactoredFlag, 1);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
stream.Dispose();
|
||||||
|
|
||||||
fullyFactored = fullyFactoredFlag != 0;
|
fullyFactored = fullyFactoredFlag != 0;
|
||||||
factorCount = Math.Min(factorCount, primeTargets.Length);
|
factorCount = Math.Min(factorCount, primeTargets.Length);
|
||||||
@@ -367,7 +368,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
|
|
||||||
var lease = GpuKernelPool.Rent();
|
var lease = GpuKernelPool.Rent();
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
AcceleratorStream stream = lease.Stream;
|
AcceleratorStream stream = accelerator.CreateStream();
|
||||||
|
|
||||||
var kernel = GetOrderKernel(accelerator);
|
var kernel = GetOrderKernel(accelerator);
|
||||||
SmallPrimeDeviceCache cache = GetSmallPrimeDeviceCache(accelerator, stream);
|
SmallPrimeDeviceCache cache = GetSmallPrimeDeviceCache(accelerator, stream);
|
||||||
@@ -432,33 +433,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
resultBuffer.View.CopyToCPU(stream, ref order, 1);
|
resultBuffer.View.CopyToCPU(stream, ref order, 1);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
|
||||||
PrimeOrderKernelStatus kernelStatus = (PrimeOrderKernelStatus)status;
|
stream.Dispose();
|
||||||
if (kernelStatus == PrimeOrderKernelStatus.Fallback)
|
|
||||||
{
|
|
||||||
DisposeResources();
|
|
||||||
lease.Dispose();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kernelStatus == PrimeOrderKernelStatus.PollardOverflow)
|
|
||||||
{
|
|
||||||
DisposeResources();
|
|
||||||
lease.Dispose();
|
|
||||||
throw new InvalidOperationException("GPU Pollard Rho stack overflow; increase HeuristicStackCapacity.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kernelStatus == PrimeOrderKernelStatus.FactoringFailure)
|
|
||||||
{
|
|
||||||
order = 0UL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DisposeResources();
|
|
||||||
lease.Dispose();
|
|
||||||
|
|
||||||
return order != 0UL;
|
|
||||||
|
|
||||||
void DisposeResources()
|
|
||||||
{
|
|
||||||
phiFactorBuffer.Dispose();
|
phiFactorBuffer.Dispose();
|
||||||
phiExponentBuffer.Dispose();
|
phiExponentBuffer.Dispose();
|
||||||
workFactorBuffer.Dispose();
|
workFactorBuffer.Dispose();
|
||||||
@@ -469,7 +444,25 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
stackProductBuffer.Dispose();
|
stackProductBuffer.Dispose();
|
||||||
resultBuffer.Dispose();
|
resultBuffer.Dispose();
|
||||||
statusBuffer.Dispose();
|
statusBuffer.Dispose();
|
||||||
|
lease.Dispose();
|
||||||
|
|
||||||
|
PrimeOrderKernelStatus kernelStatus = (PrimeOrderKernelStatus)status;
|
||||||
|
if (kernelStatus == PrimeOrderKernelStatus.Fallback)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kernelStatus == PrimeOrderKernelStatus.PollardOverflow)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("GPU Pollard Rho stack overflow; increase HeuristicStackCapacity.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kernelStatus == PrimeOrderKernelStatus.FactoringFailure)
|
||||||
|
{
|
||||||
|
order = 0UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return order != 0UL;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OrderKernelLauncher GetOrderKernel(Accelerator accelerator)
|
private static OrderKernelLauncher GetOrderKernel(Accelerator accelerator)
|
||||||
@@ -528,7 +521,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
{
|
{
|
||||||
var lease = GpuKernelPool.Rent();
|
var lease = GpuKernelPool.Rent();
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
AcceleratorStream stream = lease.Stream;
|
AcceleratorStream? stream = accelerator.CreateStream();
|
||||||
var kernel = GetPow2ModKernel(accelerator);
|
var kernel = GetPow2ModKernel(accelerator);
|
||||||
// TODO: These buffers should be allocated once per accelerator and only reallocated when the new length exceeds capacity.
|
// TODO: These buffers should be allocated once per accelerator and only reallocated when the new length exceeds capacity.
|
||||||
// Modify the callers to use their own pool of buffers per accelerator, so that other threads don't use the accelerators
|
// Modify the callers to use their own pool of buffers per accelerator, so that other threads don't use the accelerators
|
||||||
@@ -546,6 +539,9 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
kernel(stream, exponents.Length, exponentBuffer.View, divisorData, remainderBuffer.View);
|
kernel(stream, exponents.Length, exponentBuffer.View, divisorData, remainderBuffer.View);
|
||||||
remainderBuffer.View.CopyToCPU(stream, ref MemoryMarshal.GetReference(results), exponents.Length);
|
remainderBuffer.View.CopyToCPU(stream, ref MemoryMarshal.GetReference(results), exponents.Length);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
|
stream = null;
|
||||||
exponentBuffer.Dispose();
|
exponentBuffer.Dispose();
|
||||||
remainderBuffer.Dispose();
|
remainderBuffer.Dispose();
|
||||||
lease.Dispose();
|
lease.Dispose();
|
||||||
@@ -553,6 +549,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Exception for {prime} and exponents: {string.Join(",", exponents.ToArray())}.");
|
Console.WriteLine($"Exception for {prime} and exponents: {string.Join(",", exponents.ToArray())}.");
|
||||||
|
stream?.Dispose();
|
||||||
exponentBuffer.Dispose();
|
exponentBuffer.Dispose();
|
||||||
remainderBuffer.Dispose();
|
remainderBuffer.Dispose();
|
||||||
lease.Dispose();
|
lease.Dispose();
|
||||||
@@ -587,7 +584,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
AcceleratorStream stream = lease.Stream;
|
AcceleratorStream stream = accelerator.CreateStream();
|
||||||
var kernel = GetPow2ModWideKernel(accelerator);
|
var kernel = GetPow2ModWideKernel(accelerator);
|
||||||
// TODO: These buffers should be allocated once per accelerator and only reallocated when the new length exceeds capacity.
|
// TODO: These buffers should be allocated once per accelerator and only reallocated when the new length exceeds capacity.
|
||||||
// Modify the callers to use their own pool of buffers per accelerator, so that other threads don't use the accelerators
|
// Modify the callers to use their own pool of buffers per accelerator, so that other threads don't use the accelerators
|
||||||
@@ -618,6 +615,7 @@ internal static partial class PrimeOrderGpuHeuristics
|
|||||||
|
|
||||||
remainderBuffer.View.CopyToCPU(stream, ref MemoryMarshal.GetReference(resultSpan), length);
|
remainderBuffer.View.CopyToCPU(stream, ref MemoryMarshal.GetReference(resultSpan), length);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
stream.Dispose();
|
||||||
|
|
||||||
for (int i = 0; i < length; i++)
|
for (int i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -806,7 +806,7 @@ public class MersenneDivisorCycles
|
|||||||
outCycles = pool.Rent(count);
|
outCycles = pool.Rent(count);
|
||||||
var lease = GpuKernelPool.Rent();
|
var lease = GpuKernelPool.Rent();
|
||||||
var accelerator = SharedGpuContext.Accelerator;
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = lease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
var loaded = accelerator.LoadAutoGroupedStreamKernel<
|
var loaded = accelerator.LoadAutoGroupedStreamKernel<
|
||||||
Index1D,
|
Index1D,
|
||||||
ArrayView1D<ulong, Stride1D.Dense>,
|
ArrayView1D<ulong, Stride1D.Dense>,
|
||||||
@@ -894,6 +894,7 @@ public class MersenneDivisorCycles
|
|||||||
start = end + 1UL;
|
start = end + 1UL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
pool.Return(divisors, clearArray: false);
|
pool.Return(divisors, clearArray: false);
|
||||||
pool.Return(outCycles, clearArray: false);
|
pool.Return(outCycles, clearArray: false);
|
||||||
|
|
||||||
|
|||||||
@@ -149,8 +149,8 @@ public sealed class MersenneNumberTester(
|
|||||||
|
|
||||||
var gpuLease = GpuKernelPool.Rent();
|
var gpuLease = GpuKernelPool.Rent();
|
||||||
var accelerator = SharedGpuContext.Accelerator;
|
var accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = gpuLease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
var orderKernel = gpuLease.OrderKernel!;
|
var orderKernel = GpuKernelLease.OrderKernel!;
|
||||||
|
|
||||||
// Guard long-running kernels by chunking the warm-up across batches.
|
// Guard long-running kernels by chunking the warm-up across batches.
|
||||||
// Reuse the same ScanBatchSize knob used for scanning.
|
// Reuse the same ScanBatchSize knob used for scanning.
|
||||||
@@ -196,6 +196,7 @@ public sealed class MersenneNumberTester(
|
|||||||
qBuffer.Dispose();
|
qBuffer.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
gpuLease.Dispose();
|
gpuLease.Dispose();
|
||||||
uInt128Pool.Return(qs);
|
uInt128Pool.Return(qs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ internal static partial class PrimeOrderCalculator
|
|||||||
|
|
||||||
var lease = GpuKernelPool.Rent();
|
var lease = GpuKernelPool.Rent();
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
var stream = lease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
KernelContainer kernels = lease.Kernels;
|
KernelContainer kernels = GpuKernelPool.Kernels;
|
||||||
|
|
||||||
ScratchBuffer scratch = GpuScratchBufferPool.Rent(accelerator, GpuSmallPrimeFactorSlots, 0);
|
ScratchBuffer scratch = GpuScratchBufferPool.Rent(accelerator, GpuSmallPrimeFactorSlots, 0);
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ internal static partial class PrimeOrderCalculator
|
|||||||
if (kernels.SmallPrimeFactorsPrimes is null) throw new NullReferenceException($"{nameof(kernels.SmallPrimeFactorsPrimes)} is null");
|
if (kernels.SmallPrimeFactorsPrimes is null) throw new NullReferenceException($"{nameof(kernels.SmallPrimeFactorsPrimes)} is null");
|
||||||
if (kernels.SmallPrimeFactorsSquares is null) throw new NullReferenceException($"{nameof(kernels.SmallPrimeFactorsSquares)} is null");
|
if (kernels.SmallPrimeFactorsSquares is null) throw new NullReferenceException($"{nameof(kernels.SmallPrimeFactorsSquares)} is null");
|
||||||
|
|
||||||
var kernel = lease.SmallPrimeFactorKernel;
|
var kernel = GpuKernelLease.SmallPrimeFactorKernel;
|
||||||
|
|
||||||
ArrayView1D<int, Stride1D.Dense> smallPrimeFactorCountSlotView = scratch.SmallPrimeFactorCountSlot.View;
|
ArrayView1D<int, Stride1D.Dense> smallPrimeFactorCountSlotView = scratch.SmallPrimeFactorCountSlot.View;
|
||||||
ArrayView1D<ulong, Stride1D.Dense> smallPrimeFactorRemainingSlotView = scratch.SmallPrimeFactorRemainingSlot.View;
|
ArrayView1D<ulong, Stride1D.Dense> smallPrimeFactorRemainingSlotView = scratch.SmallPrimeFactorRemainingSlot.View;
|
||||||
@@ -68,6 +68,7 @@ internal static partial class PrimeOrderCalculator
|
|||||||
|
|
||||||
smallPrimeFactorRemainingSlotView.CopyToCPU(stream, ref remaining, 1);
|
smallPrimeFactorRemainingSlotView.CopyToCPU(stream, ref remaining, 1);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
stream.Dispose();
|
||||||
|
|
||||||
for (int i = 0; i < factorCount; i++)
|
for (int i = 0; i < factorCount; i++)
|
||||||
{
|
{
|
||||||
@@ -103,14 +104,14 @@ internal static partial class PrimeOrderCalculator
|
|||||||
GpuKernelLease lease = GpuKernelPool.Rent();
|
GpuKernelLease lease = GpuKernelPool.Rent();
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
|
|
||||||
var stream = lease.Stream;
|
var stream = accelerator.CreateStream();
|
||||||
|
|
||||||
ScratchBuffer scratch = GpuScratchBufferPool.Rent(accelerator, 0, factorCount);
|
ScratchBuffer scratch = GpuScratchBufferPool.Rent(accelerator, 0, factorCount);
|
||||||
|
|
||||||
ArrayView1D<ulong, Stride1D.Dense> specialMaxFactorsView = scratch.SpecialMaxFactors.View;
|
ArrayView1D<ulong, Stride1D.Dense> specialMaxFactorsView = scratch.SpecialMaxFactors.View;
|
||||||
specialMaxFactorsView.SubView(0, factorCount).CopyFromCPU(stream, ref MemoryMarshal.GetReference(factorSpan), factorCount);
|
specialMaxFactorsView.SubView(0, factorCount).CopyFromCPU(stream, ref MemoryMarshal.GetReference(factorSpan), factorCount);
|
||||||
|
|
||||||
var kernel = lease.SpecialMaxKernel;
|
var kernel = GpuKernelLease.SpecialMaxKernel;
|
||||||
|
|
||||||
ArrayView1D<ulong, Stride1D.Dense> specialMaxResultView = scratch.SpecialMaxResult.View;
|
ArrayView1D<ulong, Stride1D.Dense> specialMaxResultView = scratch.SpecialMaxResult.View;
|
||||||
|
|
||||||
@@ -128,6 +129,7 @@ internal static partial class PrimeOrderCalculator
|
|||||||
// specialMaxResultView.CopyToCPU(stream, ref result, 1);
|
// specialMaxResultView.CopyToCPU(stream, ref result, 1);
|
||||||
specialMaxResultView.CopyToCPU(stream, in result);
|
specialMaxResultView.CopyToCPU(stream, in result);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
stream.Dispose();
|
||||||
|
|
||||||
// stream.Synchronize();
|
// stream.Synchronize();
|
||||||
// return result != 0;
|
// return result != 0;
|
||||||
|
|||||||
@@ -464,7 +464,7 @@ public static partial class ULongExtensions
|
|||||||
GpuKernelLease lease = GpuKernelPool.Rent();
|
GpuKernelLease lease = GpuKernelPool.Rent();
|
||||||
|
|
||||||
Accelerator accelerator = SharedGpuContext.Accelerator;
|
Accelerator accelerator = SharedGpuContext.Accelerator;
|
||||||
AcceleratorStream stream = lease.Stream;
|
AcceleratorStream stream = accelerator.CreateStream();
|
||||||
var kernelGroup = Kernel;
|
var kernelGroup = Kernel;
|
||||||
|
|
||||||
EnsureCapacity();
|
EnsureCapacity();
|
||||||
@@ -481,6 +481,7 @@ public static partial class ULongExtensions
|
|||||||
resultBuffer.View.CopyToCPU(stream, ref result, 1);
|
resultBuffer.View.CopyToCPU(stream, ref result, 1);
|
||||||
stream.Synchronize();
|
stream.Synchronize();
|
||||||
|
|
||||||
|
stream.Dispose();
|
||||||
resultBuffer.Dispose();
|
resultBuffer.Dispose();
|
||||||
exponentBuffer.Dispose();
|
exponentBuffer.Dispose();
|
||||||
lease.Dispose();
|
lease.Dispose();
|
||||||
|
|||||||
Reference in new issue
Block a user