This commit is contained in:
Jay D Dee
2017-07-01 14:37:11 -04:00
parent 7544cb956c
commit f8907677f6
13 changed files with 7803 additions and 14 deletions

1
.gitignore vendored
View File

@@ -11,7 +11,6 @@ autom4te.cache
Makefile Makefile
Makefile.in Makefile.in
INSTALL INSTALL
configure
configure.lineno configure.lineno
depcomp depcomp
missing missing

View File

@@ -121,6 +121,7 @@ cpuminer_SOURCES = \
algo/tiger/sph_tiger.c \ algo/tiger/sph_tiger.c \
algo/timetravel.c \ algo/timetravel.c \
algo/timetravel10.c \ algo/timetravel10.c \
algo/tribus.c \
algo/veltor.c \ algo/veltor.c \
algo/whirlpool/whirlpool.c \ algo/whirlpool/whirlpool.c \
algo/whirlpool/whirlpoolx.c \ algo/whirlpool/whirlpoolx.c \

View File

@@ -103,6 +103,10 @@ Run winbuild.sh to build on Windows or execute the following commands.
CFLAGS="-O3 -march=native -Wall" CXXFLAGS="$CFLAGS -std=gnu++11 -fpermissive" ./configure --with-curl CFLAGS="-O3 -march=native -Wall" CXXFLAGS="$CFLAGS -std=gnu++11 -fpermissive" ./configure --with-curl
make make
Start mining
cpuminer.exe -a algo -o url -u user -p password
The following tips may be useful for older AMD CPUs. The following tips may be useful for older AMD CPUs.
AMD CPUs older than Piledriver, including Athlon x2 and Phenom II x4, are not AMD CPUs older than Piledriver, including Athlon x2 and Phenom II x4, are not
@@ -121,6 +125,17 @@ Support for even older x86_64 without AES_NI or SSE2 is not availble.
Change Log Change Log
---------- ----------
v3.6.6
added tribus algo for Denarius (DNR)
configure removed from .gitignore. This should allow git clone to compile
on Windows/mingw.
Fixed CPU temperature monitoring on some CPUs (Linux only).
Fixed a compile error on FreeBSD (unsupported YMMV).
v3.6.5 v3.6.5
Cryptonight a little faster. Cryptonight a little faster.

View File

@@ -195,6 +195,7 @@ bool register_algo_gate( int algo, algo_gate_t *gate )
case ALGO_S3: register_s3_algo ( gate ); break; case ALGO_S3: register_s3_algo ( gate ); break;
case ALGO_TIMETRAVEL: register_timetravel_algo ( gate ); break; case ALGO_TIMETRAVEL: register_timetravel_algo ( gate ); break;
case ALGO_TIMETRAVEL10: register_timetravel10_algo( gate ); break; case ALGO_TIMETRAVEL10: register_timetravel10_algo( gate ); break;
case ALGO_TRIBUS: register_tribus_algo ( gate ); break;
case ALGO_VANILLA: register_vanilla_algo ( gate ); break; case ALGO_VANILLA: register_vanilla_algo ( gate ); break;
case ALGO_VELTOR: register_veltor_algo ( gate ); break; case ALGO_VELTOR: register_veltor_algo ( gate ); break;
case ALGO_WHIRLPOOL: register_whirlpool_algo ( gate ); break; case ALGO_WHIRLPOOL: register_whirlpool_algo ( gate ); break;

View File

@@ -99,22 +99,21 @@ void groestl_set_target( struct work* work, double job_diff )
work_set_target( work, job_diff / (256.0 * opt_diff_factor) ); work_set_target( work, job_diff / (256.0 * opt_diff_factor) );
} }
bool register_groestl_algo( algo_gate_t* gate ) bool register_dmd_gr_algo( algo_gate_t* gate )
{ {
init_groestl_ctx(); init_groestl_ctx();
gate->optimizations = SSE2_OPT | AES_OPT; gate->optimizations = SSE2_OPT | AES_OPT;
gate->scanhash = (void*)&scanhash_groestl; gate->scanhash = (void*)&scanhash_groestl;
gate->hash = (void*)&groestlhash; gate->hash = (void*)&groestlhash;
gate->set_target = (void*)&groestl_set_target; gate->set_target = (void*)&groestl_set_target;
gate->gen_merkle_root = (void*)&SHA256_gen_merkle_root;
gate->get_max64 = (void*)&get_max64_0x3ffff; gate->get_max64 = (void*)&get_max64_0x3ffff;
return true; return true;
}; };
bool register_dmd_gr_algo( algo_gate_t* gate ) bool register_groestl_algo( algo_gate_t* gate )
{ {
register_groestl_algo( gate ); register_dmd_gr_algo( gate );
gate->gen_merkle_root = (void*)&sha256d_gen_merkle_root; gate->gen_merkle_root = (void*)&SHA256_gen_merkle_root;
return true; return true;
}; };

