Browse Source

Improve and modularize compile-time CPU detection.

Ideally, we should move this to autoconf.
nfactor-troky
Jeff Garzik 14 years ago committed by Jeff Garzik
parent
commit
86eb37d631
  1. 21
      cpu-miner.c
  2. 4
      miner.h
  3. 7
      sha256_4way.c

21
cpu-miner.c

@ -37,8 +37,8 @@ enum {
}; };
enum sha256_algos { enum sha256_algos {
ALGO_C, ALGO_C, /* plain C */
ALGO_4WAY ALGO_4WAY, /* parallel SSE2 */
}; };
static bool opt_debug; static bool opt_debug;
@ -63,7 +63,7 @@ static struct option_help options_help[] = {
{ "algo XXX", { "algo XXX",
"(-a XXX) Specify sha256 implementation:\n" "(-a XXX) Specify sha256 implementation:\n"
"\tc\t\tLinux kernel sha256, implemented in C (default)" "\tc\t\tLinux kernel sha256, implemented in C (default)"
#ifdef __SSE2__ #ifdef WANT_SSE2_4WAY
"\n\t4way\t\ttcatm's 4-way SSE2 implementation (EXPERIMENTAL)" "\n\t4way\t\ttcatm's 4-way SSE2 implementation (EXPERIMENTAL)"
#endif #endif
}, },
@ -301,18 +301,23 @@ static void *miner_thread(void *thr_id_int)
gettimeofday(&tv_start, NULL); gettimeofday(&tv_start, NULL);
/* scan nonces for a proof-of-work hash */ /* scan nonces for a proof-of-work hash */
if (opt_algo == ALGO_C) switch (opt_algo) {
case ALGO_C:
rc = scanhash(work.midstate, work.data + 64, rc = scanhash(work.midstate, work.data + 64,
work.hash1, work.hash, &hashes_done); work.hash1, work.hash, &hashes_done);
#ifdef __SSE2__ break;
else {
#ifdef WANT_SSE2_4WAY
case ALGO_4WAY: {
unsigned int rc4 = unsigned int rc4 =
ScanHash_4WaySSE2(work.midstate, work.data + 64, ScanHash_4WaySSE2(work.midstate, work.data + 64,
work.hash1, work.hash, work.hash1, work.hash,
&hashes_done); &hashes_done);
rc = (rc4 == -1) ? false : true; rc = (rc4 == -1) ? false : true;
} }
break;
#endif #endif
}
hashmeter(thr_id, &tv_start, hashes_done); hashmeter(thr_id, &tv_start, hashes_done);
@ -347,7 +352,7 @@ static void parse_arg (int key, char *arg)
case 'a': case 'a':
if (!strcmp(arg, "c")) if (!strcmp(arg, "c"))
opt_algo = ALGO_C; opt_algo = ALGO_C;
#ifdef __SSE2__ #ifdef WANT_SSE2_4WAY
else if (!strcmp(arg, "4way")) else if (!strcmp(arg, "4way"))
opt_algo = ALGO_4WAY; opt_algo = ALGO_4WAY;
#endif #endif

4
miner.h

@ -4,6 +4,10 @@
#include <stdbool.h> #include <stdbool.h>
#include <jansson.h> #include <jansson.h>
#ifdef __SSE2__
#define WANT_SSE2_4WAY 1
#endif
#ifndef ARRAY_SIZE #ifndef ARRAY_SIZE
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#endif #endif

7
sha256_4way.c

@ -4,14 +4,15 @@
// tcatm's 4-way 128-bit SSE2 SHA-256 // tcatm's 4-way 128-bit SSE2 SHA-256
#ifdef __SSE2__
#include <string.h> #include <string.h>
#include <assert.h> #include <assert.h>
#include <xmmintrin.h> #include <xmmintrin.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include "miner.h"
#ifdef WANT_SSE2_4WAY
#define NPAR 32 #define NPAR 32
@ -467,4 +468,4 @@ static void DoubleBlockSHA256(const void* pin, void* pad, const void *pre, unsig
} }
#endif /* __SSE2__ */ #endif /* WANT_SSE2_4WAY */

Loading…
Cancel
Save