Commit a2dd410e362116a12ac5609da77abb3a5ee1b736

Con Kolivas 2011-07-17T19:33:53

Make sure not to try and submit work for nonces higher than already submitted in current work item. This reduces rejects substantially.

diff --git a/findnonce.c b/findnonce.c
index de9890e..06882b5 100644
--- a/findnonce.c
+++ b/findnonce.c
@@ -157,7 +157,6 @@ static void *postcalc_hash(void *userdata)
 	cl_uint A, B, C, D, E, F, G, H;
 	cl_uint W[16];
 	cl_uint nonce;
-	cl_uint best_g;
 	uint32_t end;
 	int entry = 0;
 
@@ -172,7 +171,6 @@ cycle:
 	if (entry == MAXBUFFERS)
 		goto out;
 
-	best_g = ~0;
 	end = start + 1026;
 
 	for (nonce = start; nonce != end; nonce+=1) {
@@ -206,20 +204,21 @@ cycle:
 		FR(48); PFR(56);
 
 		if (unlikely(H == 0xA41F32E7)) {
-			if (unlikely(submit_nonce(thr, work, nonce) == false)) {
-				applog(LOG_ERR, "Failed to submit work, exiting");
-				break;
-			}
 
 			G += 0x1f83d9ab;
 			G = ByteReverse(G);
 
-			if (G < best_g)
-				best_g = G;
+			if (G < thr->best_g) {
+				if (unlikely(submit_nonce(thr, work, nonce) == false)) {
+					applog(LOG_ERR, "Failed to submit work, exiting");
+					break;
+				}
+				thr->best_g = G;
+			}
 		}
 	}
 
-	if (unlikely(best_g == ~0)) {
+	if (unlikely(thr->best_g == ~0)) {
 		if (opt_debug)
 			applog(LOG_DEBUG, "No best_g found! Error in OpenCL code?");
 		hw_errors++;
diff --git a/main.c b/main.c
index eb111fe..1c9268c 100644
--- a/main.c
+++ b/main.c
@@ -1727,6 +1727,7 @@ static void *gpuminer_thread(void *userdata)
 					"gpu mining thread %d", mythr->id);
 				goto out;
 			}
+			mythr->best_g = ~0;
 			mythr->cgpu->getworks++;
 			work->thr_id = thr_id;
 			requested = false;
diff --git a/miner.h b/miner.h
index 53a537e..358590f 100644
--- a/miner.h
+++ b/miner.h
@@ -145,6 +145,7 @@ struct thr_info {
 	struct thread_q	*q;
 	struct cgpu_info *cgpu;
 	struct timeval last;
+	cl_uint best_g;
 };
 
 static inline uint32_t swab32(uint32_t v)