summaryrefslogtreecommitdiffstats
path: root/xmrstak/backend/nvidia/minethd.cpp
diff options
context:
space:
mode:
authorfireice-uk <fireice-uk@users.noreply.github.com>2017-10-23 19:14:20 +0100
committerGitHub <noreply@github.com>2017-10-23 19:14:20 +0100
commit7030f1b3ab2ff9670c5251919d00387095cf71f2 (patch)
tree40c19dd7735f372aa194f1399aed4a30d81a1c24 /xmrstak/backend/nvidia/minethd.cpp
parenta7116b999efae0b303cd2474bbea3c918a4fe8b3 (diff)
parent14ceeaca2ea501d1c4ad9ba90655cc3204cd27c3 (diff)
downloadxmr-stak-7030f1b3ab2ff9670c5251919d00387095cf71f2.zip
xmr-stak-7030f1b3ab2ff9670c5251919d00387095cf71f2.tar.gz
Merge pull request #45 from fireice-uk/topic-nonce-alloc
Implement pool-controlled nonce allocation
Diffstat (limited to 'xmrstak/backend/nvidia/minethd.cpp')
-rw-r--r--xmrstak/backend/nvidia/minethd.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/xmrstak/backend/nvidia/minethd.cpp b/xmrstak/backend/nvidia/minethd.cpp
index fcd01cd..7549c86 100644
--- a/xmrstak/backend/nvidia/minethd.cpp
+++ b/xmrstak/backend/nvidia/minethd.cpp
@@ -192,11 +192,10 @@ void minethd::consume_work()
void minethd::work_main()
{
uint64_t iCount = 0;
- uint32_t iNonce;
cryptonight_ctx* cpu_ctx;
cpu_ctx = cpu::minethd::minethd_alloc_ctx();
cn_hash_fun hash_fun = cpu::minethd::func_selector(::jconf::inst()->HaveHardwareAes(), true /*bNoPrefetch*/);
- uint32_t* piNonce = (uint32_t*)(oWork.bWorkBlob + 39);
+ uint32_t iNonce;
globalStates::inst().iConsumeCnt++;
@@ -222,16 +221,23 @@ void minethd::work_main()
}
cryptonight_extra_cpu_set_data(&ctx, oWork.bWorkBlob, oWork.iWorkSize);
- if(oWork.bNiceHash)
- iNonce = calc_nicehash_nonce(*piNonce, oWork.iResumeCnt);
- else
- iNonce = calc_start_nonce(oWork.iResumeCnt);
+
+ uint32_t h_per_round = ctx.device_blocks * ctx.device_threads;
+ size_t round_ctr = 0;
assert(sizeof(job_result::sJobID) == sizeof(pool_job::sJobID));
+ if(oWork.bNiceHash)
+ iNonce = *(uint32_t*)(oWork.bWorkBlob + 39);
+
while(globalStates::inst().iGlobalJobNo.load(std::memory_order_relaxed) == iJobNo)
{
-
+ //Allocate a new nonce every 16 rounds
+ if((round_ctr++ & 0xF) == 0)
+ {
+ globalStates::inst().calc_start_nonce(iNonce, oWork.bNiceHash, h_per_round * 16);
+ }
+
uint32_t foundNonce[10];
uint32_t foundCount;
@@ -257,8 +263,8 @@ void minethd::work_main()
executor::inst()->log_result_error("NVIDIA Invalid Result");
}
- iCount += ctx.device_blocks * ctx.device_threads;
- iNonce += ctx.device_blocks * ctx.device_threads;
+ iCount += h_per_round;
+ iNonce += h_per_round;
using namespace std::chrono;
uint64_t iStamp = time_point_cast<milliseconds>(high_resolution_clock::now()).time_since_epoch().count();
OpenPOWER on IntegriCloud