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
mikaelh 2013-07-25 20:22:19 +03:00
parent eabc422f5a
commit bd96b81cb0
4 changed files with 20 additions and 8 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -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

View File

@ -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));