Added a new configurable round primorial adjustment system.
The new parameter -gensieveroundpercentage (defaults to 30) determines how much time should be spent generating the sieve. The round primorial is then adjusted so that the desired amount of time is spent generating the sieve.master
parent
eabc422f5a
commit
bd96b81cb0
12
src/main.cpp
12
src/main.cpp
|
@ -4577,7 +4577,7 @@ void static BitcoinMiner(CWallet *pwallet)
|
|||
static const unsigned int nPrimorialHashFactor = 7;
|
||||
unsigned int nPrimorialMultiplier = nPrimorialHashFactor;
|
||||
int64 nTimeExpected = 0; // time expected to prime chain (micro-second)
|
||||
int64 nTimeExpectedPrev = 0; // time expected to prime chain last time
|
||||
int64 nSieveGenTime = 0; // how many milliseconds sieve generation took
|
||||
bool fIncrementPrimorial = true; // increase or decrease primorial factor
|
||||
|
||||
try { loop {
|
||||
|
@ -4667,7 +4667,7 @@ void static BitcoinMiner(CWallet *pwallet)
|
|||
|
||||
// Primecoin: mine for prime chain
|
||||
unsigned int nProbableChainLength;
|
||||
if (MineProbablePrimeChain(*pblock, mpzFixedMultiplier, fNewBlock, nTriedMultiplier, nProbableChainLength, nTests, nPrimesHit, nChainsHit, mpzHash, nPrimorialMultiplier))
|
||||
if (MineProbablePrimeChain(*pblock, mpzFixedMultiplier, fNewBlock, nTriedMultiplier, nProbableChainLength, nTests, nPrimesHit, nChainsHit, mpzHash, nPrimorialMultiplier, nSieveGenTime))
|
||||
{
|
||||
SetThreadPriority(THREAD_PRIORITY_NORMAL);
|
||||
CheckWork(pblock, *pwalletMain, reservekey);
|
||||
|
@ -4784,9 +4784,11 @@ void static BitcoinMiner(CWallet *pwallet)
|
|||
|
||||
// Primecoin: reset sieve+primality round timer
|
||||
nPrimeTimerStart = GetTimeMicros();
|
||||
if (nTimeExpected > nTimeExpectedPrev)
|
||||
fIncrementPrimorial = !fIncrementPrimorial;
|
||||
nTimeExpectedPrev = nTimeExpected;
|
||||
// Adjust primorial so that sieve generation takes a set percentage of round time
|
||||
if (nSieveGenTime >= nGenSieveRoundPercentage * nRoundTime / 100)
|
||||
fIncrementPrimorial = true;
|
||||
else
|
||||
fIncrementPrimorial = false;
|
||||
|
||||
// Primecoin: primorial always needs to be incremented if only 0 primes were found
|
||||
if (nRoundPrimesHit == 0)
|
||||
|
|
|
@ -10,11 +10,14 @@ std::vector<unsigned int> vPrimes;
|
|||
std::vector<unsigned int> vTwoInverses;
|
||||
unsigned int nSieveSize = nDefaultSieveSize;
|
||||
unsigned int nSievePercentage = nDefaultSievePercentage;
|
||||
unsigned int nGenSieveRoundPercentage = nDefaultGenSieveRoundPercentage;
|
||||
|
||||
static unsigned int int_invert(unsigned int a, unsigned int nPrime);
|
||||
|
||||
void GeneratePrimeTable()
|
||||
{
|
||||
nGenSieveRoundPercentage = (unsigned int)GetArg("-gensieveroundpercentage", nDefaultGenSieveRoundPercentage);
|
||||
nGenSieveRoundPercentage = std::max(std::min(nGenSieveRoundPercentage, nMaxGenSieveRoundPercentage), nMinGenSieveRoundPercentage);
|
||||
nSievePercentage = (unsigned int)GetArg("-sievepercentage", nDefaultSievePercentage);
|
||||
nSievePercentage = std::max(std::min(nSievePercentage, nMaxSievePercentage), nMinSievePercentage);
|
||||
nSieveSize = (unsigned int)GetArg("-sievesize", nDefaultSieveSize);
|
||||
|
@ -707,7 +710,7 @@ static bool ProbablePrimeChainTestFast(const mpz_class& mpzPrimeChainOrigin, CPr
|
|||
boost::thread_specific_ptr<CSieveOfEratosthenes> psieve;
|
||||
|
||||
// Mine probable prime chain of form: n = h * p# +/- 1
|
||||
bool MineProbablePrimeChain(CBlock& block, mpz_class& mpzFixedMultiplier, bool& fNewBlock, unsigned int& nTriedMultiplier, unsigned int& nProbableChainLength, unsigned int& nTests, unsigned int& nPrimesHit, unsigned int& nChainsHit, mpz_class& mpzHash, unsigned int nPrimorialMultiplier)
|
||||
bool MineProbablePrimeChain(CBlock& block, mpz_class& mpzFixedMultiplier, bool& fNewBlock, unsigned int& nTriedMultiplier, unsigned int& nProbableChainLength, unsigned int& nTests, unsigned int& nPrimesHit, unsigned int& nChainsHit, mpz_class& mpzHash, unsigned int nPrimorialMultiplier, int64& nSieveGenTime)
|
||||
{
|
||||
CSieveOfEratosthenes *lpsieve;
|
||||
nProbableChainLength = 0;
|
||||
|
@ -731,8 +734,9 @@ bool MineProbablePrimeChain(CBlock& block, mpz_class& mpzFixedMultiplier, bool&
|
|||
nStart = GetTimeMicros();
|
||||
lpsieve = new CSieveOfEratosthenes(nSieveSize, nBits, mpzHash, mpzFixedMultiplier, pindexPrev);
|
||||
while (lpsieve->Weave() && pindexPrev == pindexBest);
|
||||
nSieveGenTime = GetTimeMicros() - nStart;
|
||||
if (fDebug && GetBoolArg("-printmining"))
|
||||
printf("MineProbablePrimeChain() : new sieve (%u/%u@%u%%) ready in %uus\n", lpsieve->GetCandidateCount(), nSieveSize, lpsieve->GetProgressPercentage(), (unsigned int) (GetTimeMicros() - nStart));
|
||||
printf("MineProbablePrimeChain() : new sieve (%u/%u@%u%%) ready in %uus\n", lpsieve->GetCandidateCount(), nSieveSize, lpsieve->GetProgressPercentage(), (unsigned int) nSieveGenTime);
|
||||
psieve.reset(lpsieve);
|
||||
return false; // sieve generation takes time so return now
|
||||
}
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
#include <gmpxx.h>
|
||||
#include <bitset>
|
||||
|
||||
static const unsigned int nMaxGenSieveRoundPercentage = 100;
|
||||
static const unsigned int nDefaultGenSieveRoundPercentage = 30;
|
||||
static const unsigned int nMinGenSieveRoundPercentage = 1;
|
||||
extern unsigned int nGenSieveRoundPercentage;
|
||||
static const unsigned int nMaxSievePercentage = 100;
|
||||
static const unsigned int nDefaultSievePercentage = 10;
|
||||
static const unsigned int nMinSievePercentage = 1;
|
||||
|
@ -78,7 +82,7 @@ bool TargetGetMint(unsigned int nBits, uint64& nMint);
|
|||
bool TargetGetNext(unsigned int nBits, int64 nInterval, int64 nTargetSpacing, int64 nActualSpacing, unsigned int& nBitsNext);
|
||||
|
||||
// Mine probable prime chain of form: n = h * p# +/- 1
|
||||
bool MineProbablePrimeChain(CBlock& block, mpz_class& mpzFixedMultiplier, bool& fNewBlock, unsigned int& nTriedMultiplier, unsigned int& nProbableChainLength, unsigned int& nTests, unsigned int& nPrimesHit, unsigned int& nChainsHit, mpz_class& mpzHash, unsigned int nPrimorialMultiplier);
|
||||
bool MineProbablePrimeChain(CBlock& block, mpz_class& mpzFixedMultiplier, bool& fNewBlock, unsigned int& nTriedMultiplier, unsigned int& nProbableChainLength, unsigned int& nTests, unsigned int& nPrimesHit, unsigned int& nChainsHit, mpz_class& mpzHash, unsigned int nPrimorialMultiplier, int64& nSieveGenTime);
|
||||
|
||||
// Check prime proof-of-work
|
||||
enum // prime chain type
|
||||
|
|
|
@ -74,6 +74,7 @@ Value getchainspermin(const Array& params, bool fHelp)
|
|||
extern Value getdifficulty(const Array& params, bool fHelp);
|
||||
extern unsigned int nSieveSize;
|
||||
extern unsigned int nSievePercentage;
|
||||
extern unsigned int nGenSieveRoundPercentage;
|
||||
|
||||
|
||||
Value getmininginfo(const Array& params, bool fHelp)
|
||||
|
@ -92,6 +93,7 @@ Value getmininginfo(const Array& params, bool fHelp)
|
|||
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
||||
obj.push_back(Pair("generate", GetBoolArg("-gen")));
|
||||
obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1)));
|
||||
obj.push_back(Pair("gensieveroundpercentage",(int)nGenSieveRoundPercentage));
|
||||
obj.push_back(Pair("primespersec", getprimespersec(params, false)));
|
||||
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
|
||||
obj.push_back(Pair("sievepercentage",(int)nSievePercentage));
|
||||
|
|
Loading…
Reference in New Issue