diff --git a/README.txt b/README.txt index 0fb31df..201f0e5 100644 --- a/README.txt +++ b/README.txt @@ -1,5 +1,5 @@ -ccMiner release 1.5.2-tpruvot (24 Jan 2015) - "Happy new Year!" +ccMiner release 1.5.3-tpruvot (11 Feb 2015) - "Default Config" --------------------------------------------------------------- *************************************************************** @@ -175,6 +175,11 @@ features. >>> RELEASE HISTORY <<< + Feb. 11th 2015 v1.5.3 + Fix anime algo + Allow a default config file in user or ccminer folder + SM 2.1 windows binary (lyra2 and blake/blakecoin for the moment) + Jan. 24th 2015 v1.5.2 Allow per device intensity, example: -i 20,19.5 Add process CPU priority and affinity mask parameters diff --git a/ccminer.conf b/ccminer.conf new file mode 100644 index 0000000..fe2c9dc --- /dev/null +++ b/ccminer.conf @@ -0,0 +1,19 @@ +{ + "_comment1" : "Possible keys are the long options (ccminer --help)", + "_comment2" : "todo: support /* comments */", + + "algo" : "blake", + "intensity": 19, + + "api-bind": "127.0.0.1:4068", + "statsavg": 20, + + "quiet" : false, + "debug" : false, + "protocol" : false, + "cpu-priority" : 3, + + "url" : "stratum+tcp://stratum.eu.miners-pool.eu:8421", + "user" : "ShGCAFrspnLDo414EzUyJm4k5Qr2Kkrmvh", + "pass" : "x" +} diff --git a/ccminer.cpp b/ccminer.cpp index a17e98c..5ea790a 100644 --- a/ccminer.cpp +++ b/ccminer.cpp @@ -172,9 +172,9 @@ short device_map[MAX_GPUS] = { 0 }; long device_sm[MAX_GPUS] = { 0 }; uint32_t gpus_intensity[MAX_GPUS] = { 0 }; char *rpc_user = NULL; -static char *rpc_url; -static char *rpc_userpass; static char *rpc_pass; +static char *rpc_userpass = NULL; +static char *rpc_url; static char *short_url = NULL; char *opt_cert; char *opt_proxy; @@ -364,6 +364,7 @@ static inline void drop_policy(void) { sched_setscheduler(0, SCHED_BATCH, ¶m); #endif } + static void affine_to_cpu_mask(int id, uint8_t mask) { cpu_set_t set; CPU_ZERO(&set); @@ -1125,7 +1126,7 @@ static void *miner_thread(void *userdata) applog(LOG_DEBUG, "Thread %d priority %d (nice %d)", thr_id, opt_priority, prio); #endif - int ret = setpriority(PRIO_PROCESS, 0, prio); + setpriority(PRIO_PROCESS, 0, prio); if (opt_priority == 0) { drop_policy(); } @@ -1830,7 +1831,7 @@ static void parse_arg(int key, char *arg) if (v < 0 || v > 31) show_usage_and_exit(1); { - int n = 0, adds = 0; + int n = 0; int ngpus = cuda_num_devices(); char * pch = strtok(arg,","); if (pch == NULL) { @@ -1842,13 +1843,14 @@ static void parse_arg(int key, char *arg) d = atof(pch); v = (uint32_t) d; if (v > 7) { /* 0 = default */ - gpus_intensity[n] = (1 << v); if ((d - v) > 0.0) { - adds = (uint32_t) floor((d - v) * (1 << (v-8))) * 256; - gpus_intensity[n] += adds; + int adds = (uint32_t)floor((d - v) * (1 << (v - 8))) * 256; + gpus_intensity[n] = (1 << v) + adds; applog(LOG_INFO, "Adding %u threads to intensity %u, %u cuda threads", adds, v, gpus_intensity[n]); - } else { + } + else if (gpus_intensity[n] != (1 << v)) { + gpus_intensity[n] = (1 << v); applog(LOG_INFO, "Intensity set to %u, %u cuda threads", v, gpus_intensity[n]); } @@ -1903,7 +1905,7 @@ static void parse_arg(int key, char *arg) break; case 't': v = atoi(arg); - if (v < 1 || v > 9999) /* sanity check */ + if (v < 0 || v > 9999) /* sanity check */ show_usage_and_exit(1); opt_n_threads = v; break; @@ -2207,12 +2209,12 @@ int main(int argc, char *argv[]) int i; printf("*** ccminer " PACKAGE_VERSION " for nVidia GPUs by tpruvot@github ***\n"); -#ifdef WIN32 - printf("\tBuilt with VC++ 2013 and nVidia CUDA SDK 6.5\n\n"); +#ifdef _MSC_VER + printf(" Built with VC++ 2013 and nVidia CUDA SDK 6.5\n\n"); #else - printf("\tBuilt with the nVidia CUDA SDK 6.5\n\n"); + printf(" Built with the nVidia CUDA SDK 6.5\n\n"); #endif - printf(" Based on pooler cpuminer 2.3.2\n"); + printf(" Originally based on pooler cpuminer,\n"); printf(" CUDA support by Christian Buchner and Christian H.\n"); printf(" Include some of djm34 additions and sp optimisations\n\n"); @@ -2220,6 +2222,7 @@ int main(int argc, char *argv[]) rpc_user = strdup(""); rpc_pass = strdup(""); + rpc_url = strdup(""); pthread_mutex_init(&applog_lock, NULL); @@ -2252,7 +2255,19 @@ int main(int argc, char *argv[]) /* parse command line */ parse_cmdline(argc, argv); - if (!opt_benchmark && !rpc_url) { + if (!opt_benchmark && !strlen(rpc_url)) { + // try default config file (user then binary folder) + char defconfig[MAX_PATH] = { 0 }; + get_defconfig_path(defconfig, MAX_PATH, argv[0]); + if (strlen(defconfig)) { + if (opt_debug) + applog(LOG_DEBUG, "Using config %s", defconfig); + parse_arg('c', defconfig); + parse_cmdline(argc, argv); + } + } + + if (!opt_benchmark && !strlen(rpc_url)) { fprintf(stderr, "%s: no URL supplied\n", argv[0]); show_usage_and_exit(1); } diff --git a/compat.h b/compat.h index 0b82c4f..a136bb2 100644 --- a/compat.h +++ b/compat.h @@ -42,9 +42,37 @@ static __inline int setpriority(int which, int who, int prio) } #ifdef _MSC_VER -#define __func__ __FUNCTION__ +#define snprintf(...) _snprintf(__VA_ARGS__) +#define strdup(...) _strdup(__VA_ARGS__) +#define strncasecmp(x,y,z) _strnicmp(x,y,z) +#define strcasecmp(x,y) _stricmp(x,y) +typedef int ssize_t; + +#include +static __inline char * dirname(char *file) { + char buffer[_MAX_PATH] = { 0 }; + char drive[_MAX_DRIVE]; + char dir[_MAX_DIR]; + char fname[_MAX_FNAME]; + char ext[_MAX_EXT]; + _splitpath_s(file, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT); + sprintf(buffer, "%s%s", drive, dir); + return strdup(buffer); +} #endif #endif /* WIN32 */ +#ifdef _MSC_VER +# define __func__ __FUNCTION__ +# define __thread __declspec(thread) +# define _ALIGN(x) __declspec(align(x)) +#else +# define _ALIGN(x) __attribute__ ((aligned(x))) +#endif + +#ifndef WIN32 +#define MAX_PATH PATH_MAX +#endif + #endif /* __COMPAT_H__ */ diff --git a/configure.ac b/configure.ac index c72ac40..569230b 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([ccminer], [1.5-git]) +AC_INIT([ccminer], [1.5.3]) AC_PREREQ([2.59c]) AC_CANONICAL_SYSTEM diff --git a/cpuminer-config.h b/cpuminer-config.h index 0860baf..8640a15 100644 --- a/cpuminer-config.h +++ b/cpuminer-config.h @@ -156,7 +156,7 @@ #define PACKAGE_NAME "ccminer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "ccminer 1.5-git" +#define PACKAGE_STRING "ccminer 1.5.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "ccminer" @@ -165,7 +165,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.5-git" +#define PACKAGE_VERSION "1.5.3" /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be @@ -188,7 +188,7 @@ #define USE_XOP 1 /* Version number of package */ -#define VERSION "1.5-git" +#define VERSION "1.5.3" /* Define curl_free() as free() if our version of curl lacks curl_free. */ /* #undef curl_free */ diff --git a/example-cfg.json b/example-cfg.json deleted file mode 100644 index 10971ed..0000000 --- a/example-cfg.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "_comment" : "todo: support /* comments */", - - "algo" : "blake", - "intensity": 19, - "diff": 0.5, - - "api-bind": "0.0.0.0:4068", - "statsavg": 20, - - "quiet" : false, - "debug" : false, - "protocol": false, - - "url" : "stratum+tcp://www.hashharder.com:9585", - "user" : "NaEcVrdzoCWHUYXb7X8QoafoKS9UV69Yk4", - "pass" : "ccminer" -} diff --git a/miner.h b/miner.h index da7c9c1..52a21a7 100644 --- a/miner.h +++ b/miner.h @@ -14,12 +14,7 @@ extern "C" { #include #include -#ifdef WIN32 -#define snprintf(...) _snprintf(__VA_ARGS__) -#define strdup(x) _strdup(x) -#define strncasecmp(x,y,z) _strnicmp(x,y,z) -#define strcasecmp(x,y) _stricmp(x,y) -typedef int ssize_t; +#ifdef _MSC_VER #undef HAVE_ALLOCA_H #undef HAVE_SYSLOG_H #endif @@ -69,11 +64,8 @@ typedef char * va_list; #endif #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ > 0 +# undef _ALIGN # define _ALIGN(x) __align__(x) -#elif _MSC_VER -# define _ALIGN(x) __declspec(align(x)) -#else -# define _ALIGN(x) __attribute__ ((aligned(x))) #endif #ifdef HAVE_SYSLOG_H @@ -526,6 +518,7 @@ extern uint32_t gpus_intensity[MAX_GPUS]; #define CL_WHT "\x1B[01;37m" /* white */ extern void applog(int prio, const char *fmt, ...); +void get_defconfig_path(char *out, size_t bufsize, char *argv0); extern json_t *json_rpc_call(CURL *curl, const char *url, const char *userpass, const char *rpc_req, bool, bool, int *); extern void cbin2hex(char *out, const char *in, size_t len); diff --git a/res/ccminer.rc b/res/ccminer.rc index 9c4a9cb..c913f0e 100644 Binary files a/res/ccminer.rc and b/res/ccminer.rc differ diff --git a/util.cpp b/util.cpp index 02042f5..05aebe6 100644 --- a/util.cpp +++ b/util.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #ifdef WIN32 #include "compat/winansi.h" @@ -145,6 +146,33 @@ void applog(int prio, const char *fmt, ...) va_end(ap); } +/* Get default config.json path (system specific) */ +void get_defconfig_path(char *out, size_t bufsize, char *argv0) +{ + char *cmd = strdup(argv0); + char *dir = dirname(cmd); + const char *sep = strstr(dir, "\\") ? "\\" : "/"; + struct stat info; +#ifdef WIN32 + snprintf(out, bufsize, "%s\\ccminer\\ccminer.conf\0", getenv("APPDATA")); +#else + snprintf(out, bufsize, "%s\\.ccminer\\ccminer.conf", getenv("HOME")); +#endif + if (dir && stat(out, &info) != 0) { + // binary folder if not present in user folder + snprintf(out, bufsize, "%s%sccminer.conf\0", dir, sep); + } + if (stat(out, &info) != 0) { + out[0] = '\0'; + return; + } + out[bufsize - 1] = '\0'; + free(cmd); +#ifdef WIN32 + if (dir) free(dir); +#endif +} + static void databuf_free(struct data_buffer *db) { if (!db)