Browse Source

Merge pull request #170 from luke-jr/bugfix_icarus_speed

Bugfix: Calculate Icarus timeout-exhausted nonce count correctly
nfactor-troky
Con Kolivas 13 years ago
parent
commit
26b4b011d8
  1. 27
      driver-icarus.c

27
driver-icarus.c

@ -286,7 +286,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
char *ob_hex, *nonce_hex; char *ob_hex, *nonce_hex;
uint32_t nonce; uint32_t nonce;
uint32_t hash_count; uint32_t hash_count;
time_t t = 0; struct timeval tv_start, tv_end, diff;
icarus = thr->cgpu; icarus = thr->cgpu;
fd = icarus->device_fd; fd = icarus->device_fd;
@ -299,13 +299,15 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
#ifndef WIN32 #ifndef WIN32
tcflush(fd, TCOFLUSH); tcflush(fd, TCOFLUSH);
#endif #endif
gettimeofday(&tv_start, NULL);
ret = icarus_write(fd, ob_bin, sizeof(ob_bin)); ret = icarus_write(fd, ob_bin, sizeof(ob_bin));
if (ret) if (ret)
return 0; /* This should never happen */ return 0; /* This should never happen */
ob_hex = bin2hex(ob_bin, sizeof(ob_bin)); ob_hex = bin2hex(ob_bin, sizeof(ob_bin));
if (ob_hex) { if (ob_hex) {
t = time(NULL);
applog(LOG_DEBUG, "Icarus %s send: %s", applog(LOG_DEBUG, "Icarus %s send: %s",
icarus->device_id, ob_hex); icarus->device_id, ob_hex);
free(ob_hex); free(ob_hex);
@ -315,23 +317,32 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
memset(nonce_bin, 0, sizeof(nonce_bin)); memset(nonce_bin, 0, sizeof(nonce_bin));
ret = icarus_gets(nonce_bin, sizeof(nonce_bin), fd, wr); ret = icarus_gets(nonce_bin, sizeof(nonce_bin), fd, wr);
gettimeofday(&tv_end, NULL);
timeval_subtract(&diff, &tv_end, &tv_start);
nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin)); nonce_hex = bin2hex(nonce_bin, sizeof(nonce_bin));
if (nonce_hex) { if (nonce_hex) {
t = time(NULL) - t; applog(LOG_DEBUG, "Icarus %d returned (in %d.%06d seconds): %s",
applog(LOG_DEBUG, "Icarus %d return (elapse %d seconds): %s", icarus->device_id, diff.tv_sec, diff.tv_usec, nonce_hex);
icarus->device_id, t, nonce_hex);
free(nonce_hex); free(nonce_hex);
} }
memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin)); memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin));
if (nonce == 0 && ret) work->blk.nonce = 0xffffffff;
if (nonce == 0 && ret) {
if (unlikely(diff.tv_sec > 12 || (diff.tv_sec == 11 && diff.tv_usec > 300067)))
return 0xffffffff; return 0xffffffff;
// Approximately how much of the nonce Icarus scans in 1 second...
// 0x16a7a561 would be if it was exactly 380 MH/s
// 0x168b7b4b was the average over a 201-sample period based on time to find actual shares
return (0x168b7b4b * diff.tv_sec) + (0x17a * diff.tv_usec);
}
#ifndef __BIG_ENDIAN__ #ifndef __BIG_ENDIAN__
nonce = swab32(nonce); nonce = swab32(nonce);
#endif #endif
work->blk.nonce = 0xffffffff;
submit_nonce(thr, work, nonce); submit_nonce(thr, work, nonce);
hash_count = (nonce & 0x7fffffff); hash_count = (nonce & 0x7fffffff);
@ -344,6 +355,8 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work,
hash_count <<= 1; hash_count <<= 1;
} }
applog(LOG_DEBUG, "0x%x hashes in %d.%06d seconds", hash_count, diff.tv_sec, diff.tv_usec);
return hash_count; return hash_count;
} }

Loading…
Cancel
Save