Version 2.1.2

- Do not submit work that is known to be stale
- Allow miner threads to ask for new work if the current one is at least
  45 seconds old and long polling is enabled
- Refresh work when long polling times out
- Modify x86-64 code to make it compatible with older versions of
  binutils
This commit is contained in:
pooler 2012-01-26 14:31:07 +01:00
parent 1628975469
commit d26b0d8b81
7 changed files with 46 additions and 30 deletions

9
NEWS
View file

@ -1,3 +1,12 @@
Version 2.1.2 - Jan 26, 2012
- Do not submit work that is known to be stale
- Allow miner threads to ask for new work if the current one is at least
45 seconds old and long polling is enabled
- Refresh work when long polling times out
- Fix minor speed regression
- Modify x86-64 code to make it compatible with older versions of binutils
Version 2.1.1 - Jan 20, 2012
- Handle network errors properly

View file

@ -1,4 +1,4 @@
AC_INIT([cpuminer], [2.1.1])
AC_INIT([cpuminer], [2.1.2])
AC_PREREQ(2.52)
AC_CANONICAL_SYSTEM

View file

@ -33,6 +33,7 @@
#define PROGRAM_NAME "minerd"
#define DEF_RPC_URL "http://127.0.0.1:9332/"
#define LP_SCANTIME 60
#ifdef __linux /* Linux specific policy and affinity management */
#include <sched.h>
@ -279,6 +280,10 @@ static bool submit_upstream_work(CURL *curl, const struct work *work)
int i;
bool rc = false;
/* pass if the previous hash is not the current previous hash */
if (memcmp(work->data + 4, g_work.data + 4, 32))
return true;
/* build hex string */
hexstr = bin2hex(work->data, sizeof(work->data));
if (unlikely(!hexstr)) {
@ -548,7 +553,7 @@ static void *miner_thread(void *userdata)
/* obtain new work from internal workio thread */
pthread_mutex_lock(&g_work_lock);
if (!have_longpoll || time(NULL) >= g_work_time + opt_scantime) {
if (!have_longpoll || time(NULL) >= g_work_time + LP_SCANTIME*3/4) {
if (unlikely(!get_work(mythr, &g_work))) {
applog(LOG_ERR, "work retrieval failed, exiting "
"mining thread %d", mythr->id);
@ -567,8 +572,9 @@ static void *miner_thread(void *userdata)
work_restart[thr_id].restart = 0;
/* adjust max_nonce to meet target scan time */
max64 = (g_work_time + opt_scantime - time(NULL)) *
(int64_t)thr_hashrates[thr_id];
max64 = g_work_time + (have_longpoll ? LP_SCANTIME : opt_scantime)
- time(NULL);
max64 *= thr_hashrates[thr_id];
if (max64 <= 0)
max64 = 0xfffLL;
if (next_nonce + max64 > 0xfffffffeLL)
@ -676,12 +682,14 @@ static void *longpoll_thread(void *userdata)
}
pthread_mutex_unlock(&g_work_lock);
json_decref(val);
} else if (err != CURLE_OPERATION_TIMEDOUT) {
} else {
pthread_mutex_lock(&g_work_lock);
g_work_time -= opt_scantime;
g_work_time -= LP_SCANTIME;
pthread_mutex_unlock(&g_work_lock);
restart_threads();
sleep(opt_fail_pause);
if (err != CURLE_OPERATION_TIMEDOUT) {
sleep(opt_fail_pause);
}
}
}

View file

@ -137,7 +137,6 @@ timeval_subtract (struct timeval *result, struct timeval *x, struct timeval *y);
extern bool fulltest(const unsigned char *hash, const unsigned char *target);
extern int opt_scantime;
extern int opt_timeout;
extern bool want_longpoll;
extern bool have_longpoll;

View file

@ -1693,22 +1693,23 @@ scrypt_core_3way_loop1:
cmpq %rax, %rbp
jne scrypt_core_3way_loop1
movq $1024, %rax
movq $1024, %r8
.align 16
scrypt_core_3way_loop2:
movl 64(%rsp), %ebp
andl $1023, %ebp
leal (%ebp, %ebp, 2), %ebp
shll $7, %ebp
leaq (%rbp, %rbp, 2), %rbp
movl 128+64(%rsp), %ebx
shll $7, %ebp
movl 256+64(%rsp), %eax
andl $1023, %ebx
leal (%ebx, %ebx, 2), %ebx
leaq (%rbx, %rbx, 2), %rbx
shll $7, %ebx
shll $7, %eax
addl $128, %ebx
movl 256+64(%rsp), %r8d
andl $1023, %r8d
leal (%r8d, %r8d, 2), %r8d
shll $7, %r8d
addl $256, %r8d
andl $131071, %eax
leaq (%rax, %rax, 2), %rax
addl $256, %eax
movdqa 0(%rsp), %xmm0
movdqa 16(%rsp), %xmm1
movdqa 32(%rsp), %xmm2
@ -1729,10 +1730,10 @@ scrypt_core_3way_loop2:
pxor 16(%rcx, %rbx), %xmm9
pxor 32(%rcx, %rbx), %xmm10
pxor 48(%rcx, %rbx), %xmm11
pxor 0(%rcx, %r8), %xmm12
pxor 16(%rcx, %r8), %xmm13
pxor 32(%rcx, %r8), %xmm14
pxor 48(%rcx, %r8), %xmm15
pxor 0(%rcx, %rax), %xmm12
pxor 16(%rcx, %rax), %xmm13
pxor 32(%rcx, %rax), %xmm14
pxor 48(%rcx, %rax), %xmm15
pxor 64(%rsp), %xmm0
pxor 80(%rsp), %xmm1
@ -1792,10 +1793,10 @@ scrypt_core_3way_loop2:
pxor 80(%rcx, %rbx), %xmm9
pxor 96(%rcx, %rbx), %xmm10
pxor 112(%rcx, %rbx), %xmm11
pxor 64(%rcx, %r8), %xmm12
pxor 80(%rcx, %r8), %xmm13
pxor 96(%rcx, %r8), %xmm14
pxor 112(%rcx, %r8), %xmm15
pxor 64(%rcx, %rax), %xmm12
pxor 80(%rcx, %rax), %xmm13
pxor 96(%rcx, %rax), %xmm14
pxor 112(%rcx, %rax), %xmm15
pxor 64(%rsp), %xmm0
pxor 80(%rsp), %xmm1
pxor 96(%rsp), %xmm2
@ -1846,7 +1847,7 @@ scrypt_core_3way_loop2:
movdqa %xmm14, 256+96(%rsp)
movdqa %xmm15, 256+112(%rsp)
subq $1, %rax
subq $1, %r8
ja scrypt_core_3way_loop2
scrypt_shuffle %rsp, 0, %rdi, 0

View file

@ -542,7 +542,7 @@ int scanhash_scrypt(int thr_id, unsigned char *pdata, unsigned char *scratchbuf,
if (throughput >= 3 && n <= max_nonce) {
data3[19] = n++;
scrypt_1024_1_1_256_sp_3way(data, data2, data3, hash, hash2, hash3, scratchbuf);
if (hash3[7] < Htarg || hash3[7] == Htarg && test_hash(hash3, (uint32_t *)ptarget)) {
if (hash3[7] < Htarg || (hash3[7] == Htarg && test_hash(hash3, (uint32_t *)ptarget))) {
be32enc(&((uint32_t *)pdata)[19], data3[19]);
*next_nonce = n;
*hashes_done = n - first_nonce;
@ -551,7 +551,7 @@ int scanhash_scrypt(int thr_id, unsigned char *pdata, unsigned char *scratchbuf,
} else {
scrypt_1024_1_1_256_sp_2way(data, data2, hash, hash2, scratchbuf);
}
if (hash2[7] < Htarg || hash2[7] == Htarg && test_hash(hash2, (uint32_t *)ptarget)) {
if (hash2[7] < Htarg || (hash2[7] == Htarg && test_hash(hash2, (uint32_t *)ptarget))) {
be32enc(&((uint32_t *)pdata)[19], data2[19]);
*next_nonce = n;
*hashes_done = n - first_nonce;
@ -563,7 +563,7 @@ int scanhash_scrypt(int thr_id, unsigned char *pdata, unsigned char *scratchbuf,
#else
scrypt_1024_1_1_256_sp(data, hash, scratchbuf);
#endif
if (hash[7] < Htarg || hash[7] == Htarg && test_hash(hash, (uint32_t *)ptarget)) {
if (hash[7] < Htarg || (hash[7] == Htarg && test_hash(hash, (uint32_t *)ptarget))) {
be32enc(&((uint32_t *)pdata)[19], data[19]);
*next_nonce = n;
*hashes_done = n - first_nonce;

1
util.c
View file

@ -277,7 +277,6 @@ json_t *json_rpc_call(CURL *curl, const char *url,
/* If X-Long-Polling was found, activate long polling */
if (hi.lp_path) {
have_longpoll = true;
opt_scantime = 60;
tq_push(thr_info[longpoll_thr_id].q, hi.lp_path);
} else
free(hi.lp_path);