View File

@@ -97,13 +97,7 @@ bool hodl_do_this_thread( int thr_id )
int hodl_scanhash( int thr_id, struct work* work, uint32_t max_nonce, int hodl_scanhash( int thr_id, struct work* work, uint32_t max_nonce,
uint64_t *hashes_done ) uint64_t *hashes_done )
{ {
#ifdef NO_AES_NI #ifndef NO_AES_NI
applog( LOG_ERR, "Only CPUs with AES are supported, use legacy version.");
return false;
// GetPsuedoRandomData( hodl_scratchbuf, work->data, thr_id );
// pthread_barrier_wait( &hodl_barrier );
// return scanhash_hodl( thr_id, work, max_nonce, hashes_done );
#else
GenRandomGarbage( hodl_scratchbuf, work->data, thr_id ); GenRandomGarbage( hodl_scratchbuf, work->data, thr_id );
pthread_barrier_wait( &hodl_barrier ); pthread_barrier_wait( &hodl_barrier );
return scanhash_hodl_wolf( thr_id, work, max_nonce, hashes_done ); return scanhash_hodl_wolf( thr_id, work, max_nonce, hashes_done );
@@ -112,6 +106,10 @@ int hodl_scanhash( int thr_id, struct work* work, uint32_t max_nonce,
bool register_hodl_algo( algo_gate_t* gate ) bool register_hodl_algo( algo_gate_t* gate )
{ {
#ifdef NO_AES_NI
applog( LOG_ERR, "Only CPUs with AES are supported, use legacy version.");
return false;
#endif
pthread_barrier_init( &hodl_barrier, NULL, opt_n_threads ); pthread_barrier_init( &hodl_barrier, NULL, opt_n_threads );
gate->optimizations = SSE2_OPT | AES_OPT | AVX_OPT | AVX2_OPT; gate->optimizations = SSE2_OPT | AES_OPT | AVX_OPT | AVX2_OPT;
gate->scanhash = (void*)&hodl_scanhash; gate->scanhash = (void*)&hodl_scanhash;

View File

@@ -4,6 +4,11 @@
//Dependencies //Dependencies
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef __FreeBSD__
#include <sys/endian.h>
#endif
#include "tmmintrin.h" #include "tmmintrin.h"
#include "smmintrin.h" #include "smmintrin.h"

View File

@@ -3,6 +3,11 @@
//Dependencies //Dependencies
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef __FreeBSD__
#include <sys/endian.h>
#endif
#include "tmmintrin.h" #include "tmmintrin.h"
#include "smmintrin.h" #include "smmintrin.h"
#include "immintrin.h" #include "immintrin.h"

143
algo/tribus.c Normal file
View File

@@ -0,0 +1,143 @@
#include "miner.h"
#include "algo-gate-api.h"
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "algo/jh//sph_jh.h"
#include "algo/keccak/sph_keccak.h"
#ifdef NO_AES_NI
#include "algo/echo/sph_echo.h"
#else
#include "algo/echo/aes_ni/hash_api.h"
#endif
typedef struct {
sph_jh512_context jh;
sph_keccak512_context keccak;
#ifdef NO_AES_NI
sph_echo512_context echo;
#else
hashState_echo echo;
#endif
} tribus_ctx_holder;
tribus_ctx_holder tribus_ctx;
void init_tribus_ctx()
{
sph_jh512_init( &tribus_ctx.jh );
sph_keccak512_init( &tribus_ctx.keccak );
#ifdef NO_AES_NI
sph_echo512_init( &tribus_ctx.echo );
#else
init_echo( &tribus_ctx.echo, 512 );
#endif
}
void tribus_hash(void *state, const void *input)
{
unsigned char hash[128] __attribute__ ((aligned (32)));
tribus_ctx_holder ctx;
memcpy( &ctx, &tribus_ctx, sizeof(tribus_ctx) );
sph_jh512( &ctx.jh, input, 80 );
sph_jh512_close( &ctx.jh, (void*) hash );
sph_keccak512( &ctx.keccak, (const void*) hash, 64 );
sph_keccak512_close( &ctx.keccak, (void*) hash );
#ifdef NO_AES_NI
sph_echo512( &ctx.echo, hash, 64 );
sph_echo512_close (&ctx.echo, hash );
#else
update_final_echo( &ctx.echo, (BitSequence *) hash,
(const BitSequence *) hash, 512 );
#endif
memcpy(state, hash, 32);
}
int scanhash_tribus(int thr_id, struct work *work, uint32_t max_nonce, uint64_t *hashes_done)
{
uint32_t _ALIGN(128) hash32[8];
uint32_t _ALIGN(128) endiandata[20];
uint32_t *pdata = work->data;
uint32_t *ptarget = work->target;
const uint32_t first_nonce = pdata[19];
const uint32_t Htarg = ptarget[7];
uint32_t n = pdata[19] - 1;
uint64_t htmax[] = {
0,
0xF,
0xFF,
0xFFF,
0xFFFF,
0x10000000
};
uint32_t masks[] = {
0xFFFFFFFF,
0xFFFFFFF0,
0xFFFFFF00,
0xFFFFF000,
0xFFFF0000,
0
};
// we need bigendian data...
for (int i=0; i < 19; i++) {
be32enc(&endiandata[i], pdata[i]);
}
#ifdef DEBUG_ALGO
printf("[%d] Htarg=%X\n", thr_id, Htarg);
#endif
for (int m=0; m < 6; m++) {
if (Htarg <= htmax[m]) {
uint32_t mask = masks[m];
do {
pdata[19] = ++n;
be32enc(&endiandata[19], n);
tribus_hash(hash32, endiandata);
#ifndef DEBUG_ALGO
if ((!(hash32[7] & mask)) && fulltest(hash32, ptarget)) {
work_set_target_ratio(work, hash32);
*hashes_done = n - first_nonce + 1;
return 1;
}
#else
if (!(n % 0x1000) && !thr_id) printf(".");
if (!(hash32[7] & mask)) {
printf("[%d]",thr_id);
if (fulltest(hash32, ptarget)) {
work_set_target_ratio(work, hash32);
*hashes_done = n - first_nonce + 1;
return 1;
}
}
#endif
} while (n < max_nonce && !work_restart[thr_id].restart);
// see blake.c if else to understand the loop on htmax => mask
break;
}
}
*hashes_done = n - first_nonce + 1;
pdata[19] = n;
return 0;
}
bool register_tribus_algo( algo_gate_t* gate )
{
init_tribus_ctx();
gate->optimizations = SSE2_OPT | AES_OPT;
gate->get_max64 = (void*)&get_max64_0x1ffff;
gate->scanhash = (void*)&scanhash_tribus;
gate->hash = (void*)&tribus_hash;
return true;
};

7605
configure vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
AC_INIT([cpuminer-opt], [3.6.5]) AC_INIT([cpuminer-opt], [3.6.6])
AC_PREREQ([2.59c]) AC_PREREQ([2.59c])
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM

View File

@@ -521,6 +521,7 @@ enum algos {
ALGO_S3, ALGO_S3,
ALGO_TIMETRAVEL, ALGO_TIMETRAVEL,
ALGO_TIMETRAVEL10, ALGO_TIMETRAVEL10,
ALGO_TRIBUS,
ALGO_VANILLA, ALGO_VANILLA,
ALGO_VELTOR, ALGO_VELTOR,
ALGO_WHIRLPOOL, ALGO_WHIRLPOOL,
@@ -585,6 +586,7 @@ static const char* const algo_names[] = {
"s3", "s3",
"timetravel", "timetravel",
"timetravel10", "timetravel10",
"tribus",
"vanilla", "vanilla",
"veltor", "veltor",
"whirlpool", "whirlpool",
@@ -703,6 +705,7 @@ Options:\n\
skein2 Double Skein (Woodcoin)\n\ skein2 Double Skein (Woodcoin)\n\
timetravel timeravel8, Machinecoin (MAC)\n\ timetravel timeravel8, Machinecoin (MAC)\n\
timetravel10 Bitcore (BTX)\n\ timetravel10 Bitcore (BTX)\n\
tribus Denarius (DNR)\n\
vanilla blake256r8vnl (VCash)\n\ vanilla blake256r8vnl (VCash)\n\
veltor\n\ veltor\n\
whirlpool\n\ whirlpool\n\

View File

@@ -19,6 +19,12 @@
"/sys/class/hwmon/hwmon1/temp1_input" "/sys/class/hwmon/hwmon1/temp1_input"
#define HWMON_ALT2 \ #define HWMON_ALT2 \
"/sys/class/hwmon/hwmon0/temp1_input" "/sys/class/hwmon/hwmon0/temp1_input"
#define HWMON_ALT3 \
"/sys/devices/platform/coretemp.0/hwmon/hwmon0/temp2_input"
#define HWMON_ALT4 \
"/sys/class/hwmon/hwmon0/temp2_input"
#define HWMON_ALT5 \
"/sys/class/hwmon/hwmon0/device/temp1_input"
static float linux_cputemp(int core) static float linux_cputemp(int core)
{ {
@@ -32,6 +38,15 @@ static float linux_cputemp(int core)
if (!fd) if (!fd)
fd = fopen(HWMON_ALT2, "r"); fd = fopen(HWMON_ALT2, "r");
if (!fd)
fd = fopen(HWMON_ALT3, "r");
if (!fd)
fd = fopen(HWMON_ALT4, "r");
if (!fd)
fd = fopen(HWMON_ALT5, "r");
if (!fd) if (!fd)
return tc; return tc;