mirror of
https://github.com/GOSTSec/ccminer
synced 2025-01-08 22:07:56 +00:00
refactor: create bench.cpp and algos.h
Also enhance multi-thread benchmark synchro. with pthread barriers
This commit is contained in:
parent
c2214091ae
commit
ab5cc7162e
@ -19,7 +19,7 @@ ccminer_SOURCES = elist.h miner.h compat.h \
|
|||||||
compat/inttypes.h compat/stdbool.h compat/unistd.h \
|
compat/inttypes.h compat/stdbool.h compat/unistd.h \
|
||||||
compat/sys/time.h compat/getopt/getopt.h \
|
compat/sys/time.h compat/getopt/getopt.h \
|
||||||
crc32.c hefty1.c \
|
crc32.c hefty1.c \
|
||||||
ccminer.cpp pools.cpp util.cpp bignum.cpp \
|
ccminer.cpp pools.cpp util.cpp bench.cpp bignum.cpp \
|
||||||
api.cpp hashlog.cpp nvml.cpp stats.cpp sysinfos.cpp cuda.cpp \
|
api.cpp hashlog.cpp nvml.cpp stats.cpp sysinfos.cpp cuda.cpp \
|
||||||
heavy/heavy.cu \
|
heavy/heavy.cu \
|
||||||
heavy/cuda_blake512.cu heavy/cuda_blake512.h \
|
heavy/cuda_blake512.cu heavy/cuda_blake512.h \
|
||||||
|
87
algos.h
Normal file
87
algos.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef ALGOS_H
|
||||||
|
#define ALGOS_H
|
||||||
|
|
||||||
|
enum sha_algos {
|
||||||
|
ALGO_BLAKE = 0,
|
||||||
|
ALGO_LYRA2, /* moved first for benchs */
|
||||||
|
ALGO_LYRA2v2,
|
||||||
|
ALGO_BLAKECOIN,
|
||||||
|
ALGO_BMW,
|
||||||
|
ALGO_C11,
|
||||||
|
ALGO_DEEP,
|
||||||
|
ALGO_DMD_GR,
|
||||||
|
ALGO_FRESH,
|
||||||
|
ALGO_FUGUE256, /* Fugue256 */
|
||||||
|
ALGO_GROESTL,
|
||||||
|
ALGO_HEAVY, /* Heavycoin hash */
|
||||||
|
ALGO_KECCAK,
|
||||||
|
ALGO_JACKPOT,
|
||||||
|
ALGO_LUFFA,
|
||||||
|
ALGO_MJOLLNIR, /* Hefty hash */
|
||||||
|
ALGO_MYR_GR,
|
||||||
|
ALGO_NEOSCRYPT,
|
||||||
|
ALGO_NIST5,
|
||||||
|
ALGO_PENTABLAKE,
|
||||||
|
ALGO_QUARK,
|
||||||
|
ALGO_QUBIT,
|
||||||
|
ALGO_SCRYPT,
|
||||||
|
ALGO_SCRYPT_JANE,
|
||||||
|
ALGO_SKEIN,
|
||||||
|
ALGO_SKEIN2,
|
||||||
|
ALGO_S3,
|
||||||
|
ALGO_X11,
|
||||||
|
ALGO_X13,
|
||||||
|
ALGO_X14,
|
||||||
|
ALGO_X15,
|
||||||
|
ALGO_X17,
|
||||||
|
ALGO_WHIRLCOIN,
|
||||||
|
ALGO_WHIRLPOOL,
|
||||||
|
ALGO_WHIRLPOOLX,
|
||||||
|
ALGO_ZR5,
|
||||||
|
ALGO_AUTO,
|
||||||
|
ALGO_COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *algo_names[] = {
|
||||||
|
"blake",
|
||||||
|
"lyra2",
|
||||||
|
"lyra2v2",
|
||||||
|
"blakecoin",
|
||||||
|
"bmw",
|
||||||
|
"c11",
|
||||||
|
"deep",
|
||||||
|
"dmd-gr",
|
||||||
|
"fresh",
|
||||||
|
"fugue256",
|
||||||
|
"groestl",
|
||||||
|
"heavy",
|
||||||
|
"keccak",
|
||||||
|
"jackpot",
|
||||||
|
"luffa",
|
||||||
|
"mjollnir",
|
||||||
|
"myr-gr",
|
||||||
|
"neoscrypt",
|
||||||
|
"nist5",
|
||||||
|
"penta",
|
||||||
|
"quark",
|
||||||
|
"qubit",
|
||||||
|
"scrypt",
|
||||||
|
"scrypt-jane",
|
||||||
|
"skein",
|
||||||
|
"skein2",
|
||||||
|
"s3",
|
||||||
|
"x11",
|
||||||
|
"x13",
|
||||||
|
"x14",
|
||||||
|
"x15",
|
||||||
|
"x17",
|
||||||
|
"whirlcoin",
|
||||||
|
"whirlpool",
|
||||||
|
"whirlpoolx",
|
||||||
|
"zr5",
|
||||||
|
"auto", /* reserved for multi algo */
|
||||||
|
""
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
124
bench.cpp
Normal file
124
bench.cpp
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* Made to benchmark and test algo switch
|
||||||
|
*
|
||||||
|
* 2015 - tpruvot@github
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "miner.h"
|
||||||
|
#include "algos.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int bench_algo = -1;
|
||||||
|
|
||||||
|
static double * algo_hashrates[MAX_GPUS] = { 0 };
|
||||||
|
static int device_mem_free[MAX_GPUS] = { 0 };
|
||||||
|
|
||||||
|
static pthread_barrier_t miner_barr;
|
||||||
|
static pthread_barrier_t algo_barr;
|
||||||
|
static pthread_mutex_t bench_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
extern double thr_hashrates[MAX_GPUS];
|
||||||
|
extern enum sha_algos opt_algo;
|
||||||
|
|
||||||
|
void bench_init(int threads)
|
||||||
|
{
|
||||||
|
bench_algo = opt_algo = (enum sha_algos) 0; /* first */
|
||||||
|
applog(LOG_BLUE, "Starting benchmark mode with %s", algo_names[opt_algo]);
|
||||||
|
for (int n=0; n < MAX_GPUS; n++) {
|
||||||
|
algo_hashrates[n] = (double*) calloc(1, ALGO_COUNT * sizeof(double));
|
||||||
|
}
|
||||||
|
pthread_barrier_init(&miner_barr, NULL, threads);
|
||||||
|
pthread_barrier_init(&algo_barr, NULL, threads);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bench_free()
|
||||||
|
{
|
||||||
|
for (int n=0; n < MAX_GPUS; n++) {
|
||||||
|
free(algo_hashrates[n]);
|
||||||
|
}
|
||||||
|
pthread_barrier_destroy(&miner_barr);
|
||||||
|
pthread_barrier_destroy(&algo_barr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// benchmark all algos (called once per mining thread)
|
||||||
|
bool bench_algo_switch_next(int thr_id)
|
||||||
|
{
|
||||||
|
int algo = (int) opt_algo;
|
||||||
|
int prev_algo = algo;
|
||||||
|
int dev_id = device_map[thr_id % MAX_GPUS];
|
||||||
|
int mfree;
|
||||||
|
char rate[32] = { 0 };
|
||||||
|
|
||||||
|
// free current algo memory and track mem usage
|
||||||
|
miner_free_device(thr_id);
|
||||||
|
mfree = cuda_available_memory(thr_id);
|
||||||
|
|
||||||
|
algo++;
|
||||||
|
|
||||||
|
// skip some duplicated algos
|
||||||
|
if (algo == ALGO_C11) algo++; // same as x11
|
||||||
|
if (algo == ALGO_DMD_GR) algo++; // same as groestl
|
||||||
|
if (algo == ALGO_WHIRLCOIN) algo++; // same as whirlpool
|
||||||
|
// and unwanted ones...
|
||||||
|
if (algo == ALGO_LYRA2) algo++; // weird memory leak to fix (uint2 Matrix[96][8] too big)
|
||||||
|
if (algo == ALGO_SCRYPT) algo++;
|
||||||
|
if (algo == ALGO_SCRYPT_JANE) algo++;
|
||||||
|
|
||||||
|
// we need to wait completion on all cards before the switch
|
||||||
|
if (opt_n_threads > 1) {
|
||||||
|
pthread_barrier_wait(&miner_barr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double hashrate = stats_get_speed(thr_id, thr_hashrates[thr_id]);
|
||||||
|
format_hashrate(hashrate, rate);
|
||||||
|
applog(LOG_NOTICE, "GPU #%d: %s hashrate = %s", dev_id, algo_names[prev_algo], rate);
|
||||||
|
|
||||||
|
// check if there is memory leak
|
||||||
|
if (device_mem_free[thr_id] > mfree) {
|
||||||
|
applog(LOG_WARNING, "GPU #%d, memory leak detected in %s ! %d MB free",
|
||||||
|
dev_id, algo_names[prev_algo], mfree);
|
||||||
|
}
|
||||||
|
device_mem_free[thr_id] = mfree;
|
||||||
|
|
||||||
|
// store to dump a table per gpu later
|
||||||
|
algo_hashrates[thr_id][prev_algo] = hashrate;
|
||||||
|
|
||||||
|
|
||||||
|
// wait the other threads to display logs correctly
|
||||||
|
if (opt_n_threads > 1) {
|
||||||
|
pthread_barrier_wait(&algo_barr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (algo == ALGO_AUTO)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// mutex primary used for the stats purge
|
||||||
|
pthread_mutex_lock(&bench_lock);
|
||||||
|
stats_purge_all();
|
||||||
|
|
||||||
|
opt_algo = (enum sha_algos) algo;
|
||||||
|
global_hashrate = 0;
|
||||||
|
thr_hashrates[thr_id] = 0; // reset for minmax64
|
||||||
|
pthread_mutex_unlock(&bench_lock);
|
||||||
|
|
||||||
|
if (thr_id == 0)
|
||||||
|
applog(LOG_BLUE, "Benchmark algo %s...", algo_names[algo]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bench_display_results()
|
||||||
|
{
|
||||||
|
for (int n=0; n < opt_n_threads; n++)
|
||||||
|
{
|
||||||
|
int dev_id = device_map[n];
|
||||||
|
applog(LOG_BLUE, "Benchmark results for GPU #%d - %s:", dev_id, device_name[dev_id]);
|
||||||
|
for (int i=0; i < ALGO_COUNT-1; i++) {
|
||||||
|
double rate = algo_hashrates[n][i];
|
||||||
|
if (rate == 0.0) continue;
|
||||||
|
applog(LOG_INFO, "%12s : %12.1f kH/s", algo_names[i], rate / 1024.);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
223
ccminer.cpp
223
ccminer.cpp
@ -41,8 +41,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "miner.h"
|
#include "miner.h"
|
||||||
|
#include "algos.h"
|
||||||
#include <cuda_runtime.h>
|
#include <cuda_runtime.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <Mmsystem.h>
|
#include <Mmsystem.h>
|
||||||
#pragma comment(lib, "winmm.lib")
|
#pragma comment(lib, "winmm.lib")
|
||||||
@ -55,15 +57,6 @@ BOOL WINAPI ConsoleHandler(DWORD);
|
|||||||
#define HEAVYCOIN_BLKHDR_SZ 84
|
#define HEAVYCOIN_BLKHDR_SZ 84
|
||||||
#define MNR_BLKHDR_SZ 80
|
#define MNR_BLKHDR_SZ 80
|
||||||
|
|
||||||
// decl. from cuda.cpp (to move in miner.h)
|
|
||||||
int cuda_num_devices();
|
|
||||||
void cuda_devicenames();
|
|
||||||
void cuda_reset_device(int thr_id, bool *init);
|
|
||||||
void cuda_shutdown();
|
|
||||||
int cuda_finddevice(char *name);
|
|
||||||
void cuda_print_devices();
|
|
||||||
int cuda_available_memory(int thr_id);
|
|
||||||
|
|
||||||
#include "nvml.h"
|
#include "nvml.h"
|
||||||
#ifdef USE_WRAPNVML
|
#ifdef USE_WRAPNVML
|
||||||
nvml_handle *hnvml = NULL;
|
nvml_handle *hnvml = NULL;
|
||||||
@ -84,88 +77,6 @@ struct workio_cmd {
|
|||||||
int pooln;
|
int pooln;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sha_algos {
|
|
||||||
ALGO_BLAKE = 0,
|
|
||||||
ALGO_LYRA2, /* moved first for benchs */
|
|
||||||
ALGO_LYRA2v2,
|
|
||||||
ALGO_BLAKECOIN,
|
|
||||||
ALGO_BMW,
|
|
||||||
ALGO_C11,
|
|
||||||
ALGO_DEEP,
|
|
||||||
ALGO_DMD_GR,
|
|
||||||
ALGO_FRESH,
|
|
||||||
ALGO_FUGUE256, /* Fugue256 */
|
|
||||||
ALGO_GROESTL,
|
|
||||||
ALGO_HEAVY, /* Heavycoin hash */
|
|
||||||
ALGO_KECCAK,
|
|
||||||
ALGO_JACKPOT,
|
|
||||||
ALGO_LUFFA,
|
|
||||||
ALGO_MJOLLNIR, /* Hefty hash */
|
|
||||||
ALGO_MYR_GR,
|
|
||||||
ALGO_NEOSCRYPT,
|
|
||||||
ALGO_NIST5,
|
|
||||||
ALGO_PENTABLAKE,
|
|
||||||
ALGO_QUARK,
|
|
||||||
ALGO_QUBIT,
|
|
||||||
ALGO_SCRYPT,
|
|
||||||
ALGO_SCRYPT_JANE,
|
|
||||||
ALGO_SKEIN,
|
|
||||||
ALGO_SKEIN2,
|
|
||||||
ALGO_S3,
|
|
||||||
ALGO_X11,
|
|
||||||
ALGO_X13,
|
|
||||||
ALGO_X14,
|
|
||||||
ALGO_X15,
|
|
||||||
ALGO_X17,
|
|
||||||
ALGO_WHIRLCOIN,
|
|
||||||
ALGO_WHIRLPOOL,
|
|
||||||
ALGO_WHIRLPOOLX,
|
|
||||||
ALGO_ZR5,
|
|
||||||
ALGO_AUTO,
|
|
||||||
ALGO_COUNT
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *algo_names[] = {
|
|
||||||
"blake",
|
|
||||||
"lyra2",
|
|
||||||
"lyra2v2",
|
|
||||||
"blakecoin",
|
|
||||||
"bmw",
|
|
||||||
"c11",
|
|
||||||
"deep",
|
|
||||||
"dmd-gr",
|
|
||||||
"fresh",
|
|
||||||
"fugue256",
|
|
||||||
"groestl",
|
|
||||||
"heavy",
|
|
||||||
"keccak",
|
|
||||||
"jackpot",
|
|
||||||
"luffa",
|
|
||||||
"mjollnir",
|
|
||||||
"myr-gr",
|
|
||||||
"neoscrypt",
|
|
||||||
"nist5",
|
|
||||||
"penta",
|
|
||||||
"quark",
|
|
||||||
"qubit",
|
|
||||||
"scrypt",
|
|
||||||
"scrypt-jane",
|
|
||||||
"skein",
|
|
||||||
"skein2",
|
|
||||||
"s3",
|
|
||||||
"x11",
|
|
||||||
"x13",
|
|
||||||
"x14",
|
|
||||||
"x15",
|
|
||||||
"x17",
|
|
||||||
"whirlcoin",
|
|
||||||
"whirlpool",
|
|
||||||
"whirlpoolx",
|
|
||||||
"zr5",
|
|
||||||
"auto", /* reserved for multi algo */
|
|
||||||
""
|
|
||||||
};
|
|
||||||
|
|
||||||
bool opt_debug = false;
|
bool opt_debug = false;
|
||||||
bool opt_debug_diff = false;
|
bool opt_debug_diff = false;
|
||||||
bool opt_debug_threads = false;
|
bool opt_debug_threads = false;
|
||||||
@ -197,7 +108,7 @@ int opt_timeout = 300; // curl
|
|||||||
int opt_scantime = 10;
|
int opt_scantime = 10;
|
||||||
static json_t *opt_config;
|
static json_t *opt_config;
|
||||||
static const bool opt_time = true;
|
static const bool opt_time = true;
|
||||||
static enum sha_algos opt_algo = ALGO_X11;
|
enum sha_algos opt_algo = ALGO_X11;
|
||||||
int opt_n_threads = 0;
|
int opt_n_threads = 0;
|
||||||
int64_t opt_affinity = -1L;
|
int64_t opt_affinity = -1L;
|
||||||
int opt_priority = 0;
|
int opt_priority = 0;
|
||||||
@ -265,10 +176,9 @@ volatile bool abort_flag = false;
|
|||||||
struct work_restart *work_restart = NULL;
|
struct work_restart *work_restart = NULL;
|
||||||
static int app_exit_code = EXIT_CODE_OK;
|
static int app_exit_code = EXIT_CODE_OK;
|
||||||
|
|
||||||
pthread_mutex_t algo_lock;
|
|
||||||
pthread_mutex_t applog_lock;
|
pthread_mutex_t applog_lock;
|
||||||
static pthread_mutex_t stats_lock;
|
static pthread_mutex_t stats_lock;
|
||||||
static double thr_hashrates[MAX_GPUS] = { 0 };
|
double thr_hashrates[MAX_GPUS] = { 0 };
|
||||||
uint64_t global_hashrate = 0;
|
uint64_t global_hashrate = 0;
|
||||||
double stratum_diff = 0.0;
|
double stratum_diff = 0.0;
|
||||||
double net_diff = 0;
|
double net_diff = 0;
|
||||||
@ -279,10 +189,7 @@ uint8_t conditional_state[MAX_GPUS] = { 0 };
|
|||||||
double opt_max_temp = 0.0;
|
double opt_max_temp = 0.0;
|
||||||
double opt_max_diff = -1.;
|
double opt_max_diff = -1.;
|
||||||
double opt_max_rate = -1.;
|
double opt_max_rate = -1.;
|
||||||
// algos benchmark
|
|
||||||
int algo_benchmark = -1;
|
|
||||||
double * algo_hashrates[MAX_GPUS] = { 0 };
|
|
||||||
int device_mem_free[MAX_GPUS] = { 0 };
|
|
||||||
int opt_statsavg = 30;
|
int opt_statsavg = 30;
|
||||||
|
|
||||||
// strdup on char* to allow a common free() if used
|
// strdup on char* to allow a common free() if used
|
||||||
@ -1571,92 +1478,6 @@ void miner_free_device(int thr_id)
|
|||||||
cudaGetLastError();
|
cudaGetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
// to benchmark all algos
|
|
||||||
bool algo_switch_next(int thr_id)
|
|
||||||
{
|
|
||||||
int algo = (int) opt_algo;
|
|
||||||
int prev_algo = algo;
|
|
||||||
int dev_id = device_map[thr_id % MAX_GPUS];
|
|
||||||
int mfree;
|
|
||||||
char rate[32] = { 0 };
|
|
||||||
|
|
||||||
// free current algo memory and track mem usage
|
|
||||||
miner_free_device(thr_id);
|
|
||||||
mfree = cuda_available_memory(thr_id);
|
|
||||||
|
|
||||||
algo++;
|
|
||||||
|
|
||||||
// skip some duplicated algos
|
|
||||||
if (algo == ALGO_C11) algo++; // same as x11
|
|
||||||
if (algo == ALGO_DMD_GR) algo++; // same as groestl
|
|
||||||
if (algo == ALGO_WHIRLCOIN) algo++; // same as whirlpool
|
|
||||||
// and unwanted ones...
|
|
||||||
if (algo == ALGO_SCRYPT) algo++;
|
|
||||||
if (algo == ALGO_SCRYPT_JANE) algo++;
|
|
||||||
|
|
||||||
work_restart[thr_id].restart = 1;
|
|
||||||
|
|
||||||
// we need to wait completion on all cards before the switch
|
|
||||||
if (opt_n_threads > 1) {
|
|
||||||
pthread_mutex_lock(&algo_lock); // wait work_restart for all
|
|
||||||
for (int n=0; n < opt_n_threads; n++) {
|
|
||||||
int timeout = 1000;
|
|
||||||
while (!work_restart[n].restart && --timeout) {
|
|
||||||
//applog(LOG_DEBUG, "GPU #%d: waiting GPU %d", dev_id, device_map[n]);
|
|
||||||
usleep(200*1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&algo_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
double hashrate = stats_get_speed(thr_id, thr_hashrates[thr_id]);
|
|
||||||
format_hashrate(hashrate, rate);
|
|
||||||
applog(LOG_NOTICE, "GPU #%d: %s hashrate = %s", dev_id, algo_names[prev_algo], rate);
|
|
||||||
|
|
||||||
// check if there is there is memory leaks
|
|
||||||
if (device_mem_free[thr_id] > mfree)
|
|
||||||
applog(LOG_WARNING, "GPU #%d, memory leak detected! %d MB free", dev_id, mfree);
|
|
||||||
device_mem_free[thr_id] = mfree;
|
|
||||||
|
|
||||||
// store to dump a table per gpu later
|
|
||||||
algo_hashrates[thr_id][prev_algo] = hashrate;
|
|
||||||
|
|
||||||
if (algo == ALGO_AUTO)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// wait other threads before algo switch
|
|
||||||
pthread_mutex_lock(&algo_lock);
|
|
||||||
|
|
||||||
opt_algo = (enum sha_algos) algo;
|
|
||||||
work_restart[thr_id].restart = 0;
|
|
||||||
|
|
||||||
stats_purge_all();
|
|
||||||
global_hashrate = 0;
|
|
||||||
thr_hashrates[thr_id] = 0; // reset for minmax64
|
|
||||||
|
|
||||||
if (thr_id == 0)
|
|
||||||
applog(LOG_BLUE, "Benchmark algo %s...", algo_names[algo]);
|
|
||||||
|
|
||||||
//applog(LOG_BLUE, "GPU #%d: Benchmark algo %s...", dev_id, algo_names[algo]);
|
|
||||||
pthread_mutex_unlock(&algo_lock);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void display_benchmark_results()
|
|
||||||
{
|
|
||||||
for (int n=0; n < opt_n_threads; n++)
|
|
||||||
{
|
|
||||||
int dev_id = device_map[n];
|
|
||||||
applog(LOG_BLUE, "Benchmark results for GPU #%d - %s:", dev_id, device_name[dev_id]);
|
|
||||||
for (int i=0; i < ALGO_COUNT-1; i++) {
|
|
||||||
double rate = algo_hashrates[n][i];
|
|
||||||
if (rate == 0.0) continue;
|
|
||||||
applog(LOG_INFO, "%12s : %15.0f H/s", algo_names[i], rate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *miner_thread(void *userdata)
|
static void *miner_thread(void *userdata)
|
||||||
{
|
{
|
||||||
struct thr_info *mythr = (struct thr_info *)userdata;
|
struct thr_info *mythr = (struct thr_info *)userdata;
|
||||||
@ -1812,19 +1633,16 @@ static void *miner_thread(void *userdata)
|
|||||||
|
|
||||||
pthread_mutex_unlock(&g_work_lock);
|
pthread_mutex_unlock(&g_work_lock);
|
||||||
|
|
||||||
// -a auto --benchmark
|
// --benchmark [-a auto]
|
||||||
if (opt_benchmark && algo_benchmark >= 0) {
|
if (opt_benchmark && bench_algo >= 0) {
|
||||||
//applog(LOG_DEBUG, "GPU #%d: loop %d", device_map[thr_id], loopcnt);
|
//applog(LOG_DEBUG, "GPU #%d: loop %d", device_map[thr_id], loopcnt);
|
||||||
if (loopcnt >= 3) {
|
if (loopcnt >= 3) {
|
||||||
if (!algo_switch_next(thr_id) && thr_id == 0)
|
if (!bench_algo_switch_next(thr_id) && thr_id == 0)
|
||||||
{
|
{
|
||||||
display_benchmark_results();
|
bench_display_results();
|
||||||
proper_exit(0);
|
proper_exit(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
algo_benchmark = (int) opt_algo;
|
|
||||||
// for scrypt...
|
|
||||||
opt_autotune = false;
|
|
||||||
loopcnt = 0;
|
loopcnt = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2171,7 +1989,7 @@ static void *miner_thread(void *userdata)
|
|||||||
for (int i = 0; i < opt_n_threads && thr_hashrates[i]; i++)
|
for (int i = 0; i < opt_n_threads && thr_hashrates[i]; i++)
|
||||||
hashrate += stats_get_speed(i, thr_hashrates[i]);
|
hashrate += stats_get_speed(i, thr_hashrates[i]);
|
||||||
pthread_mutex_unlock(&stats_lock);
|
pthread_mutex_unlock(&stats_lock);
|
||||||
if (opt_benchmark && algo_benchmark == -1) {
|
if (opt_benchmark && bench_algo == -1) {
|
||||||
format_hashrate(hashrate, s);
|
format_hashrate(hashrate, s);
|
||||||
applog(LOG_NOTICE, "Total: %s", s);
|
applog(LOG_NOTICE, "Total: %s", s);
|
||||||
}
|
}
|
||||||
@ -3150,18 +2968,6 @@ static void parse_cmdline(int argc, char *argv[])
|
|||||||
argv[0]);
|
argv[0]);
|
||||||
show_usage_and_exit(1);
|
show_usage_and_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_algo == ALGO_AUTO) {
|
|
||||||
for (int n=0; n < MAX_GPUS; n++) {
|
|
||||||
gpus_intensity[n] = 0; // use default
|
|
||||||
algo_hashrates[n] = (double*) calloc(1, ALGO_COUNT * sizeof(double));
|
|
||||||
}
|
|
||||||
if (opt_benchmark) {
|
|
||||||
opt_autotune = false;
|
|
||||||
algo_benchmark = opt_algo = (enum sha_algos) 0; /* first */
|
|
||||||
applog(LOG_BLUE, "Starting benchmark mode");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
@ -3233,7 +3039,6 @@ int main(int argc, char *argv[])
|
|||||||
jane_params = strdup("");
|
jane_params = strdup("");
|
||||||
|
|
||||||
pthread_mutex_init(&applog_lock, NULL);
|
pthread_mutex_init(&applog_lock, NULL);
|
||||||
pthread_mutex_init(&algo_lock, NULL);
|
|
||||||
|
|
||||||
// number of cpus for thread affinity
|
// number of cpus for thread affinity
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
@ -3387,6 +3192,14 @@ int main(int argc, char *argv[])
|
|||||||
if (!opt_n_threads)
|
if (!opt_n_threads)
|
||||||
opt_n_threads = active_gpus;
|
opt_n_threads = active_gpus;
|
||||||
|
|
||||||
|
if (opt_benchmark && opt_algo == ALGO_AUTO) {
|
||||||
|
bench_init(opt_n_threads);
|
||||||
|
for (int n=0; n < MAX_GPUS; n++) {
|
||||||
|
gpus_intensity[n] = 0; // use default
|
||||||
|
}
|
||||||
|
opt_autotune = false;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG_H
|
#ifdef HAVE_SYSLOG_H
|
||||||
if (use_syslog)
|
if (use_syslog)
|
||||||
openlog(opt_syslog_pfx, LOG_PID, LOG_USER);
|
openlog(opt_syslog_pfx, LOG_PID, LOG_USER);
|
||||||
|
@ -231,6 +231,7 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="pools.cpp" />
|
<ClCompile Include="pools.cpp" />
|
||||||
<ClCompile Include="util.cpp" />
|
<ClCompile Include="util.cpp" />
|
||||||
|
<ClCompile Include="bench.cpp" />
|
||||||
<ClCompile Include="bignum.cpp" />
|
<ClCompile Include="bignum.cpp" />
|
||||||
<ClInclude Include="bignum.hpp" />
|
<ClInclude Include="bignum.hpp" />
|
||||||
<ClCompile Include="fuguecoin.cpp" />
|
<ClCompile Include="fuguecoin.cpp" />
|
||||||
@ -309,6 +310,7 @@
|
|||||||
<ClInclude Include="elist.h" />
|
<ClInclude Include="elist.h" />
|
||||||
<ClInclude Include="heavy\heavy.h" />
|
<ClInclude Include="heavy\heavy.h" />
|
||||||
<ClInclude Include="hefty1.h" />
|
<ClInclude Include="hefty1.h" />
|
||||||
|
<ClInclude Include="algos.h" />
|
||||||
<ClInclude Include="miner.h" />
|
<ClInclude Include="miner.h" />
|
||||||
<ClInclude Include="nvml.h" />
|
<ClInclude Include="nvml.h" />
|
||||||
<ClInclude Include="res\resource.h" />
|
<ClInclude Include="res\resource.h" />
|
||||||
|
@ -246,11 +246,17 @@
|
|||||||
<ClCompile Include="hefty1.c">
|
<ClCompile Include="hefty1.c">
|
||||||
<Filter>Source Files\CUDA\heavy</Filter>
|
<Filter>Source Files\CUDA\heavy</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="bench.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="bignum.cpp">
|
<ClCompile Include="bignum.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="algos.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="compat.h">
|
<ClInclude Include="compat.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
4
cuda.cpp
4
cuda.cpp
@ -212,9 +212,11 @@ void cuda_reset_device(int thr_id, bool *init)
|
|||||||
usleep(1000);
|
usleep(1000);
|
||||||
}
|
}
|
||||||
cudaDeviceReset();
|
cudaDeviceReset();
|
||||||
if (opt_cudaschedule >= 0)
|
if (opt_cudaschedule >= 0) {
|
||||||
|
cudaSetDevice(dev_id);
|
||||||
cudaSetDeviceFlags((unsigned)(opt_cudaschedule & cudaDeviceScheduleMask));
|
cudaSetDeviceFlags((unsigned)(opt_cudaschedule & cudaDeviceScheduleMask));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// return free memory in megabytes
|
// return free memory in megabytes
|
||||||
int cuda_available_memory(int thr_id)
|
int cuda_available_memory(int thr_id)
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#define __launch_bounds__(max_tpb, min_blocks)
|
#define __launch_bounds__(max_tpb, min_blocks)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifndef UINT32_MAX
|
#ifndef UINT32_MAX
|
||||||
@ -29,7 +30,6 @@ extern int cuda_arch[MAX_GPUS];
|
|||||||
|
|
||||||
// common functions
|
// common functions
|
||||||
extern int cuda_get_arch(int thr_id);
|
extern int cuda_get_arch(int thr_id);
|
||||||
extern void cuda_reset_device(int thr_id, bool *init);
|
|
||||||
extern void cuda_check_cpu_init(int thr_id, uint32_t threads);
|
extern void cuda_check_cpu_init(int thr_id, uint32_t threads);
|
||||||
extern void cuda_check_cpu_free(int thr_id);
|
extern void cuda_check_cpu_free(int thr_id);
|
||||||
extern void cuda_check_cpu_setTarget(const void *ptarget);
|
extern void cuda_check_cpu_setTarget(const void *ptarget);
|
||||||
|
17
miner.h
17
miner.h
@ -483,6 +483,15 @@ extern long device_sm[MAX_GPUS];
|
|||||||
extern uint32_t gpus_intensity[MAX_GPUS];
|
extern uint32_t gpus_intensity[MAX_GPUS];
|
||||||
extern int opt_cudaschedule;
|
extern int opt_cudaschedule;
|
||||||
|
|
||||||
|
// decl. from cuda.cpp
|
||||||
|
int cuda_num_devices();
|
||||||
|
void cuda_devicenames();
|
||||||
|
void cuda_reset_device(int thr_id, bool *init);
|
||||||
|
void cuda_shutdown();
|
||||||
|
int cuda_finddevice(char *name);
|
||||||
|
void cuda_print_devices();
|
||||||
|
int cuda_available_memory(int thr_id);
|
||||||
|
|
||||||
#define CL_N "\x1B[0m"
|
#define CL_N "\x1B[0m"
|
||||||
#define CL_RED "\x1B[31m"
|
#define CL_RED "\x1B[31m"
|
||||||
#define CL_GRN "\x1B[32m"
|
#define CL_GRN "\x1B[32m"
|
||||||
@ -534,9 +543,15 @@ double bn_convert_nbits(const uint32_t nbits);
|
|||||||
void bn_nbits_to_uchar(const uint32_t nBits, uchar *target);
|
void bn_nbits_to_uchar(const uint32_t nBits, uchar *target);
|
||||||
double bn_hash_target_ratio(uint32_t* hash, uint32_t* target);
|
double bn_hash_target_ratio(uint32_t* hash, uint32_t* target);
|
||||||
void bn_store_hash_target_ratio(uint32_t* hash, uint32_t* target, struct work* work);
|
void bn_store_hash_target_ratio(uint32_t* hash, uint32_t* target, struct work* work);
|
||||||
|
|
||||||
void work_set_target_ratio(struct work* work, uint32_t* hash);
|
void work_set_target_ratio(struct work* work, uint32_t* hash);
|
||||||
|
|
||||||
|
// bench
|
||||||
|
extern int bench_algo;
|
||||||
|
void bench_init(int threads);
|
||||||
|
void bench_free();
|
||||||
|
bool bench_algo_switch_next(int thr_id);
|
||||||
|
void bench_display_results();
|
||||||
|
|
||||||
|
|
||||||
struct stratum_job {
|
struct stratum_job {
|
||||||
char *job_id;
|
char *job_id;
|
||||||
|
@ -261,6 +261,7 @@ extern "C" void free_x14(int thr_id)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
cudaSetDevice(device_map[thr_id]);
|
cudaSetDevice(device_map[thr_id]);
|
||||||
|
cudaDeviceSynchronize();
|
||||||
|
|
||||||
cudaFree(d_hash[thr_id]);
|
cudaFree(d_hash[thr_id]);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user