From 80b2d6f1c1db18a5adad2b017e5cc97d7bd91989 Mon Sep 17 00:00:00 2001 From: tcatm Date: Tue, 8 Feb 2011 13:52:47 +0100 Subject: [PATCH] measure effective hashrate --- findnonce.c | 4 +++- findnonce.h | 2 +- miner.c | 39 ++++++++++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/findnonce.c b/findnonce.c index 490821b..2ed954a 100644 --- a/findnonce.c +++ b/findnonce.c @@ -132,7 +132,7 @@ void precalc_hash(dev_blk_ctx *blk, uint32_t *state, uint32_t *data) { R(E, F, G, H, A, B, C, D, P(u+4), SHA256_K[u+4]); \ R(D, E, F, G, H, A, B, C, P(u+5), SHA256_K[u+5]) -uint32_t postcalc_hash(dev_blk_ctx *blk, struct work_t *work, uint32_t start, uint32_t end, uint32_t *best_nonce, int pool_mode) { +uint32_t postcalc_hash(dev_blk_ctx *blk, struct work_t *work, uint32_t start, uint32_t end, uint32_t *best_nonce, int pool_mode, unsigned int *h0count) { cl_uint A, B, C, D, E, F, G, H; cl_uint W[16]; cl_uint nonce; @@ -169,6 +169,8 @@ uint32_t postcalc_hash(dev_blk_ctx *blk, struct work_t *work, uint32_t start, ui FR(48); PFR(56); if(H == 0xA41F32E7) { + (*h0count)++; + if (pool_mode) submit_nonce(work, nonce); diff --git a/findnonce.h b/findnonce.h index c275e79..eda8de5 100644 --- a/findnonce.h +++ b/findnonce.h @@ -31,5 +31,5 @@ struct work_t { }; extern void precalc_hash(dev_blk_ctx *blk, uint32_t *state, uint32_t *data); -extern uint32_t postcalc_hash(dev_blk_ctx *blk, struct work_t *work, uint32_t start, uint32_t end, uint32_t *best_nonce, int pool_mode); +extern uint32_t postcalc_hash(dev_blk_ctx *blk, struct work_t *work, uint32_t start, uint32_t end, uint32_t *best_nonce, int pool_mode, unsigned int *h0count); extern void submit_nonce(struct work_t *work, uint32_t nonce); diff --git a/miner.c b/miner.c index 0e0a3ba..6bf777f 100644 --- a/miner.c +++ b/miner.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "miner.h" #include "findnonce.h" @@ -193,24 +194,31 @@ out: free(hexstr); } +double time2secs(struct timeval *tv_start) { + struct timeval tv_end, diff; + double secs; + + gettimeofday(&tv_end, NULL); + timeval_subtract(&diff, &tv_end, tv_start); + secs = (double)diff.tv_sec + ((double)diff.tv_usec / 1000000.0); + + return secs; +} + static void hashmeter(int thr_id, struct timeval *tv_start, unsigned long hashes_done) { - struct timeval tv_end, diff; double khashes, secs; - gettimeofday(&tv_end, NULL); - - timeval_subtract(&diff, &tv_end, tv_start); + secs = time2secs(tv_start); khashes = hashes_done / 1000.0; - secs = (double)diff.tv_sec + ((double)diff.tv_usec / 1000000.0); hashrates[thr_id] = khashes / secs; } static void print_hashmeter(double hashrate, char *rates) { - printf("\r \rHashMeter: %.2f Mhash/sec (%s)", hashrate / 1000, rates); + printf("\r \rHashMeter: %.2f Mhash/sec (%s)", hashrate, rates); fflush(stdout); } @@ -280,6 +288,11 @@ static void *miner_thread(void *thr_id_int) unsigned long hashes_done; hashes_done = 0; + unsigned int h0count = 0; + struct timeval tv_start0; + + gettimeofday(&tv_start0, NULL); + while (1) { struct timeval tv_start; bool rc; @@ -317,9 +330,6 @@ static void *miner_thread(void *thr_id_int) need_work = false; } - if (hashes_done != 0) - hashmeter(thr_id, &tv_start, hashes_done); - gettimeofday(&tv_start, NULL); int threads = 102400 * 4; @@ -350,7 +360,7 @@ static void *miner_thread(void *thr_id_int) if(res[j]) { uint32_t start = (work[res_frame].res_nonce + j)<<10; uint32_t my_g, my_nonce; - my_g = postcalc_hash(&work[res_frame].blk, &work[res_frame], start, start + 1024, &my_nonce, opt_pool); + my_g = postcalc_hash(&work[res_frame].blk, &work[res_frame], start, start + 1026, &my_nonce, opt_pool, &h0count); if (!opt_pool) { if (opt_debug) @@ -381,6 +391,13 @@ static void *miner_thread(void *thr_id_int) need_work = true; } + + } + + if (h0count != 0) { + double secs; + secs = time2secs(&tv_start0); + hashrates[thr_id] = h0count * pow(2, 256) / (secs * 1e6 * (pow(2, 224) - 1.0)); } status = clEnqueueReadBuffer(clState->commandQueue, clState->outputBuffer, CL_TRUE, 0, @@ -541,7 +558,7 @@ int main (int argc, char *argv[]) for(i = 0; i < nDevs; i++) { hashrate += hashrates[i]; - sprintf(buffer, "%.02f", hashrates[i] / 1000); + sprintf(buffer, "%.02f", hashrates[i]); strcat(rates, buffer); if (i != nDevs-1) strcat(rates, " ");