1
0
mirror of https://github.com/GOSTSec/sgminer synced 2025-01-10 23:08:07 +00:00

Create the hash queued work variant for use with devices that are fast enough to require a queue.

This commit is contained in:
Con Kolivas 2013-02-16 11:54:05 +11:00
parent 649f2939f7
commit 5e3253a7cf
2 changed files with 48 additions and 0 deletions

View File

@ -5595,6 +5595,53 @@ static void hash_sole_work(struct thr_info *mythr)
}
}
/* This version of hash work is for devices that are fast enough to always
* perform a full nonce range and need a queue to maintain the device busy.
* Work creation and destruction is not done from within this function
* directly. */
static void hash_queued_work(struct thr_info *mythr)
{
const long cycle = opt_log_interval / 5 ? : 1;
struct timeval tv_start = {0, 0}, tv_end;
struct cgpu_info *cgpu = mythr->cgpu;
struct device_drv *drv = cgpu->drv;
const int thr_id = mythr->id;
int64_t hashes_done = 0;
while (42) {
struct timeval diff;
int64_t hashes;
mythr->work_restart = false;
//fill_queue(mythr, cgpu, drv, thr_id);
thread_reportin(mythr);
hashes = drv->scanwork(mythr);
if (unlikely(hashes == -1 )) {
applog(LOG_ERR, "%s %d failure, disabling!", drv->name, cgpu->device_id);
cgpu->deven = DEV_DISABLED;
dev_error(cgpu, REASON_THREAD_ZERO_HASH);
mt_disable(mythr, thr_id, drv);
}
hashes_done += hashes;
gettimeofday(&tv_end, NULL);
timersub(&tv_end, &tv_start, &diff);
if (diff.tv_sec >= cycle) {
hashmeter(thr_id, &diff, hashes_done);
hashes_done = 0;
memcpy(&tv_start, &tv_end, sizeof(struct timeval));
}
//if (unlikely(mythr->work_restart))
// flush_queue(mythr, cgpu);
if (unlikely(mythr->pause || cgpu->deven != DEV_ENABLED))
mt_disable(mythr, thr_id, drv);
}
}
void *miner_thread(void *userdata)
{
struct thr_info *mythr = userdata;

View File

@ -298,6 +298,7 @@ struct device_drv {
bool (*thread_init)(struct thr_info *);
bool (*prepare_work)(struct thr_info *, struct work *);
int64_t (*scanhash)(struct thr_info *, struct work *, int64_t);
int64_t (*scanwork)(struct thr_info *);
void (*hw_error)(struct thr_info *);
void (*thread_shutdown)(struct thr_info *);
void (*thread_enable)(struct thr_info *);