mirror of
https://github.com/JayDDee/cpuminer-opt.git
synced 2025-09-17 23:44:27 +00:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cdd587537e | ||
![]() |
51a1d91abd | ||
![]() |
13563e2598 | ||
![]() |
9571f85d53 | ||
![]() |
0e69756634 | ||
![]() |
9653bca1e2 | ||
![]() |
1c0719e8a4 | ||
![]() |
8b4b4dc613 | ||
![]() |
e76feaced8 | ||
![]() |
5e088d00d0 |
Binary file not shown.
@@ -257,6 +257,7 @@ cpuminer_SOURCES = \
|
|||||||
algo/x16/hex.c \
|
algo/x16/hex.c \
|
||||||
algo/x16/x21s-4way.c \
|
algo/x16/x21s-4way.c \
|
||||||
algo/x16/x21s.c \
|
algo/x16/x21s.c \
|
||||||
|
algo/x16/minotaur.c \
|
||||||
algo/x17/x17-gate.c \
|
algo/x17/x17-gate.c \
|
||||||
algo/x17/x17.c \
|
algo/x17/x17.c \
|
||||||
algo/x17/x17-4way.c \
|
algo/x17/x17-4way.c \
|
||||||
|
@@ -93,6 +93,7 @@ Supported Algorithms
|
|||||||
lyra2z
|
lyra2z
|
||||||
lyra2z330 Lyra2 330 rows, Zoin (ZOI)
|
lyra2z330 Lyra2 330 rows, Zoin (ZOI)
|
||||||
m7m Magi (XMG)
|
m7m Magi (XMG)
|
||||||
|
minotaur Ringcoin (RNG)
|
||||||
myr-gr Myriad-Groestl
|
myr-gr Myriad-Groestl
|
||||||
neoscrypt NeoScrypt(128, 2, 1)
|
neoscrypt NeoScrypt(128, 2, 1)
|
||||||
nist5 Nist5
|
nist5 Nist5
|
||||||
|
37
README.txt
37
README.txt
@@ -1,8 +1,8 @@
|
|||||||
This file is included in the Windows binary package. Compile instructions
|
This file is included in the Windows binary package. Compile instructions
|
||||||
for Linux and Windows can be found in RELEASE_NOTES.
|
for Linux and Windows can be found in RELEASE_NOTES.
|
||||||
|
|
||||||
cpuminer is a console program that is executed from a DOS command prompt.
|
cpuminer is a console program that is executed from a DOS or Powershell
|
||||||
There is no GUI and no mouse support.
|
prompt. There is no GUI and no mouse support.
|
||||||
|
|
||||||
Miner programs are often flagged as malware by antivirus programs. This is
|
Miner programs are often flagged as malware by antivirus programs. This is
|
||||||
a false positive, they are flagged simply because they are cryptocurrency
|
a false positive, they are flagged simply because they are cryptocurrency
|
||||||
@@ -15,8 +15,8 @@ the features listed at cpuminer startup to ensure you are mining at
|
|||||||
optimum speed using the best available features.
|
optimum speed using the best available features.
|
||||||
|
|
||||||
Architecture names and compile options used are only provided for Intel
|
Architecture names and compile options used are only provided for Intel
|
||||||
Core series. Budget CPUs like Pentium and Celeron are often missing the
|
Core series. Budget CPUs like Pentium and Celeron are often missing some
|
||||||
latest features.
|
features.
|
||||||
|
|
||||||
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
|
||||||
supported by cpuminer-opt due to an incompatible implementation of SSE2 on
|
supported by cpuminer-opt due to an incompatible implementation of SSE2 on
|
||||||
@@ -31,14 +31,29 @@ https://en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures
|
|||||||
https://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures
|
https://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures
|
||||||
|
|
||||||
|
|
||||||
Exe name Compile flags Arch name
|
Exe file name Compile flags Arch name
|
||||||
|
|
||||||
cpuminer-sse2.exe "-msse2" Core2, Nehalem
|
cpuminer-sse2.exe "-msse2" Core2, Nehalem
|
||||||
cpuminer-aes-sse42.exe "-march=westmere" Westmere
|
cpuminer-aes-sse42.exe "-march=westmere" Westmere
|
||||||
cpuminer-avx.exe "-march=corei7-avx" Sandybridge
|
cpuminer-avx.exe "-march=corei7-avx" Sandybridge, Ivybridge
|
||||||
cpuminer-avx2.exe "-march=core-avx2 -maes" Haswell, Skylake, Coffeelake
|
cpuminer-avx2.exe "-march=core-avx2 -maes" Haswell*
|
||||||
cpuminer-avx512.exe "-march=skylake-avx512" Skylake-X, Cascadelake-X
|
cpuminer-avx512.exe "-march=skylake-avx512" Skylake-X, Cascadelake-X
|
||||||
cpuminer-zen "-march=znver1" AMD Ryzen, Threadripper
|
cpuminer-zen.exe "-march=znver1" AMD Ryzen, Threadripper
|
||||||
|
cpuminer-avx512-sha-vaes.exe "-march=icelake-client" Icelake*
|
||||||
|
|
||||||
|
* Haswell includes Broadwell, Skylake, Kabylake, Coffeelake & Cometlake.
|
||||||
|
Icelake is only available on some laptops. Mining with a laptop is not
|
||||||
|
recommended. The icelake build is included in anticipation of Intel eventually
|
||||||
|
releasing a desktop CPU with a microarchitecture newer than Skylake.
|
||||||
|
|
||||||
|
Notes about included DLL files:
|
||||||
|
|
||||||
|
Downloading DLL files from alternative sources presents an inherent
|
||||||
|
security risk if their source is unknown. All DLL files included have
|
||||||
|
been copied from the Ubuntu-20.04 instalation or compiled by me from
|
||||||
|
source code obtained from the author's official repository. The exact
|
||||||
|
procedure is documented in the build instructions for Windows:
|
||||||
|
https://github.com/JayDDee/cpuminer-opt/wiki/Compiling-from-source
|
||||||
|
|
||||||
If you like this software feel free to donate:
|
If you like this software feel free to donate:
|
||||||
|
|
||||||
|
@@ -65,6 +65,70 @@ If not what makes it happen or not happen?
|
|||||||
Change Log
|
Change Log
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
v3.14.3
|
||||||
|
|
||||||
|
#265: more mutex changes to reduce blocking with high thread count.
|
||||||
|
|
||||||
|
#267: fixed hodl algo potential memory alignment issue,
|
||||||
|
add warning when thread count is not valid for mining hodl algo.
|
||||||
|
|
||||||
|
v3.14.2
|
||||||
|
|
||||||
|
The second line of the Share Accepted log is no longer displayed,
|
||||||
|
new Xnonce log is added and other small log tweaks.
|
||||||
|
|
||||||
|
#265: Cleanup use of mutex.
|
||||||
|
|
||||||
|
v3.14.1
|
||||||
|
|
||||||
|
GBT and getwork log changes:
|
||||||
|
fixed missing TTF in New Block log,
|
||||||
|
ntime no longer byte-swapped for display in New Work log,
|
||||||
|
fixed zero effective hash rate in Periodic Report log,
|
||||||
|
deleted "Current block is..." log.
|
||||||
|
|
||||||
|
Renamed stratum "New Job" log to "New Work" to be consistent with the solo
|
||||||
|
version of the log. Added more data to both versions.
|
||||||
|
|
||||||
|
v3.14.0
|
||||||
|
|
||||||
|
Changes to solo mining:
|
||||||
|
- segwit is supported by getblocktemplate,
|
||||||
|
- longpolling is not working and is disabled,
|
||||||
|
- Periodic Report log is output,
|
||||||
|
- New Block log includes TTF estimates,
|
||||||
|
- Stratum thread no longer created when using getwork or GBT.
|
||||||
|
|
||||||
|
Fixed BUG log mining sha256d.
|
||||||
|
|
||||||
|
v3.13.1.1
|
||||||
|
|
||||||
|
Fixed Windows crash mining minotaur algo.
|
||||||
|
|
||||||
|
Fixed GCC 10 compile again.
|
||||||
|
Added -fno-common to testing to be consistent with GCC 10 default.
|
||||||
|
|
||||||
|
v3.13.1
|
||||||
|
|
||||||
|
Added minotaur algo for Ringcoin.
|
||||||
|
|
||||||
|
v3.13.0.1
|
||||||
|
|
||||||
|
Issue #262: Fixed xevan AVX2 invalid shares.
|
||||||
|
|
||||||
|
v3.13.0
|
||||||
|
|
||||||
|
Updated Windows binaries compiled with GCC 9. Included DLLs also updated.
|
||||||
|
Icelake build (cpuminer-avx512-sha-vaes.exe) now included in Windows
|
||||||
|
binaries package.
|
||||||
|
|
||||||
|
No source code changes.
|
||||||
|
|
||||||
|
v3.12.8.2
|
||||||
|
|
||||||
|
Fixed x12 AVX2 rejects.
|
||||||
|
Fixed phi AVX2 crash.
|
||||||
|
|
||||||
v3.12.8.1
|
v3.12.8.1
|
||||||
|
|
||||||
Issue #261: Fixed yescryptr8g invalid shares.
|
Issue #261: Fixed yescryptr8g invalid shares.
|
||||||
|
193
aclocal.m4
vendored
193
aclocal.m4
vendored
@@ -1,6 +1,6 @@
|
|||||||
# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
|
# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
|
|||||||
If you have problems, you may need to regenerate the build system entirely.
|
If you have problems, you may need to regenerate the build system entirely.
|
||||||
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
||||||
|
|
||||||
# Copyright (C) 2002-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2002-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
|
|||||||
# generated from the m4 files accompanying Automake X.Y.
|
# generated from the m4 files accompanying Automake X.Y.
|
||||||
# (This private macro should not be called outside this file.)
|
# (This private macro should not be called outside this file.)
|
||||||
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||||
[am__api_version='1.15'
|
[am__api_version='1.16'
|
||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||||
dnl require some minimum version. Point them to the right macro.
|
dnl require some minimum version. Point them to the right macro.
|
||||||
m4_if([$1], [1.15.1], [],
|
m4_if([$1], [1.16.1], [],
|
||||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
|
|||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||||
[AM_AUTOMAKE_VERSION([1.15.1])dnl
|
[AM_AUTOMAKE_VERSION([1.16.1])dnl
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||||
|
|
||||||
# Figure out how to run the assembler. -*- Autoconf -*-
|
# Figure out how to run the assembler. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -78,7 +78,7 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
|
|||||||
|
|
||||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -130,7 +130,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
|
|||||||
|
|
||||||
# AM_CONDITIONAL -*- Autoconf -*-
|
# AM_CONDITIONAL -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -161,7 +161,7 @@ AC_CONFIG_COMMANDS_PRE(
|
|||||||
Usually this means the macro was only invoked conditionally.]])
|
Usually this means the macro was only invoked conditionally.]])
|
||||||
fi])])
|
fi])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -352,13 +352,12 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
|
|||||||
|
|
||||||
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
# with or without modifications, as long as this notice is preserved.
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
|
||||||
# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
@@ -366,49 +365,41 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
|||||||
# Older Autoconf quotes --file arguments for eval, but not when files
|
# Older Autoconf quotes --file arguments for eval, but not when files
|
||||||
# are listed without --file. Let's play safe and only enable the eval
|
# are listed without --file. Let's play safe and only enable the eval
|
||||||
# if we detect the quoting.
|
# if we detect the quoting.
|
||||||
case $CONFIG_FILES in
|
# TODO: see whether this extra hack can be removed once we start
|
||||||
*\'*) eval set x "$CONFIG_FILES" ;;
|
# requiring Autoconf 2.70 or later.
|
||||||
*) set x $CONFIG_FILES ;;
|
AS_CASE([$CONFIG_FILES],
|
||||||
esac
|
[*\'*], [eval set x "$CONFIG_FILES"],
|
||||||
|
[*], [set x $CONFIG_FILES])
|
||||||
shift
|
shift
|
||||||
for mf
|
# Used to flag and report bootstrapping failures.
|
||||||
|
am_rc=0
|
||||||
|
for am_mf
|
||||||
do
|
do
|
||||||
# Strip MF so we end up with the name of the file.
|
# Strip MF so we end up with the name of the file.
|
||||||
mf=`echo "$mf" | sed -e 's/:.*$//'`
|
am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
|
||||||
# Check whether this is an Automake generated Makefile or not.
|
# Check whether this is an Automake generated Makefile which includes
|
||||||
# We used to match only the files named 'Makefile.in', but
|
# dependency-tracking related rules and includes.
|
||||||
# some people rename them; so instead we look at the file content.
|
# Grep'ing the whole file directly is not great: AIX grep has a line
|
||||||
# Grep'ing the first line is not enough: some people post-process
|
|
||||||
# each Makefile.in and add a new line on top of each file to say so.
|
|
||||||
# Grep'ing the whole file is not good either: AIX grep has a line
|
|
||||||
# limit of 2048, but all sed's we know have understand at least 4000.
|
# limit of 2048, but all sed's we know have understand at least 4000.
|
||||||
if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
|
sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
|
||||||
dirpart=`AS_DIRNAME("$mf")`
|
|| continue
|
||||||
else
|
am_dirpart=`AS_DIRNAME(["$am_mf"])`
|
||||||
continue
|
am_filepart=`AS_BASENAME(["$am_mf"])`
|
||||||
fi
|
AM_RUN_LOG([cd "$am_dirpart" \
|
||||||
# Extract the definition of DEPDIR, am__include, and am__quote
|
&& sed -e '/# am--include-marker/d' "$am_filepart" \
|
||||||
# from the Makefile without running 'make'.
|
| $MAKE -f - am--depfiles]) || am_rc=$?
|
||||||
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
|
|
||||||
test -z "$DEPDIR" && continue
|
|
||||||
am__include=`sed -n 's/^am__include = //p' < "$mf"`
|
|
||||||
test -z "$am__include" && continue
|
|
||||||
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
|
|
||||||
# Find all dependency output files, they are included files with
|
|
||||||
# $(DEPDIR) in their names. We invoke sed twice because it is the
|
|
||||||
# simplest approach to changing $(DEPDIR) to its actual value in the
|
|
||||||
# expansion.
|
|
||||||
for file in `sed -n "
|
|
||||||
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
|
|
||||||
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
|
|
||||||
# Make sure the directory exists.
|
|
||||||
test -f "$dirpart/$file" && continue
|
|
||||||
fdir=`AS_DIRNAME(["$file"])`
|
|
||||||
AS_MKDIR_P([$dirpart/$fdir])
|
|
||||||
# echo "creating $dirpart/$file"
|
|
||||||
echo '# dummy' > "$dirpart/$file"
|
|
||||||
done
|
|
||||||
done
|
done
|
||||||
|
if test $am_rc -ne 0; then
|
||||||
|
AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
|
||||||
|
for automatic dependency tracking. Try re-running configure with the
|
||||||
|
'--disable-dependency-tracking' option to at least be able to build
|
||||||
|
the package (albeit without support for automatic dependency tracking).])
|
||||||
|
fi
|
||||||
|
AS_UNSET([am_dirpart])
|
||||||
|
AS_UNSET([am_filepart])
|
||||||
|
AS_UNSET([am_mf])
|
||||||
|
AS_UNSET([am_rc])
|
||||||
|
rm -f conftest-deps.mk
|
||||||
}
|
}
|
||||||
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
|
|
||||||
@@ -417,18 +408,17 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
|||||||
# -----------------------------
|
# -----------------------------
|
||||||
# This macro should only be invoked once -- use via AC_REQUIRE.
|
# This macro should only be invoked once -- use via AC_REQUIRE.
|
||||||
#
|
#
|
||||||
# This code is only required when automatic dependency tracking
|
# This code is only required when automatic dependency tracking is enabled.
|
||||||
# is enabled. FIXME. This creates each '.P' file that we will
|
# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
|
||||||
# need in order to bootstrap the dependency handling code.
|
# order to bootstrap the dependency handling code.
|
||||||
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
[AC_CONFIG_COMMANDS([depfiles],
|
[AC_CONFIG_COMMANDS([depfiles],
|
||||||
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
|
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
|
[AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
|
||||||
])
|
|
||||||
|
|
||||||
# Do all the work for Automake. -*- Autoconf -*-
|
# Do all the work for Automake. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -515,8 +505,8 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
|
|||||||
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
||||||
# For better backward compatibility. To be removed once Automake 1.9.x
|
# For better backward compatibility. To be removed once Automake 1.9.x
|
||||||
# dies out for good. For more background, see:
|
# dies out for good. For more background, see:
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||||
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
||||||
# We need awk for the "check" target (and possibly the TAP driver). The
|
# We need awk for the "check" target (and possibly the TAP driver). The
|
||||||
# system "awk" is bad on some platforms.
|
# system "awk" is bad on some platforms.
|
||||||
@@ -583,7 +573,7 @@ END
|
|||||||
Aborting the configuration process, to ensure you take notice of the issue.
|
Aborting the configuration process, to ensure you take notice of the issue.
|
||||||
|
|
||||||
You can download and install GNU coreutils to get an 'rm' implementation
|
You can download and install GNU coreutils to get an 'rm' implementation
|
||||||
that behaves properly: <http://www.gnu.org/software/coreutils/>.
|
that behaves properly: <https://www.gnu.org/software/coreutils/>.
|
||||||
|
|
||||||
If you want to complete the configuration process using your problematic
|
If you want to complete the configuration process using your problematic
|
||||||
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
||||||
@@ -625,7 +615,7 @@ for _am_header in $config_headers :; do
|
|||||||
done
|
done
|
||||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -646,7 +636,7 @@ if test x"${install_sh+set}" != xset; then
|
|||||||
fi
|
fi
|
||||||
AC_SUBST([install_sh])])
|
AC_SUBST([install_sh])])
|
||||||
|
|
||||||
# Copyright (C) 2003-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -668,7 +658,7 @@ AC_SUBST([am__leading_dot])])
|
|||||||
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
|
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
|
||||||
# From Jim Meyering
|
# From Jim Meyering
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -703,7 +693,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
|||||||
|
|
||||||
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -711,49 +701,42 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
|||||||
|
|
||||||
# AM_MAKE_INCLUDE()
|
# AM_MAKE_INCLUDE()
|
||||||
# -----------------
|
# -----------------
|
||||||
# Check to see how make treats includes.
|
# Check whether make has an 'include' directive that can support all
|
||||||
|
# the idioms we need for our automatic dependency tracking code.
|
||||||
AC_DEFUN([AM_MAKE_INCLUDE],
|
AC_DEFUN([AM_MAKE_INCLUDE],
|
||||||
[am_make=${MAKE-make}
|
[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
|
||||||
cat > confinc << 'END'
|
cat > confinc.mk << 'END'
|
||||||
am__doit:
|
am__doit:
|
||||||
@echo this is the am__doit target
|
@echo this is the am__doit target >confinc.out
|
||||||
.PHONY: am__doit
|
.PHONY: am__doit
|
||||||
END
|
END
|
||||||
# If we don't find an include directive, just comment out the code.
|
|
||||||
AC_MSG_CHECKING([for style of include used by $am_make])
|
|
||||||
am__include="#"
|
am__include="#"
|
||||||
am__quote=
|
am__quote=
|
||||||
_am_result=none
|
# BSD make does it like this.
|
||||||
# First try GNU make style include.
|
echo '.include "confinc.mk" # ignored' > confmf.BSD
|
||||||
echo "include confinc" > confmf
|
# Other make implementations (GNU, Solaris 10, AIX) do it like this.
|
||||||
# Ignore all kinds of additional output from 'make'.
|
echo 'include confinc.mk # ignored' > confmf.GNU
|
||||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
_am_result=no
|
||||||
*the\ am__doit\ target*)
|
for s in GNU BSD; do
|
||||||
am__include=include
|
AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
|
||||||
am__quote=
|
AS_CASE([$?:`cat confinc.out 2>/dev/null`],
|
||||||
_am_result=GNU
|
['0:this is the am__doit target'],
|
||||||
;;
|
[AS_CASE([$s],
|
||||||
esac
|
[BSD], [am__include='.include' am__quote='"'],
|
||||||
# Now try BSD make style include.
|
[am__include='include' am__quote=''])])
|
||||||
if test "$am__include" = "#"; then
|
if test "$am__include" != "#"; then
|
||||||
echo '.include "confinc"' > confmf
|
_am_result="yes ($s style)"
|
||||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
break
|
||||||
*the\ am__doit\ target*)
|
fi
|
||||||
am__include=.include
|
done
|
||||||
am__quote="\""
|
rm -f confinc.* confmf.*
|
||||||
_am_result=BSD
|
AC_MSG_RESULT([${_am_result}])
|
||||||
;;
|
AC_SUBST([am__include])])
|
||||||
esac
|
AC_SUBST([am__quote])])
|
||||||
fi
|
|
||||||
AC_SUBST([am__include])
|
|
||||||
AC_SUBST([am__quote])
|
|
||||||
AC_MSG_RESULT([$_am_result])
|
|
||||||
rm -f confinc confmf
|
|
||||||
])
|
|
||||||
|
|
||||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -792,7 +775,7 @@ fi
|
|||||||
|
|
||||||
# Helper functions for option handling. -*- Autoconf -*-
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -821,7 +804,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
|
|||||||
AC_DEFUN([_AM_IF_OPTION],
|
AC_DEFUN([_AM_IF_OPTION],
|
||||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -868,7 +851,7 @@ AC_LANG_POP([C])])
|
|||||||
# For backward compatibility.
|
# For backward compatibility.
|
||||||
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -887,7 +870,7 @@ AC_DEFUN([AM_RUN_LOG],
|
|||||||
|
|
||||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2017 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -968,7 +951,7 @@ AC_CONFIG_COMMANDS_PRE(
|
|||||||
rm -f conftest.file
|
rm -f conftest.file
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2009-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2009-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -1028,7 +1011,7 @@ AC_SUBST([AM_BACKSLASH])dnl
|
|||||||
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2001-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -1056,7 +1039,7 @@ fi
|
|||||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||||
|
|
||||||
# Copyright (C) 2006-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2006-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -1075,7 +1058,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
|||||||
|
|
||||||
# Check how to create a tarball. -*- Autoconf -*-
|
# Check how to create a tarball. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2004-2017 Free Software Foundation, Inc.
|
# Copyright (C) 2004-2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
150
algo-gate-api.c
150
algo-gate-api.c
@@ -90,13 +90,157 @@ void algo_not_implemented()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// default null functions
|
// default null functions
|
||||||
|
// deprecated, use generic as default
|
||||||
int null_scanhash()
|
int null_scanhash()
|
||||||
{
|
{
|
||||||
applog(LOG_WARNING,"SWERR: undefined scanhash function in algo_gate");
|
applog(LOG_WARNING,"SWERR: undefined scanhash function in algo_gate");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default generic scanhash can be used in many cases.
|
||||||
|
int scanhash_generic( struct work *work, uint32_t max_nonce,
|
||||||
|
uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
{
|
||||||
|
uint32_t edata[20] __attribute__((aligned(64)));
|
||||||
|
uint32_t hash[8] __attribute__((aligned(64)));
|
||||||
|
uint32_t *pdata = work->data;
|
||||||
|
uint32_t *ptarget = work->target;
|
||||||
|
const uint32_t first_nonce = pdata[19];
|
||||||
|
const uint32_t last_nonce = max_nonce - 1;
|
||||||
|
uint32_t n = first_nonce;
|
||||||
|
const int thr_id = mythr->id;
|
||||||
|
const bool bench = opt_benchmark;
|
||||||
|
|
||||||
|
mm128_bswap32_80( edata, pdata );
|
||||||
|
do
|
||||||
|
{
|
||||||
|
edata[19] = n;
|
||||||
|
if ( likely( algo_gate.hash( hash, edata, thr_id ) ) )
|
||||||
|
if ( unlikely( valid_hash( hash, ptarget ) && !bench ) )
|
||||||
|
{
|
||||||
|
pdata[19] = bswap_32( n );
|
||||||
|
submit_solution( work, hash, mythr );
|
||||||
|
}
|
||||||
|
n++;
|
||||||
|
} while ( n < last_nonce && !work_restart[thr_id].restart );
|
||||||
|
*hashes_done = n - first_nonce;
|
||||||
|
pdata[19] = n;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__AVX2__)
|
||||||
|
|
||||||
|
//int scanhash_4way_64_64( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
|
||||||
|
//int scanhash_4way_64_640( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
|
||||||
|
int scanhash_4way_64in_32out( struct work *work, uint32_t max_nonce,
|
||||||
|
uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
{
|
||||||
|
uint32_t hash32[8*4] __attribute__ ((aligned (64)));
|
||||||
|
uint32_t vdata[20*4] __attribute__ ((aligned (64)));
|
||||||
|
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
||||||
|
uint32_t *hash32_d7 = &(hash32[ 7*4 ]);
|
||||||
|
uint32_t *pdata = work->data;
|
||||||
|
const uint32_t *ptarget = work->target;
|
||||||
|
const uint32_t first_nonce = pdata[19];
|
||||||
|
const uint32_t last_nonce = max_nonce - 4;
|
||||||
|
__m256i *noncev = (__m256i*)vdata + 9;
|
||||||
|
uint32_t n = first_nonce;
|
||||||
|
const int thr_id = mythr->id;
|
||||||
|
const uint32_t targ32_d7 = ptarget[7];
|
||||||
|
const bool bench = opt_benchmark;
|
||||||
|
|
||||||
|
mm256_bswap32_intrlv80_4x64( vdata, pdata );
|
||||||
|
*noncev = mm256_intrlv_blend_32(
|
||||||
|
_mm256_set_epi32( n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( likely( algo_gate.hash( hash32, vdata, thr_id ) ) )
|
||||||
|
for ( int lane = 0; lane < 4; lane++ )
|
||||||
|
if ( unlikely( hash32_d7[ lane ] <= targ32_d7 && !bench ) )
|
||||||
|
{
|
||||||
|
extr_lane_4x32( lane_hash, hash32, lane, 256 );
|
||||||
|
if ( valid_hash( lane_hash, ptarget ) )
|
||||||
|
{
|
||||||
|
pdata[19] = bswap_32( n + lane );
|
||||||
|
submit_solution( work, lane_hash, mythr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*noncev = _mm256_add_epi32( *noncev,
|
||||||
|
m256_const1_64( 0x0000000400000000 ) );
|
||||||
|
n += 4;
|
||||||
|
} while ( likely( ( n <= last_nonce ) && !work_restart[thr_id].restart ) );
|
||||||
|
pdata[19] = n;
|
||||||
|
*hashes_done = n - first_nonce;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//int scanhash_8way_32_32( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVX512F__) && defined(__AVX512VL__) && defined(__AVX512DQ__) && defined(__AVX512BW__)
|
||||||
|
|
||||||
|
//int scanhash_8way_64_64( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
|
||||||
|
//int scanhash_8way_64_640( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
|
||||||
|
int scanhash_8way_64in_32out( struct work *work, uint32_t max_nonce,
|
||||||
|
uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
{
|
||||||
|
uint32_t hash32[8*8] __attribute__ ((aligned (128)));
|
||||||
|
uint32_t vdata[20*8] __attribute__ ((aligned (64)));
|
||||||
|
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
||||||
|
uint32_t *hash32_d7 = &(hash32[7*8]);
|
||||||
|
uint32_t *pdata = work->data;
|
||||||
|
const uint32_t *ptarget = work->target;
|
||||||
|
const uint32_t first_nonce = pdata[19];
|
||||||
|
const uint32_t last_nonce = max_nonce - 8;
|
||||||
|
__m512i *noncev = (__m512i*)vdata + 9;
|
||||||
|
uint32_t n = first_nonce;
|
||||||
|
const int thr_id = mythr->id;
|
||||||
|
const uint32_t targ32_d7 = ptarget[7];
|
||||||
|
const bool bench = opt_benchmark;
|
||||||
|
|
||||||
|
mm512_bswap32_intrlv80_8x64( vdata, pdata );
|
||||||
|
*noncev = mm512_intrlv_blend_32(
|
||||||
|
_mm512_set_epi32( n+7, 0, n+6, 0, n+5, 0, n+4, 0,
|
||||||
|
n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ( likely( algo_gate.hash( hash32, vdata, thr_id ) ) )
|
||||||
|
for ( int lane = 0; lane < 8; lane++ )
|
||||||
|
if ( unlikely( ( hash32_d7[ lane ] <= targ32_d7 ) && !bench ) )
|
||||||
|
{
|
||||||
|
extr_lane_8x32( lane_hash, hash32, lane, 256 );
|
||||||
|
if ( likely( valid_hash( lane_hash, ptarget ) ) )
|
||||||
|
{
|
||||||
|
pdata[19] = bswap_32( n + lane );
|
||||||
|
submit_solution( work, lane_hash, mythr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*noncev = _mm512_add_epi32( *noncev,
|
||||||
|
m512_const1_64( 0x0000000800000000 ) );
|
||||||
|
n += 8;
|
||||||
|
} while ( likely( ( n < last_nonce ) && !work_restart[thr_id].restart ) );
|
||||||
|
pdata[19] = n;
|
||||||
|
*hashes_done = n - first_nonce;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//int scanhash_16way_32_32( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int null_hash()
|
int null_hash()
|
||||||
{
|
{
|
||||||
applog(LOG_WARNING,"SWERR: null_hash unsafe null function");
|
applog(LOG_WARNING,"SWERR: null_hash unsafe null function");
|
||||||
@@ -106,7 +250,7 @@ int null_hash()
|
|||||||
void init_algo_gate( algo_gate_t* gate )
|
void init_algo_gate( algo_gate_t* gate )
|
||||||
{
|
{
|
||||||
gate->miner_thread_init = (void*)&return_true;
|
gate->miner_thread_init = (void*)&return_true;
|
||||||
gate->scanhash = (void*)&null_scanhash;
|
gate->scanhash = (void*)&scanhash_generic;
|
||||||
gate->hash = (void*)&null_hash;
|
gate->hash = (void*)&null_hash;
|
||||||
gate->get_new_work = (void*)&std_get_new_work;
|
gate->get_new_work = (void*)&std_get_new_work;
|
||||||
gate->work_decode = (void*)&std_le_work_decode;
|
gate->work_decode = (void*)&std_le_work_decode;
|
||||||
@@ -179,6 +323,7 @@ bool register_algo_gate( int algo, algo_gate_t *gate )
|
|||||||
case ALGO_LYRA2Z: register_lyra2z_algo ( gate ); break;
|
case ALGO_LYRA2Z: register_lyra2z_algo ( gate ); break;
|
||||||
case ALGO_LYRA2Z330: register_lyra2z330_algo ( gate ); break;
|
case ALGO_LYRA2Z330: register_lyra2z330_algo ( gate ); break;
|
||||||
case ALGO_M7M: register_m7m_algo ( gate ); break;
|
case ALGO_M7M: register_m7m_algo ( gate ); break;
|
||||||
|
case ALGO_MINOTAUR: register_minotaur_algo ( gate ); break;
|
||||||
case ALGO_MYR_GR: register_myriad_algo ( gate ); break;
|
case ALGO_MYR_GR: register_myriad_algo ( gate ); break;
|
||||||
case ALGO_NEOSCRYPT: register_neoscrypt_algo ( gate ); break;
|
case ALGO_NEOSCRYPT: register_neoscrypt_algo ( gate ); break;
|
||||||
case ALGO_NIST5: register_nist5_algo ( gate ); break;
|
case ALGO_NIST5: register_nist5_algo ( gate ); break;
|
||||||
@@ -251,7 +396,6 @@ bool register_algo_gate( int algo, algo_gate_t *gate )
|
|||||||
// restore warnings
|
// restore warnings
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
// run the alternate hash function for a specific algo
|
|
||||||
void exec_hash_function( int algo, void *output, const void *pdata )
|
void exec_hash_function( int algo, void *output, const void *pdata )
|
||||||
{
|
{
|
||||||
algo_gate_t gate;
|
algo_gate_t gate;
|
||||||
|
@@ -110,11 +110,13 @@ inline bool set_excl ( set_t a, set_t b ) { return (a & b) == 0; }
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
// mandatory function, must be overwritten
|
// Mandatory functions, one of these is mandatory. If a generic scanhash
|
||||||
|
// is used a custom hash function must be registered, with a custom scanhash
|
||||||
|
// the custom hash function can be called directly and doesn't need to be
|
||||||
|
// registered in the gate.
|
||||||
int ( *scanhash ) ( struct work*, uint32_t, uint64_t*, struct thr_info* );
|
int ( *scanhash ) ( struct work*, uint32_t, uint64_t*, struct thr_info* );
|
||||||
|
|
||||||
// Deprecated, will be removed
|
int ( *hash ) ( void*, const void*, int );
|
||||||
int ( *hash ) ( void*, const void*, uint32_t ) ;
|
|
||||||
|
|
||||||
//optional, safe to use default in most cases
|
//optional, safe to use default in most cases
|
||||||
|
|
||||||
@@ -126,7 +128,7 @@ bool ( *miner_thread_init ) ( int );
|
|||||||
void ( *get_new_work ) ( struct work*, struct work*, int, uint32_t* );
|
void ( *get_new_work ) ( struct work*, struct work*, int, uint32_t* );
|
||||||
|
|
||||||
// Decode getwork blockheader
|
// Decode getwork blockheader
|
||||||
bool ( *work_decode ) ( const json_t*, struct work* );
|
bool ( *work_decode ) ( struct work* );
|
||||||
|
|
||||||
// Extra getwork data
|
// Extra getwork data
|
||||||
void ( *decode_extra_data ) ( struct work*, uint64_t* );
|
void ( *decode_extra_data ) ( struct work*, uint64_t* );
|
||||||
@@ -201,15 +203,61 @@ void four_way_not_tested();
|
|||||||
#define STD_WORK_DATA_SIZE 128
|
#define STD_WORK_DATA_SIZE 128
|
||||||
#define STD_WORK_CMP_SIZE 76
|
#define STD_WORK_CMP_SIZE 76
|
||||||
|
|
||||||
#define JR2_NONCE_INDEX 39 // 8 bit offset
|
//#define JR2_NONCE_INDEX 39 // 8 bit offset
|
||||||
|
|
||||||
// These indexes are only used with JSON RPC2 and are not gated.
|
// These indexes are only used with JSON RPC2 and are not gated.
|
||||||
#define JR2_WORK_CMP_INDEX_2 43
|
//#define JR2_WORK_CMP_INDEX_2 43
|
||||||
#define JR2_WORK_CMP_SIZE_2 33
|
//#define JR2_WORK_CMP_SIZE_2 33
|
||||||
|
|
||||||
// allways returns failure
|
// deprecated, use generic instead
|
||||||
int null_scanhash();
|
int null_scanhash();
|
||||||
|
|
||||||
|
// Default generic, may be used in many cases.
|
||||||
|
// N-way is more complicated, requires many different implementations
|
||||||
|
// depending on architecture, input format, and output format.
|
||||||
|
// Naming convention is scanhash_[N]way_[input format]in_[output format]out
|
||||||
|
// N = number of lanes
|
||||||
|
// input/output format:
|
||||||
|
// 32: 32 bit interleaved parallel lanes
|
||||||
|
// 64: 64 bit interleaved parallel lanes
|
||||||
|
// 640: input only, not interleaved, contiguous serial 640 bit lanes.
|
||||||
|
// 256: output only, not interleaved, contiguous serial 256 bit lanes.
|
||||||
|
|
||||||
|
int scanhash_generic( struct work *work, uint32_t max_nonce,
|
||||||
|
uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
#if defined(__AVX2__)
|
||||||
|
|
||||||
|
//int scanhash_4way_64in_64out( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
//int scanhash_4way_64in_256out( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
int scanhash_4way_64in_32out( struct work *work, uint32_t max_nonce,
|
||||||
|
uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
//int scanhash_8way_32in_32out( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVX512F__) && defined(__AVX512VL__) && defined(__AVX512DQ__) && defined(__AVX512BW__)
|
||||||
|
|
||||||
|
//int scanhash_8way_64in_64out( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
//int scanhash_8way_64in_256out( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
int scanhash_8way_64in_32out( struct work *work, uint32_t max_nonce,
|
||||||
|
uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
//int scanhash_16way_32in_32out( struct work *work, uint32_t max_nonce,
|
||||||
|
// uint64_t *hashes_done, struct thr_info *mythr );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// displays warning
|
// displays warning
|
||||||
int null_hash ();
|
int null_hash ();
|
||||||
|
|
||||||
@@ -221,8 +269,8 @@ void std_get_new_work( struct work *work, struct work *g_work, int thr_id,
|
|||||||
void sha256d_gen_merkle_root( char *merkle_root, struct stratum_ctx *sctx );
|
void sha256d_gen_merkle_root( char *merkle_root, struct stratum_ctx *sctx );
|
||||||
void SHA256_gen_merkle_root ( char *merkle_root, struct stratum_ctx *sctx );
|
void SHA256_gen_merkle_root ( char *merkle_root, struct stratum_ctx *sctx );
|
||||||
|
|
||||||
bool std_le_work_decode( const json_t *val, struct work *work );
|
bool std_le_work_decode( struct work *work );
|
||||||
bool std_be_work_decode( const json_t *val, struct work *work );
|
bool std_be_work_decode( struct work *work );
|
||||||
|
|
||||||
bool std_le_submit_getwork_result( CURL *curl, struct work *work );
|
bool std_le_submit_getwork_result( CURL *curl, struct work *work );
|
||||||
bool std_be_submit_getwork_result( CURL *curl, struct work *work );
|
bool std_be_submit_getwork_result( CURL *curl, struct work *work );
|
||||||
@@ -257,7 +305,7 @@ int std_get_work_data_size();
|
|||||||
// by calling the algo's register function.
|
// by calling the algo's register function.
|
||||||
bool register_algo_gate( int algo, algo_gate_t *gate );
|
bool register_algo_gate( int algo, algo_gate_t *gate );
|
||||||
|
|
||||||
// Called by algos toverride any default gate functions that are applicable
|
// Called by algos to verride any default gate functions that are applicable
|
||||||
// and do any other algo-specific initialization.
|
// and do any other algo-specific initialization.
|
||||||
// The register functions for all the algos can be declared here to reduce
|
// The register functions for all the algos can be declared here to reduce
|
||||||
// compiler warnings but that's just more work for devs adding new algos.
|
// compiler warnings but that's just more work for devs adding new algos.
|
||||||
|
@@ -78,7 +78,6 @@ void decred_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
|||||||
uint32_t extraheader[32] = { 0 };
|
uint32_t extraheader[32] = { 0 };
|
||||||
int headersize = 0;
|
int headersize = 0;
|
||||||
uint32_t* extradata = (uint32_t*) sctx->xnonce1;
|
uint32_t* extradata = (uint32_t*) sctx->xnonce1;
|
||||||
size_t t;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// getwork over stratum, getwork merkle + header passed in coinb1
|
// getwork over stratum, getwork merkle + header passed in coinb1
|
||||||
@@ -87,9 +86,6 @@ void decred_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
|||||||
sizeof(extraheader) );
|
sizeof(extraheader) );
|
||||||
memcpy( extraheader, &sctx->job.coinbase[32], headersize );
|
memcpy( extraheader, &sctx->job.coinbase[32], headersize );
|
||||||
|
|
||||||
// Increment extranonce2
|
|
||||||
for ( t = 0; t < sctx->xnonce2_size && !( ++sctx->job.xnonce2[t] ); t++ );
|
|
||||||
|
|
||||||
// Assemble block header
|
// Assemble block header
|
||||||
memset( g_work->data, 0, sizeof(g_work->data) );
|
memset( g_work->data, 0, sizeof(g_work->data) );
|
||||||
g_work->data[0] = le32dec( sctx->job.version );
|
g_work->data[0] = le32dec( sctx->job.version );
|
||||||
|
@@ -99,9 +99,13 @@ void hodl_build_block_header( struct work* g_work, uint32_t version,
|
|||||||
// called only by thread 0, saves a backup of g_work
|
// called only by thread 0, saves a backup of g_work
|
||||||
void hodl_get_new_work( struct work* work, struct work* g_work)
|
void hodl_get_new_work( struct work* work, struct work* g_work)
|
||||||
{
|
{
|
||||||
work_free( &hodl_work );
|
pthread_rwlock_rdlock( &g_work_lock );
|
||||||
work_copy( &hodl_work, g_work );
|
|
||||||
hodl_work.data[ algo_gate.nonce_index ] = ( clock() + rand() ) % 9999;
|
work_free( &hodl_work );
|
||||||
|
work_copy( &hodl_work, g_work );
|
||||||
|
hodl_work.data[ algo_gate.nonce_index ] = ( clock() + rand() ) % 9999;
|
||||||
|
|
||||||
|
pthread_rwlock_unlock( &g_work_lock );
|
||||||
}
|
}
|
||||||
|
|
||||||
json_t *hodl_longpoll_rpc_call( CURL *curl, int *err, char* lp_url )
|
json_t *hodl_longpoll_rpc_call( CURL *curl, int *err, char* lp_url )
|
||||||
@@ -155,11 +159,10 @@ bool register_hodl_algo( algo_gate_t* gate )
|
|||||||
applog( LOG_ERR, "Only CPUs with AES are supported, use legacy version.");
|
applog( LOG_ERR, "Only CPUs with AES are supported, use legacy version.");
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
// if ( TOTAL_CHUNKS % opt_n_threads )
|
|
||||||
// {
|
if ( GARBAGE_SIZE % opt_n_threads )
|
||||||
// applog(LOG_ERR,"Thread count must be power of 2.");
|
applog( LOG_WARNING,"WARNING: Thread count must be power of 2. Miner may crash or produce invalid hash!" );
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
pthread_barrier_init( &hodl_barrier, NULL, opt_n_threads );
|
pthread_barrier_init( &hodl_barrier, NULL, opt_n_threads );
|
||||||
gate->optimizations = SSE42_OPT | AES_OPT | AVX2_OPT;
|
gate->optimizations = SSE42_OPT | AES_OPT | AVX2_OPT;
|
||||||
gate->scanhash = (void*)&hodl_scanhash;
|
gate->scanhash = (void*)&hodl_scanhash;
|
||||||
@@ -171,7 +174,7 @@ bool register_hodl_algo( algo_gate_t* gate )
|
|||||||
gate->resync_threads = (void*)&hodl_resync_threads;
|
gate->resync_threads = (void*)&hodl_resync_threads;
|
||||||
gate->do_this_thread = (void*)&hodl_do_this_thread;
|
gate->do_this_thread = (void*)&hodl_do_this_thread;
|
||||||
gate->work_cmp_size = 76;
|
gate->work_cmp_size = 76;
|
||||||
hodl_scratchbuf = (unsigned char*)malloc( 1 << 30 );
|
hodl_scratchbuf = (unsigned char*)_mm_malloc( 1 << 30, 64 );
|
||||||
allow_getwork = false;
|
allow_getwork = false;
|
||||||
opt_target_factor = 8388608.0;
|
opt_target_factor = 8388608.0;
|
||||||
return ( hodl_scratchbuf != NULL );
|
return ( hodl_scratchbuf != NULL );
|
||||||
|
@@ -70,7 +70,7 @@ int scanhash_hodl_wolf( struct work* work, uint32_t max_nonce,
|
|||||||
uint32_t *ptarget = work->target;
|
uint32_t *ptarget = work->target;
|
||||||
int threadNumber = mythr->id;
|
int threadNumber = mythr->id;
|
||||||
CacheEntry *Garbage = (CacheEntry*)hodl_scratchbuf;
|
CacheEntry *Garbage = (CacheEntry*)hodl_scratchbuf;
|
||||||
CacheEntry Cache[AES_PARALLEL_N];
|
CacheEntry Cache[AES_PARALLEL_N] __attribute__ ((aligned (64)));
|
||||||
__m128i* data[AES_PARALLEL_N];
|
__m128i* data[AES_PARALLEL_N];
|
||||||
const __m128i* next[AES_PARALLEL_N];
|
const __m128i* next[AES_PARALLEL_N];
|
||||||
uint32_t CollisionCount = 0;
|
uint32_t CollisionCount = 0;
|
||||||
|
@@ -215,9 +215,6 @@ void phi2_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
|||||||
size_t t;
|
size_t t;
|
||||||
|
|
||||||
algo_gate.gen_merkle_root( merkle_tree, sctx );
|
algo_gate.gen_merkle_root( merkle_tree, sctx );
|
||||||
// Increment extranonce2
|
|
||||||
for ( t = 0; t < sctx->xnonce2_size && !( ++sctx->job.xnonce2[t] ); t++ );
|
|
||||||
// Assemble block header
|
|
||||||
algo_gate.build_block_header( g_work, le32dec( sctx->job.version ),
|
algo_gate.build_block_header( g_work, le32dec( sctx->job.version ),
|
||||||
(uint32_t*) sctx->job.prevhash, (uint32_t*) merkle_tree,
|
(uint32_t*) sctx->job.prevhash, (uint32_t*) merkle_tree,
|
||||||
le32dec( sctx->job.ntime ), le32dec(sctx->job.nbits), NULL );
|
le32dec( sctx->job.ntime ), le32dec(sctx->job.nbits), NULL );
|
||||||
@@ -225,7 +222,6 @@ void phi2_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
|||||||
g_work->data[ 20+t ] = ((uint32_t*)sctx->job.extra)[t];
|
g_work->data[ 20+t ] = ((uint32_t*)sctx->job.extra)[t];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool register_phi2_algo( algo_gate_t* gate )
|
bool register_phi2_algo( algo_gate_t* gate )
|
||||||
{
|
{
|
||||||
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
||||||
|
@@ -156,6 +156,8 @@ int scanhash_zr5( struct work *work, uint32_t max_nonce,
|
|||||||
void zr5_get_new_work( struct work* work, struct work* g_work, int thr_id,
|
void zr5_get_new_work( struct work* work, struct work* g_work, int thr_id,
|
||||||
uint32_t* end_nonce_ptr )
|
uint32_t* end_nonce_ptr )
|
||||||
{
|
{
|
||||||
|
pthread_rwlock_rdlock( &g_work_lock );
|
||||||
|
|
||||||
// ignore POK in first word
|
// ignore POK in first word
|
||||||
const int wkcmp_sz = 72; // (19-1) * sizeof(uint32_t)
|
const int wkcmp_sz = 72; // (19-1) * sizeof(uint32_t)
|
||||||
uint32_t *nonceptr = work->data + algo_gate.nonce_index;
|
uint32_t *nonceptr = work->data + algo_gate.nonce_index;
|
||||||
@@ -171,6 +173,8 @@ void zr5_get_new_work( struct work* work, struct work* g_work, int thr_id,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
++(*nonceptr);
|
++(*nonceptr);
|
||||||
|
|
||||||
|
pthread_rwlock_unlock( &g_work_lock );
|
||||||
}
|
}
|
||||||
|
|
||||||
void zr5_display_pok( struct work* work )
|
void zr5_display_pok( struct work* work )
|
||||||
|
@@ -69,13 +69,9 @@ void lbry_build_block_header( struct work* g_work, uint32_t version,
|
|||||||
void lbry_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
void lbry_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
||||||
{
|
{
|
||||||
unsigned char merkle_root[64] = { 0 };
|
unsigned char merkle_root[64] = { 0 };
|
||||||
size_t t;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
algo_gate.gen_merkle_root( merkle_root, sctx );
|
algo_gate.gen_merkle_root( merkle_root, sctx );
|
||||||
// Increment extranonce2
|
|
||||||
for ( t = 0; t < sctx->xnonce2_size && !( ++sctx->job.xnonce2[t] ); t++ );
|
|
||||||
// Assemble block header
|
|
||||||
|
|
||||||
memset( g_work->data, 0, sizeof(g_work->data) );
|
memset( g_work->data, 0, sizeof(g_work->data) );
|
||||||
g_work->data[0] = le32dec( sctx->job.version );
|
g_work->data[0] = le32dec( sctx->job.version );
|
||||||
|
@@ -479,8 +479,8 @@ static inline void sha256d_ms(uint32_t *hash, uint32_t *W,
|
|||||||
void sha256d_ms_4way(uint32_t *hash, uint32_t *data,
|
void sha256d_ms_4way(uint32_t *hash, uint32_t *data,
|
||||||
const uint32_t *midstate, const uint32_t *prehash);
|
const uint32_t *midstate, const uint32_t *prehash);
|
||||||
|
|
||||||
static inline int scanhash_sha256d_4way(int thr_id, struct work *work,
|
static inline int scanhash_sha256d_4way( struct work *work,
|
||||||
uint32_t max_nonce, uint64_t *hashes_done)
|
uint32_t max_nonce, uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
{
|
{
|
||||||
uint32_t *pdata = work->data;
|
uint32_t *pdata = work->data;
|
||||||
uint32_t *ptarget = work->target;
|
uint32_t *ptarget = work->target;
|
||||||
@@ -492,6 +492,7 @@ static inline int scanhash_sha256d_4way(int thr_id, struct work *work,
|
|||||||
uint32_t n = pdata[19] - 1;
|
uint32_t n = pdata[19] - 1;
|
||||||
const uint32_t first_nonce = pdata[19];
|
const uint32_t first_nonce = pdata[19];
|
||||||
const uint32_t Htarg = ptarget[7];
|
const uint32_t Htarg = ptarget[7];
|
||||||
|
int thr_id = mythr->id;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
memcpy(data, pdata + 16, 64);
|
memcpy(data, pdata + 16, 64);
|
||||||
@@ -521,10 +522,8 @@ static inline int scanhash_sha256d_4way(int thr_id, struct work *work,
|
|||||||
if (swab32(hash[4 * 7 + i]) <= Htarg) {
|
if (swab32(hash[4 * 7 + i]) <= Htarg) {
|
||||||
pdata[19] = data[4 * 3 + i];
|
pdata[19] = data[4 * 3 + i];
|
||||||
sha256d_80_swap(hash, pdata);
|
sha256d_80_swap(hash, pdata);
|
||||||
if (fulltest(hash, ptarget)) {
|
if ( fulltest( hash, ptarget ) && !opt_benchmark )
|
||||||
*hashes_done = n - first_nonce + 1;
|
submit_solution( work, hash, mythr );
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (n < max_nonce && !work_restart[thr_id].restart);
|
} while (n < max_nonce && !work_restart[thr_id].restart);
|
||||||
@@ -541,8 +540,8 @@ static inline int scanhash_sha256d_4way(int thr_id, struct work *work,
|
|||||||
void sha256d_ms_8way(uint32_t *hash, uint32_t *data,
|
void sha256d_ms_8way(uint32_t *hash, uint32_t *data,
|
||||||
const uint32_t *midstate, const uint32_t *prehash);
|
const uint32_t *midstate, const uint32_t *prehash);
|
||||||
|
|
||||||
static inline int scanhash_sha256d_8way(int thr_id, struct work *work,
|
static inline int scanhash_sha256d_8way( struct work *work,
|
||||||
uint32_t max_nonce, uint64_t *hashes_done)
|
uint32_t max_nonce, uint64_t *hashes_done, struct thr_info *mythr )
|
||||||
{
|
{
|
||||||
uint32_t *pdata = work->data;
|
uint32_t *pdata = work->data;
|
||||||
uint32_t *ptarget = work->target;
|
uint32_t *ptarget = work->target;
|
||||||
@@ -554,6 +553,7 @@ static inline int scanhash_sha256d_8way(int thr_id, struct work *work,
|
|||||||
uint32_t n = pdata[19] - 1;
|
uint32_t n = pdata[19] - 1;
|
||||||
const uint32_t first_nonce = pdata[19];
|
const uint32_t first_nonce = pdata[19];
|
||||||
const uint32_t Htarg = ptarget[7];
|
const uint32_t Htarg = ptarget[7];
|
||||||
|
int thr_id = mythr->id;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
memcpy(data, pdata + 16, 64);
|
memcpy(data, pdata + 16, 64);
|
||||||
@@ -583,10 +583,8 @@ static inline int scanhash_sha256d_8way(int thr_id, struct work *work,
|
|||||||
if (swab32(hash[8 * 7 + i]) <= Htarg) {
|
if (swab32(hash[8 * 7 + i]) <= Htarg) {
|
||||||
pdata[19] = data[8 * 3 + i];
|
pdata[19] = data[8 * 3 + i];
|
||||||
sha256d_80_swap(hash, pdata);
|
sha256d_80_swap(hash, pdata);
|
||||||
if (fulltest(hash, ptarget)) {
|
if ( fulltest( hash, ptarget ) && !opt_benchmark )
|
||||||
*hashes_done = n - first_nonce + 1;
|
submit_solution( work, hash, mythr );
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (n < max_nonce && !work_restart[thr_id].restart);
|
} while (n < max_nonce && !work_restart[thr_id].restart);
|
||||||
@@ -614,13 +612,11 @@ int scanhash_sha256d( struct work *work,
|
|||||||
|
|
||||||
#ifdef HAVE_SHA256_8WAY
|
#ifdef HAVE_SHA256_8WAY
|
||||||
if (sha256_use_8way())
|
if (sha256_use_8way())
|
||||||
return scanhash_sha256d_8way(thr_id, work,
|
return scanhash_sha256d_8way( work, max_nonce, hashes_done, mythr );
|
||||||
max_nonce, hashes_done);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SHA256_4WAY
|
#ifdef HAVE_SHA256_4WAY
|
||||||
if (sha256_use_4way())
|
if (sha256_use_4way())
|
||||||
return scanhash_sha256d_4way(thr_id, work,
|
return scanhash_sha256d_4way( work, max_nonce, hashes_done, mythr );
|
||||||
max_nonce, hashes_done);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memcpy(data, pdata + 16, 64);
|
memcpy(data, pdata + 16, 64);
|
||||||
@@ -657,7 +653,7 @@ int scanhash_SHA256d( struct work *work, const uint32_t max_nonce,
|
|||||||
uint32_t n = pdata[19] - 1;
|
uint32_t n = pdata[19] - 1;
|
||||||
const uint32_t first_nonce = pdata[19];
|
const uint32_t first_nonce = pdata[19];
|
||||||
const uint32_t Htarg = ptarget[7];
|
const uint32_t Htarg = ptarget[7];
|
||||||
int thr_id = mythr->id; // thr_id arg is deprecated
|
int thr_id = mythr->id;
|
||||||
|
|
||||||
memcpy( data, pdata, 80 );
|
memcpy( data, pdata, 80 );
|
||||||
|
|
||||||
|
@@ -731,7 +731,7 @@ void skein512_8way_full( skein512_8way_context *sc, void *out, const void *data,
|
|||||||
void
|
void
|
||||||
skein512_8way_prehash64( skein512_8way_context *sc, const void *data )
|
skein512_8way_prehash64( skein512_8way_context *sc, const void *data )
|
||||||
{
|
{
|
||||||
__m512i *vdata = (__m512*)data;
|
__m512i *vdata = (__m512i*)data;
|
||||||
__m512i *buf = sc->buf;
|
__m512i *buf = sc->buf;
|
||||||
buf[0] = vdata[0];
|
buf[0] = vdata[0];
|
||||||
buf[1] = vdata[1];
|
buf[1] = vdata[1];
|
||||||
@@ -1099,6 +1099,7 @@ skein512_4way_final16( skein512_4way_context *sc, void *out, const void *data )
|
|||||||
casti_m256i( out, 7 ) = h7;
|
casti_m256i( out, 7 ) = h7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Broken for 80 bytes, use prehash.
|
||||||
void
|
void
|
||||||
skein256_4way_update(void *cc, const void *data, size_t len)
|
skein256_4way_update(void *cc, const void *data, size_t len)
|
||||||
{
|
{
|
||||||
|
@@ -170,6 +170,9 @@ void x12_8way_hash( void *state, const void *input )
|
|||||||
dintrlv_4x128_512( hash0, hash1, hash2, hash3, vhashA );
|
dintrlv_4x128_512( hash0, hash1, hash2, hash3, vhashA );
|
||||||
dintrlv_4x128_512( hash4, hash5, hash6, hash7, vhashB );
|
dintrlv_4x128_512( hash4, hash5, hash6, hash7, vhashB );
|
||||||
|
|
||||||
|
update_final_echo( &ctx.echo, (BitSequence *)hash0,
|
||||||
|
(const BitSequence *) hash0, 512 );
|
||||||
|
memcpy( &ctx.echo, &x12_8way_ctx.echo, sizeof(hashState_echo) );
|
||||||
update_final_echo( &ctx.echo, (BitSequence *)hash1,
|
update_final_echo( &ctx.echo, (BitSequence *)hash1,
|
||||||
(const BitSequence *) hash1, 512 );
|
(const BitSequence *) hash1, 512 );
|
||||||
memcpy( &ctx.echo, &x12_8way_ctx.echo, sizeof(hashState_echo) );
|
memcpy( &ctx.echo, &x12_8way_ctx.echo, sizeof(hashState_echo) );
|
||||||
@@ -363,6 +366,18 @@ void x12_4way_hash( void *state, const void *input )
|
|||||||
simd_2way_update_close( &ctx.simd, vhash, vhash, 512 );
|
simd_2way_update_close( &ctx.simd, vhash, vhash, 512 );
|
||||||
dintrlv_2x128( hash2, hash3, vhash, 512 );
|
dintrlv_2x128( hash2, hash3, vhash, 512 );
|
||||||
|
|
||||||
|
update_final_echo( &ctx.echo, (BitSequence *)hash0,
|
||||||
|
(const BitSequence *) hash0, 512 );
|
||||||
|
memcpy( &ctx.echo, &x12_4way_ctx.echo, sizeof(hashState_echo) );
|
||||||
|
update_final_echo( &ctx.echo, (BitSequence *)hash1,
|
||||||
|
(const BitSequence *) hash1, 512 );
|
||||||
|
memcpy( &ctx.echo, &x12_4way_ctx.echo, sizeof(hashState_echo) );
|
||||||
|
update_final_echo( &ctx.echo, (BitSequence *)hash2,
|
||||||
|
(const BitSequence *) hash2, 512 );
|
||||||
|
memcpy( &ctx.echo, &x12_4way_ctx.echo, sizeof(hashState_echo) );
|
||||||
|
update_final_echo( &ctx.echo, (BitSequence *)hash3,
|
||||||
|
(const BitSequence *) hash3, 512 );
|
||||||
|
|
||||||
update_and_final_groestl( &ctx.groestl, (char*)hash0, (char*)hash0, 512 );
|
update_and_final_groestl( &ctx.groestl, (char*)hash0, (char*)hash0, 512 );
|
||||||
memcpy( &ctx.groestl, &x12_4way_ctx.groestl, sizeof(hashState_groestl) );
|
memcpy( &ctx.groestl, &x12_4way_ctx.groestl, sizeof(hashState_groestl) );
|
||||||
update_and_final_groestl( &ctx.groestl, (char*)hash1, (char*)hash1, 512 );
|
update_and_final_groestl( &ctx.groestl, (char*)hash1, (char*)hash1, 512 );
|
||||||
|
@@ -251,8 +251,12 @@ void phi1612_4way_hash( void *state, const void *input )
|
|||||||
memcpy( &ctx, &phi1612_4way_ctx, sizeof(phi1612_4way_ctx) );
|
memcpy( &ctx, &phi1612_4way_ctx, sizeof(phi1612_4way_ctx) );
|
||||||
|
|
||||||
// Skein parallel 4way
|
// Skein parallel 4way
|
||||||
skein512_4way_update( &ctx.skein, input, 80 );
|
|
||||||
skein512_4way_close( &ctx.skein, vhash );
|
// skein 4way is broken for 80 bytes
|
||||||
|
// skein512_4way_update( &ctx.skein, input, 80 );
|
||||||
|
// skein512_4way_close( &ctx.skein, vhash );
|
||||||
|
skein512_4way_prehash64( &ctx.skein, input );
|
||||||
|
skein512_4way_final16( &ctx.skein, vhash, input + (64*4) );
|
||||||
|
|
||||||
// JH
|
// JH
|
||||||
jh512_4way_update( &ctx.jh, vhash, 64 );
|
jh512_4way_update( &ctx.jh, vhash, 64 );
|
||||||
|
258
algo/x16/minotaur.c
Normal file
258
algo/x16/minotaur.c
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
// Minotaur hash
|
||||||
|
|
||||||
|
#include "algo-gate-api.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "algo/blake/sph_blake.h"
|
||||||
|
#include "algo/bmw/sph_bmw.h"
|
||||||
|
#include "algo/jh/sph_jh.h"
|
||||||
|
#include "algo/keccak/sph_keccak.h"
|
||||||
|
#include "algo/skein/sph_skein.h"
|
||||||
|
#include "algo/shavite/sph_shavite.h"
|
||||||
|
#include "algo/luffa/luffa_for_sse2.h"
|
||||||
|
#include "algo/cubehash/cubehash_sse2.h"
|
||||||
|
#include "algo/simd/nist.h"
|
||||||
|
#include "algo/hamsi/sph_hamsi.h"
|
||||||
|
#include "algo/fugue/sph_fugue.h"
|
||||||
|
#include "algo/shabal/sph_shabal.h"
|
||||||
|
#include "algo/whirlpool/sph_whirlpool.h"
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
#if defined(__AES__)
|
||||||
|
#include "algo/echo/aes_ni/hash_api.h"
|
||||||
|
#include "algo/groestl/aes_ni/hash-groestl.h"
|
||||||
|
#else
|
||||||
|
#include "algo/echo/sph_echo.h"
|
||||||
|
#include "algo/groestl/sph_groestl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Config
|
||||||
|
#define MINOTAUR_ALGO_COUNT 16
|
||||||
|
|
||||||
|
typedef struct TortureNode TortureNode;
|
||||||
|
typedef struct TortureGarden TortureGarden;
|
||||||
|
|
||||||
|
// Graph of hash algos plus SPH contexts
|
||||||
|
struct TortureGarden {
|
||||||
|
#if defined(__AES__)
|
||||||
|
hashState_echo echo;
|
||||||
|
hashState_groestl groestl;
|
||||||
|
#else
|
||||||
|
sph_echo512_context echo;
|
||||||
|
sph_groestl512_context groestl;
|
||||||
|
#endif
|
||||||
|
sph_blake512_context blake;
|
||||||
|
sph_bmw512_context bmw;
|
||||||
|
sph_skein512_context skein;
|
||||||
|
sph_jh512_context jh;
|
||||||
|
sph_keccak512_context keccak;
|
||||||
|
hashState_luffa luffa;
|
||||||
|
cubehashParam cube;
|
||||||
|
shavite512_context shavite;
|
||||||
|
hashState_sd simd;
|
||||||
|
sph_hamsi512_context hamsi;
|
||||||
|
sph_fugue512_context fugue;
|
||||||
|
sph_shabal512_context shabal;
|
||||||
|
sph_whirlpool_context whirlpool;
|
||||||
|
SHA512_CTX sha512;
|
||||||
|
|
||||||
|
struct TortureNode {
|
||||||
|
unsigned int algo;
|
||||||
|
TortureNode *childLeft;
|
||||||
|
TortureNode *childRight;
|
||||||
|
} nodes[22];
|
||||||
|
} __attribute__ ((aligned (64)));
|
||||||
|
|
||||||
|
// Get a 64-byte hash for given 64-byte input, using given TortureGarden contexts and given algo index
|
||||||
|
static void get_hash( void *output, const void *input, TortureGarden *garden,
|
||||||
|
unsigned int algo )
|
||||||
|
{
|
||||||
|
unsigned char hash[64] __attribute__ ((aligned (64)));
|
||||||
|
|
||||||
|
switch (algo) {
|
||||||
|
case 0:
|
||||||
|
sph_blake512_init(&garden->blake);
|
||||||
|
sph_blake512(&garden->blake, input, 64);
|
||||||
|
sph_blake512_close(&garden->blake, hash);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
sph_bmw512_init(&garden->bmw);
|
||||||
|
sph_bmw512(&garden->bmw, input, 64);
|
||||||
|
sph_bmw512_close(&garden->bmw, hash);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
cubehashInit( &garden->cube, 512, 16, 32 );
|
||||||
|
cubehashUpdateDigest( &garden->cube, (byte*)hash,
|
||||||
|
(const byte*)input, 64 );
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
#if defined(__AES__)
|
||||||
|
echo_full( &garden->echo, (BitSequence *)hash, 512,
|
||||||
|
(const BitSequence *)input, 64 );
|
||||||
|
#else
|
||||||
|
sph_echo512_init(&garden->echo);
|
||||||
|
sph_echo512(&garden->echo, input, 64);
|
||||||
|
sph_echo512_close(&garden->echo, hash);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
sph_fugue512_init(&garden->fugue);
|
||||||
|
sph_fugue512(&garden->fugue, input, 64);
|
||||||
|
sph_fugue512_close(&garden->fugue, hash);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
#if defined(__AES__)
|
||||||
|
groestl512_full( &garden->groestl, (char*)hash, (char*)input, 512 );
|
||||||
|
#else
|
||||||
|
sph_groestl512_init(&garden->groestl);
|
||||||
|
sph_groestl512(&garden->groestl, input, 64);
|
||||||
|
sph_groestl512_close(&garden->groestl, hash);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
sph_hamsi512_init(&garden->hamsi);
|
||||||
|
sph_hamsi512(&garden->hamsi, input, 64);
|
||||||
|
sph_hamsi512_close(&garden->hamsi, hash);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
SHA512_Init( &garden->sha512 );
|
||||||
|
SHA512_Update( &garden->sha512, input, 64 );
|
||||||
|
SHA512_Final( (unsigned char*)hash, &garden->sha512 );
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
sph_jh512_init(&garden->jh);
|
||||||
|
sph_jh512(&garden->jh, input, 64);
|
||||||
|
sph_jh512_close(&garden->jh, hash);
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
sph_keccak512_init(&garden->keccak);
|
||||||
|
sph_keccak512(&garden->keccak, input, 64);
|
||||||
|
sph_keccak512_close(&garden->keccak, hash);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
init_luffa( &garden->luffa, 512 );
|
||||||
|
update_and_final_luffa( &garden->luffa, (BitSequence*)hash,
|
||||||
|
(const BitSequence*)input, 64 );
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
sph_shabal512_init(&garden->shabal);
|
||||||
|
sph_shabal512(&garden->shabal, input, 64);
|
||||||
|
sph_shabal512_close(&garden->shabal, hash);
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
sph_shavite512_init(&garden->shavite);
|
||||||
|
sph_shavite512(&garden->shavite, input, 64);
|
||||||
|
sph_shavite512_close(&garden->shavite, hash);
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
init_sd( &garden->simd, 512 );
|
||||||
|
update_final_sd( &garden->simd, (BitSequence *)hash,
|
||||||
|
(const BitSequence*)input, 512 );
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
sph_skein512_init(&garden->skein);
|
||||||
|
sph_skein512(&garden->skein, input, 64);
|
||||||
|
sph_skein512_close(&garden->skein, hash);
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
sph_whirlpool_init(&garden->whirlpool);
|
||||||
|
sph_whirlpool(&garden->whirlpool, input, 64);
|
||||||
|
sph_whirlpool_close(&garden->whirlpool, hash);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output the hash
|
||||||
|
memcpy(output, hash, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recursively traverse a given torture garden starting with a given hash and given node within the garden. The hash is overwritten with the final hash.
|
||||||
|
static void traverse_garden( TortureGarden *garden, void *hash,
|
||||||
|
TortureNode *node )
|
||||||
|
{
|
||||||
|
unsigned char partialHash[64] __attribute__ ((aligned (64)));
|
||||||
|
get_hash(partialHash, hash, garden, node->algo);
|
||||||
|
|
||||||
|
if ( partialHash[63] % 2 == 0 )
|
||||||
|
{ // Last byte of output hash is even
|
||||||
|
if ( node->childLeft != NULL )
|
||||||
|
traverse_garden( garden, partialHash, node->childLeft );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Last byte of output hash is odd
|
||||||
|
if ( node->childRight != NULL )
|
||||||
|
traverse_garden( garden, partialHash, node->childRight );
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy( hash, partialHash, 64 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Associate child nodes with a parent node
|
||||||
|
static inline void link_nodes( TortureNode *parent, TortureNode *childLeft,
|
||||||
|
TortureNode *childRight )
|
||||||
|
{
|
||||||
|
parent->childLeft = childLeft;
|
||||||
|
parent->childRight = childRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __thread TortureGarden garden;
|
||||||
|
|
||||||
|
bool initialize_torture_garden()
|
||||||
|
{
|
||||||
|
// Create torture garden nodes. Note that both sides of 19 and 20 lead to 21, and 21 has no children (to make traversal complete).
|
||||||
|
link_nodes(&garden.nodes[0], &garden.nodes[1], &garden.nodes[2]);
|
||||||
|
link_nodes(&garden.nodes[1], &garden.nodes[3], &garden.nodes[4]);
|
||||||
|
link_nodes(&garden.nodes[2], &garden.nodes[5], &garden.nodes[6]);
|
||||||
|
link_nodes(&garden.nodes[3], &garden.nodes[7], &garden.nodes[8]);
|
||||||
|
link_nodes(&garden.nodes[4], &garden.nodes[9], &garden.nodes[10]);
|
||||||
|
link_nodes(&garden.nodes[5], &garden.nodes[11], &garden.nodes[12]);
|
||||||
|
link_nodes(&garden.nodes[6], &garden.nodes[13], &garden.nodes[14]);
|
||||||
|
link_nodes(&garden.nodes[7], &garden.nodes[15], &garden.nodes[16]);
|
||||||
|
link_nodes(&garden.nodes[8], &garden.nodes[15], &garden.nodes[16]);
|
||||||
|
link_nodes(&garden.nodes[9], &garden.nodes[15], &garden.nodes[16]);
|
||||||
|
link_nodes(&garden.nodes[10], &garden.nodes[15], &garden.nodes[16]);
|
||||||
|
link_nodes(&garden.nodes[11], &garden.nodes[17], &garden.nodes[18]);
|
||||||
|
link_nodes(&garden.nodes[12], &garden.nodes[17], &garden.nodes[18]);
|
||||||
|
link_nodes(&garden.nodes[13], &garden.nodes[17], &garden.nodes[18]);
|
||||||
|
link_nodes(&garden.nodes[14], &garden.nodes[17], &garden.nodes[18]);
|
||||||
|
link_nodes(&garden.nodes[15], &garden.nodes[19], &garden.nodes[20]);
|
||||||
|
link_nodes(&garden.nodes[16], &garden.nodes[19], &garden.nodes[20]);
|
||||||
|
link_nodes(&garden.nodes[17], &garden.nodes[19], &garden.nodes[20]);
|
||||||
|
link_nodes(&garden.nodes[18], &garden.nodes[19], &garden.nodes[20]);
|
||||||
|
link_nodes(&garden.nodes[19], &garden.nodes[21], &garden.nodes[21]);
|
||||||
|
link_nodes(&garden.nodes[20], &garden.nodes[21], &garden.nodes[21]);
|
||||||
|
garden.nodes[21].childLeft = NULL;
|
||||||
|
garden.nodes[21].childRight = NULL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Produce a 32-byte hash from 80-byte input data
|
||||||
|
int minotaur_hash( void *output, const void *input, int thr_id )
|
||||||
|
{
|
||||||
|
unsigned char hash[64] __attribute__ ((aligned (64)));
|
||||||
|
|
||||||
|
// Find initial sha512 hash
|
||||||
|
SHA512_Init( &garden.sha512 );
|
||||||
|
SHA512_Update( &garden.sha512, input, 80 );
|
||||||
|
SHA512_Final( (unsigned char*) hash, &garden.sha512 );
|
||||||
|
|
||||||
|
// Assign algos to torture garden nodes based on initial hash
|
||||||
|
for ( int i = 0; i < 22; i++ )
|
||||||
|
garden.nodes[i].algo = hash[i] % MINOTAUR_ALGO_COUNT;
|
||||||
|
|
||||||
|
// Send the initial hash through the torture garden
|
||||||
|
traverse_garden( &garden, hash, &garden.nodes[0] );
|
||||||
|
|
||||||
|
memcpy( output, hash, 32 );
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool register_minotaur_algo( algo_gate_t* gate )
|
||||||
|
{
|
||||||
|
gate->hash = (void*)&minotaur_hash;
|
||||||
|
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT;
|
||||||
|
gate->miner_thread_init = (void*)&initialize_torture_garden;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
@@ -135,18 +135,16 @@ void x16rt_getAlgoString( const uint32_t *timeHash, char *output)
|
|||||||
|
|
||||||
void veil_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
void veil_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
||||||
{
|
{
|
||||||
|
uint32_t merkleroothash[8];
|
||||||
|
uint32_t witmerkleroothash[8];
|
||||||
|
uint32_t denom10[8];
|
||||||
|
uint32_t denom100[8];
|
||||||
|
uint32_t denom1000[8];
|
||||||
|
uint32_t denom10000[8];
|
||||||
|
int i;
|
||||||
uchar merkle_tree[64] = { 0 };
|
uchar merkle_tree[64] = { 0 };
|
||||||
size_t t;
|
|
||||||
|
|
||||||
algo_gate.gen_merkle_root( merkle_tree, sctx );
|
algo_gate.gen_merkle_root( merkle_tree, sctx );
|
||||||
// Increment extranonce2
|
|
||||||
for ( t = 0; t < sctx->xnonce2_size && !( ++sctx->job.xnonce2[t] ); t++ );
|
|
||||||
|
|
||||||
// Assemble block header
|
|
||||||
// algo_gate.build_block_header( g_work, le32dec( sctx->job.version ),
|
|
||||||
// (uint32_t*) sctx->job.prevhash, (uint32_t*) merkle_tree,
|
|
||||||
// le32dec( sctx->job.ntime ), le32dec(sctx->job.nbits) );
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memset( g_work->data, 0, sizeof(g_work->data) );
|
memset( g_work->data, 0, sizeof(g_work->data) );
|
||||||
g_work->data[0] = le32dec( sctx->job.version );
|
g_work->data[0] = le32dec( sctx->job.version );
|
||||||
@@ -164,35 +162,35 @@ void veil_build_extraheader( struct work* g_work, struct stratum_ctx* sctx )
|
|||||||
g_work->data[31] = 0x00000280;
|
g_work->data[31] = 0x00000280;
|
||||||
|
|
||||||
for ( i = 0; i < 8; i++ )
|
for ( i = 0; i < 8; i++ )
|
||||||
g_work->merkleroothash[7 - i] = be32dec((uint32_t *)merkle_tree + i);
|
merkleroothash[7 - i] = be32dec((uint32_t *)merkle_tree + i);
|
||||||
for ( i = 0; i < 8; i++ )
|
for ( i = 0; i < 8; i++ )
|
||||||
g_work->witmerkleroothash[7 - i] = be32dec((uint32_t *)merkle_tree + i);
|
witmerkleroothash[7 - i] = be32dec((uint32_t *)merkle_tree + i);
|
||||||
for ( i = 0; i < 8; i++ )
|
for ( i = 0; i < 8; i++ )
|
||||||
g_work->denom10[i] = le32dec((uint32_t *)sctx->job.denom10 + i);
|
denom10[i] = le32dec((uint32_t *)sctx->job.denom10 + i);
|
||||||
for ( i = 0; i < 8; i++ )
|
for ( i = 0; i < 8; i++ )
|
||||||
g_work->denom100[i] = le32dec((uint32_t *)sctx->job.denom100 + i);
|
denom100[i] = le32dec((uint32_t *)sctx->job.denom100 + i);
|
||||||
for ( i = 0; i < 8; i++ )
|
for ( i = 0; i < 8; i++ )
|
||||||
g_work->denom1000[i] = le32dec((uint32_t *)sctx->job.denom1000 + i);
|
denom1000[i] = le32dec((uint32_t *)sctx->job.denom1000 + i);
|
||||||
for ( i = 0; i < 8; i++ )
|
for ( i = 0; i < 8; i++ )
|
||||||
g_work->denom10000[i] = le32dec((uint32_t *)sctx->job.denom10000 + i);
|
denom10000[i] = le32dec((uint32_t *)sctx->job.denom10000 + i);
|
||||||
|
|
||||||
uint32_t pofnhash[8];
|
uint32_t pofnhash[8];
|
||||||
memset(pofnhash, 0x00, 32);
|
memset(pofnhash, 0x00, 32);
|
||||||
|
|
||||||
char denom10_str [ 2 * sizeof( g_work->denom10 ) + 1 ];
|
char denom10_str [ 2 * sizeof( denom10 ) + 1 ];
|
||||||
char denom100_str [ 2 * sizeof( g_work->denom100 ) + 1 ];
|
char denom100_str [ 2 * sizeof( denom100 ) + 1 ];
|
||||||
char denom1000_str [ 2 * sizeof( g_work->denom1000 ) + 1 ];
|
char denom1000_str [ 2 * sizeof( denom1000 ) + 1 ];
|
||||||
char denom10000_str [ 2 * sizeof( g_work->denom10000 ) + 1 ];
|
char denom10000_str [ 2 * sizeof( denom10000 ) + 1 ];
|
||||||
char merkleroot_str [ 2 * sizeof( g_work->merkleroothash ) + 1 ];
|
char merkleroot_str [ 2 * sizeof( merkleroothash ) + 1 ];
|
||||||
char witmerkleroot_str[ 2 * sizeof( g_work->witmerkleroothash ) + 1 ];
|
char witmerkleroot_str[ 2 * sizeof( witmerkleroothash ) + 1 ];
|
||||||
char pofn_str [ 2 * sizeof( pofnhash ) + 1 ];
|
char pofn_str [ 2 * sizeof( pofnhash ) + 1 ];
|
||||||
|
|
||||||
cbin2hex( denom10_str, (char*) g_work->denom10, 32 );
|
cbin2hex( denom10_str, (char*) denom10, 32 );
|
||||||
cbin2hex( denom100_str, (char*) g_work->denom100, 32 );
|
cbin2hex( denom100_str, (char*) denom100, 32 );
|
||||||
cbin2hex( denom1000_str, (char*) g_work->denom1000, 32 );
|
cbin2hex( denom1000_str, (char*) denom1000, 32 );
|
||||||
cbin2hex( denom10000_str, (char*) g_work->denom10000, 32 );
|
cbin2hex( denom10000_str, (char*) denom10000, 32 );
|
||||||
cbin2hex( merkleroot_str, (char*) g_work->merkleroothash, 32 );
|
cbin2hex( merkleroot_str, (char*) merkleroothash, 32 );
|
||||||
cbin2hex( witmerkleroot_str, (char*) g_work->witmerkleroothash, 32 );
|
cbin2hex( witmerkleroot_str, (char*) witmerkleroothash, 32 );
|
||||||
cbin2hex( pofn_str, (char*) pofnhash, 32 );
|
cbin2hex( pofn_str, (char*) pofnhash, 32 );
|
||||||
|
|
||||||
if ( true )
|
if ( true )
|
||||||
|
@@ -58,7 +58,7 @@ union _sonoa_8way_context_overlay
|
|||||||
|
|
||||||
typedef union _sonoa_8way_context_overlay sonoa_8way_context_overlay;
|
typedef union _sonoa_8way_context_overlay sonoa_8way_context_overlay;
|
||||||
|
|
||||||
int sonoa_8way_hash( void *state, const void *input, int thrid )
|
int sonoa_8way_hash( void *state, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint64_t vhash[8*8] __attribute__ ((aligned (128)));
|
uint64_t vhash[8*8] __attribute__ ((aligned (128)));
|
||||||
uint64_t vhashA[8*8] __attribute__ ((aligned (64)));
|
uint64_t vhashA[8*8] __attribute__ ((aligned (64)));
|
||||||
@@ -186,7 +186,7 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 2
|
// 2
|
||||||
|
|
||||||
bmw512_8way_full( &ctx.bmw, vhash, vhash, 64 );
|
bmw512_8way_full( &ctx.bmw, vhash, vhash, 64 );
|
||||||
@@ -302,7 +302,7 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
hamsi512_8way_update( &ctx.hamsi, vhash, 64 );
|
hamsi512_8way_update( &ctx.hamsi, vhash, 64 );
|
||||||
hamsi512_8way_close( &ctx.hamsi, vhash );
|
hamsi512_8way_close( &ctx.hamsi, vhash );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 3
|
// 3
|
||||||
|
|
||||||
bmw512_8way_full( &ctx.bmw, vhash, vhash, 64 );
|
bmw512_8way_full( &ctx.bmw, vhash, vhash, 64 );
|
||||||
@@ -432,7 +432,7 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
sph_fugue512_full( &ctx.fugue, hash6, hash6, 64 );
|
sph_fugue512_full( &ctx.fugue, hash6, hash6, 64 );
|
||||||
sph_fugue512_full( &ctx.fugue, hash7, hash7, 64 );
|
sph_fugue512_full( &ctx.fugue, hash7, hash7, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 4
|
// 4
|
||||||
|
|
||||||
intrlv_8x64_512( vhash, hash0, hash1, hash2, hash3, hash4, hash5, hash6,
|
intrlv_8x64_512( vhash, hash0, hash1, hash2, hash3, hash4, hash5, hash6,
|
||||||
@@ -630,7 +630,7 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 5
|
// 5
|
||||||
|
|
||||||
bmw512_8way_full( &ctx.bmw, vhash, vhash, 64 );
|
bmw512_8way_full( &ctx.bmw, vhash, vhash, 64 );
|
||||||
@@ -783,7 +783,7 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
sph_whirlpool512_full( &ctx.whirlpool, hash6, hash6, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash6, hash6, 64 );
|
||||||
sph_whirlpool512_full( &ctx.whirlpool, hash7, hash7, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash7, hash7, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 6
|
// 6
|
||||||
|
|
||||||
intrlv_8x64_512( vhash, hash0, hash1, hash2, hash3, hash4, hash5, hash6,
|
intrlv_8x64_512( vhash, hash0, hash1, hash2, hash3, hash4, hash5, hash6,
|
||||||
@@ -952,7 +952,7 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
sph_whirlpool512_full( &ctx.whirlpool, hash6, hash6, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash6, hash6, 64 );
|
||||||
sph_whirlpool512_full( &ctx.whirlpool, hash7, hash7, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash7, hash7, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 7
|
// 7
|
||||||
|
|
||||||
intrlv_8x64_512( vhash, hash0, hash1, hash2, hash3, hash4, hash5, hash6,
|
intrlv_8x64_512( vhash, hash0, hash1, hash2, hash3, hash4, hash5, hash6,
|
||||||
@@ -1118,49 +1118,6 @@ int sonoa_8way_hash( void *state, const void *input, int thrid )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanhash_sonoa_8way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr )
|
|
||||||
{
|
|
||||||
uint32_t hash[8*16] __attribute__ ((aligned (128)));
|
|
||||||
uint32_t vdata[20*8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t *hashd7 = &(hash[7<<3]);
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
const uint32_t *ptarget = work->target;
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const uint32_t last_nonce = max_nonce - 8;
|
|
||||||
__m512i *noncev = (__m512i*)vdata + 9; // aligned
|
|
||||||
uint32_t n = first_nonce;
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const uint32_t targ32 = ptarget[7];
|
|
||||||
|
|
||||||
mm512_bswap32_intrlv80_8x64( vdata, pdata );
|
|
||||||
*noncev = mm512_intrlv_blend_32(
|
|
||||||
_mm512_set_epi32( n+7, 0, n+6, 0, n+5, 0, n+4, 0,
|
|
||||||
n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ( sonoa_8way_hash( hash, vdata, thr_id ) )
|
|
||||||
for ( int lane = 0; lane < 8; lane++ )
|
|
||||||
if unlikely( ( hashd7[ lane ] <= targ32 ) )
|
|
||||||
{
|
|
||||||
extr_lane_8x32( lane_hash, hash, lane, 256 );
|
|
||||||
if ( likely( valid_hash( lane_hash, ptarget ) && !opt_benchmark ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n + lane );
|
|
||||||
submit_solution( work, lane_hash, mythr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*noncev = _mm512_add_epi32( *noncev,
|
|
||||||
m512_const1_64( 0x0000000800000000 ) );
|
|
||||||
n += 8;
|
|
||||||
} while ( likely( ( n < last_nonce ) && !work_restart[thr_id].restart ) );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(SONOA_4WAY)
|
#elif defined(SONOA_4WAY)
|
||||||
|
|
||||||
union _sonoa_4way_context_overlay
|
union _sonoa_4way_context_overlay
|
||||||
@@ -1186,7 +1143,7 @@ union _sonoa_4way_context_overlay
|
|||||||
|
|
||||||
typedef union _sonoa_4way_context_overlay sonoa_4way_context_overlay;
|
typedef union _sonoa_4way_context_overlay sonoa_4way_context_overlay;
|
||||||
|
|
||||||
int sonoa_4way_hash( void *state, const void *input, int thrid )
|
int sonoa_4way_hash( void *state, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint64_t hash0[8] __attribute__ ((aligned (64)));
|
uint64_t hash0[8] __attribute__ ((aligned (64)));
|
||||||
uint64_t hash1[8] __attribute__ ((aligned (64)));
|
uint64_t hash1[8] __attribute__ ((aligned (64)));
|
||||||
@@ -1250,7 +1207,7 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
echo_full( &ctx.echo, (BitSequence *)hash3, 512,
|
echo_full( &ctx.echo, (BitSequence *)hash3, 512,
|
||||||
(const BitSequence *)hash3, 64 );
|
(const BitSequence *)hash3, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 2
|
// 2
|
||||||
|
|
||||||
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
||||||
@@ -1310,7 +1267,7 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
hamsi512_4way_update( &ctx.hamsi, vhash, 64 );
|
hamsi512_4way_update( &ctx.hamsi, vhash, 64 );
|
||||||
hamsi512_4way_close( &ctx.hamsi, vhash );
|
hamsi512_4way_close( &ctx.hamsi, vhash );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 3
|
// 3
|
||||||
|
|
||||||
bmw512_4way_init( &ctx.bmw );
|
bmw512_4way_init( &ctx.bmw );
|
||||||
@@ -1375,7 +1332,7 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
sph_fugue512_full( &ctx.fugue, hash2, hash2, 64 );
|
sph_fugue512_full( &ctx.fugue, hash2, hash2, 64 );
|
||||||
sph_fugue512_full( &ctx.fugue, hash3, hash3, 64 );
|
sph_fugue512_full( &ctx.fugue, hash3, hash3, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 4
|
// 4
|
||||||
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
||||||
|
|
||||||
@@ -1472,7 +1429,7 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
shavite512_2way_init( &ctx.shavite );
|
shavite512_2way_init( &ctx.shavite );
|
||||||
shavite512_2way_update_close( &ctx.shavite, vhashB, vhashB, 64 );
|
shavite512_2way_update_close( &ctx.shavite, vhashB, vhashB, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 5
|
// 5
|
||||||
rintrlv_2x128_4x64( vhash, vhashA, vhashB, 512 );
|
rintrlv_2x128_4x64( vhash, vhashA, vhashB, 512 );
|
||||||
|
|
||||||
@@ -1557,7 +1514,7 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
sph_whirlpool512_full( &ctx.whirlpool, hash2, hash2, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash2, hash2, 64 );
|
||||||
sph_whirlpool512_full( &ctx.whirlpool, hash3, hash3, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash3, hash3, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 6
|
// 6
|
||||||
|
|
||||||
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
||||||
@@ -1650,7 +1607,7 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
sph_whirlpool512_full( &ctx.whirlpool, hash2, hash2, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash2, hash2, 64 );
|
||||||
sph_whirlpool512_full( &ctx.whirlpool, hash3, hash3, 64 );
|
sph_whirlpool512_full( &ctx.whirlpool, hash3, hash3, 64 );
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
// 7
|
// 7
|
||||||
|
|
||||||
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
intrlv_4x64_512( vhash, hash0, hash1, hash2, hash3 );
|
||||||
@@ -1745,46 +1702,4 @@ int sonoa_4way_hash( void *state, const void *input, int thrid )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanhash_sonoa_4way( struct work *work, const uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr )
|
|
||||||
{
|
|
||||||
uint32_t hash[4*16] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t vdata[24*4] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t lane_hash[8] __attribute__ ((aligned (32)));
|
|
||||||
uint32_t *hashd7 = &( hash[7<<2] );
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
const uint32_t *ptarget = work->target;
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const uint32_t last_nonce = max_nonce - 4;
|
|
||||||
const uint32_t targ32 = ptarget[7];
|
|
||||||
uint32_t n = first_nonce;
|
|
||||||
__m256i *noncev = (__m256i*)vdata + 9;
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
|
|
||||||
mm256_bswap32_intrlv80_4x64( vdata, pdata );
|
|
||||||
*noncev = mm256_intrlv_blend_32(
|
|
||||||
_mm256_set_epi32( n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ( sonoa_4way_hash( hash, vdata, thr_id ) )
|
|
||||||
for ( int lane = 0; lane < 4; lane++ )
|
|
||||||
if ( unlikely( hashd7[ lane ] <= targ32 ) )
|
|
||||||
{
|
|
||||||
extr_lane_4x32( lane_hash, hash, lane, 256 );
|
|
||||||
if ( likely( valid_hash( lane_hash, ptarget ) && !opt_benchmark ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n + lane );
|
|
||||||
submit_solution( work, lane_hash, mythr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*noncev = _mm256_add_epi32( *noncev,
|
|
||||||
m256_const1_64( 0x0000000400000000 ) );
|
|
||||||
n += 4;
|
|
||||||
} while ( likely( ( n < last_nonce ) && !work_restart[thr_id].restart ) );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -3,15 +3,14 @@
|
|||||||
bool register_sonoa_algo( algo_gate_t* gate )
|
bool register_sonoa_algo( algo_gate_t* gate )
|
||||||
{
|
{
|
||||||
#if defined (SONOA_8WAY)
|
#if defined (SONOA_8WAY)
|
||||||
gate->scanhash = (void*)&scanhash_sonoa_8way;
|
gate->scanhash = (void*)&scanhash_8way_64in_32out;
|
||||||
// gate->hash = (void*)&sonoa_8way_hash;
|
gate->hash = (void*)&sonoa_8way_hash;
|
||||||
#elif defined (SONOA_4WAY)
|
#elif defined (SONOA_4WAY)
|
||||||
gate->scanhash = (void*)&scanhash_sonoa_4way;
|
gate->scanhash = (void*)&scanhash_4way_64in_32out;
|
||||||
// gate->hash = (void*)&sonoa_4way_hash;
|
gate->hash = (void*)&sonoa_4way_hash;
|
||||||
#else
|
#else
|
||||||
init_sonoa_ctx();
|
init_sonoa_ctx();
|
||||||
gate->scanhash = (void*)&scanhash_sonoa;
|
gate->hash = (void*)&sonoa_hash;
|
||||||
// gate->hash = (void*)&sonoa_hash;
|
|
||||||
#endif
|
#endif
|
||||||
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
||||||
return true;
|
return true;
|
||||||
|
@@ -14,21 +14,15 @@ bool register_sonoa_algo( algo_gate_t* gate );
|
|||||||
|
|
||||||
#if defined(SONOA_8WAY)
|
#if defined(SONOA_8WAY)
|
||||||
|
|
||||||
int sonoa_8way_hash( void *state, const void *input, int thrid );
|
int sonoa_8way_hash( void *state, const void *input, int thr_id );
|
||||||
int scanhash_sonoa_8way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
|
|
||||||
#elif defined(SONOA_4WAY)
|
#elif defined(SONOA_4WAY)
|
||||||
|
|
||||||
int sonoa_4way_hash( void *state, const void *input, int thrid );
|
int sonoa_4way_hash( void *state, const void *input, int thr_id );
|
||||||
int scanhash_sonoa_4way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int sonoa_hash( void *state, const void *input, int thrid );
|
int sonoa_hash( void *state, const void *input, int thr_id );
|
||||||
int scanhash_sonoa( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
void init_sonoa_ctx();
|
void init_sonoa_ctx();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -83,7 +83,7 @@ void init_sonoa_ctx()
|
|||||||
sph_haval256_5_init(&sonoa_ctx.haval);
|
sph_haval256_5_init(&sonoa_ctx.haval);
|
||||||
};
|
};
|
||||||
|
|
||||||
int sonoa_hash( void *state, const void *input, int thrid )
|
int sonoa_hash( void *state, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint8_t hash[128] __attribute__ ((aligned (64)));
|
uint8_t hash[128] __attribute__ ((aligned (64)));
|
||||||
sonoa_ctx_holder ctx __attribute__ ((aligned (64)));
|
sonoa_ctx_holder ctx __attribute__ ((aligned (64)));
|
||||||
@@ -132,7 +132,7 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
sph_echo512_close(&ctx.echo, hash);
|
sph_echo512_close(&ctx.echo, hash);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
//
|
//
|
||||||
|
|
||||||
sph_bmw512_init( &ctx.bmw);
|
sph_bmw512_init( &ctx.bmw);
|
||||||
@@ -190,7 +190,7 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
sph_hamsi512(&ctx.hamsi, hash, 64);
|
sph_hamsi512(&ctx.hamsi, hash, 64);
|
||||||
sph_hamsi512_close(&ctx.hamsi, hash);
|
sph_hamsi512_close(&ctx.hamsi, hash);
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
//
|
//
|
||||||
|
|
||||||
sph_bmw512_init( &ctx.bmw);
|
sph_bmw512_init( &ctx.bmw);
|
||||||
@@ -252,7 +252,7 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
sph_fugue512(&ctx.fugue, hash, 64);
|
sph_fugue512(&ctx.fugue, hash, 64);
|
||||||
sph_fugue512_close(&ctx.fugue, hash);
|
sph_fugue512_close(&ctx.fugue, hash);
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
//
|
//
|
||||||
|
|
||||||
sph_bmw512_init( &ctx.bmw);
|
sph_bmw512_init( &ctx.bmw);
|
||||||
@@ -336,7 +336,7 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
sph_shavite512(&ctx.shavite, hash, 64);
|
sph_shavite512(&ctx.shavite, hash, 64);
|
||||||
sph_shavite512_close(&ctx.shavite, hash);
|
sph_shavite512_close(&ctx.shavite, hash);
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
//
|
//
|
||||||
|
|
||||||
sph_bmw512_init( &ctx.bmw);
|
sph_bmw512_init( &ctx.bmw);
|
||||||
@@ -410,7 +410,7 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
sph_whirlpool(&ctx.whirlpool, hash, 64);
|
sph_whirlpool(&ctx.whirlpool, hash, 64);
|
||||||
sph_whirlpool_close(&ctx.whirlpool, hash);
|
sph_whirlpool_close(&ctx.whirlpool, hash);
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
//
|
//
|
||||||
sph_bmw512_init( &ctx.bmw);
|
sph_bmw512_init( &ctx.bmw);
|
||||||
sph_bmw512(&ctx.bmw, hash, 64);
|
sph_bmw512(&ctx.bmw, hash, 64);
|
||||||
@@ -487,7 +487,7 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
sph_whirlpool(&ctx.whirlpool, hash, 64);
|
sph_whirlpool(&ctx.whirlpool, hash, 64);
|
||||||
sph_whirlpool_close(&ctx.whirlpool, hash);
|
sph_whirlpool_close(&ctx.whirlpool, hash);
|
||||||
|
|
||||||
if ( work_restart[thrid].restart ) return 0;
|
if ( work_restart[thr_id].restart ) return 0;
|
||||||
//
|
//
|
||||||
|
|
||||||
sph_bmw512_init( &ctx.bmw);
|
sph_bmw512_init( &ctx.bmw);
|
||||||
@@ -569,34 +569,4 @@ int sonoa_hash( void *state, const void *input, int thrid )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanhash_sonoa( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr)
|
|
||||||
{
|
|
||||||
uint32_t edata[20] __attribute__((aligned(64)));
|
|
||||||
uint32_t hash64[8] __attribute__((aligned(64)));
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
uint32_t *ptarget = work->target;
|
|
||||||
uint32_t n = pdata[19];
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
mm128_bswap32_80( edata, pdata );
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
edata[19] = n;
|
|
||||||
if ( sonoa_hash( hash64, edata, thr_id ) )
|
|
||||||
if ( unlikely( valid_hash( hash64, ptarget ) && !bench ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n );
|
|
||||||
submit_solution( work, hash64, mythr );
|
|
||||||
}
|
|
||||||
n++;
|
|
||||||
} while ( n < max_nonce && !work_restart[thr_id].restart );
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
pdata[19] = n;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -57,7 +57,7 @@ union _x17_8way_context_overlay
|
|||||||
} __attribute__ ((aligned (64)));
|
} __attribute__ ((aligned (64)));
|
||||||
typedef union _x17_8way_context_overlay x17_8way_context_overlay;
|
typedef union _x17_8way_context_overlay x17_8way_context_overlay;
|
||||||
|
|
||||||
void x17_8way_hash( void *state, const void *input )
|
int x17_8way_hash( void *state, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint64_t vhash[8*8] __attribute__ ((aligned (128)));
|
uint64_t vhash[8*8] __attribute__ ((aligned (128)));
|
||||||
uint64_t vhashA[8*8] __attribute__ ((aligned (64)));
|
uint64_t vhashA[8*8] __attribute__ ((aligned (64)));
|
||||||
@@ -230,50 +230,8 @@ void x17_8way_hash( void *state, const void *input )
|
|||||||
haval256_5_8way_init( &ctx.haval );
|
haval256_5_8way_init( &ctx.haval );
|
||||||
haval256_5_8way_update( &ctx.haval, vhashA, 64 );
|
haval256_5_8way_update( &ctx.haval, vhashA, 64 );
|
||||||
haval256_5_8way_close( &ctx.haval, state );
|
haval256_5_8way_close( &ctx.haval, state );
|
||||||
}
|
|
||||||
|
|
||||||
int scanhash_x17_8way( struct work *work, uint32_t max_nonce,
|
return 1;
|
||||||
uint64_t *hashes_done, struct thr_info *mythr )
|
|
||||||
{
|
|
||||||
uint32_t hash32[8*8] __attribute__ ((aligned (128)));
|
|
||||||
uint32_t vdata[20*8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t *hash32_d7 = &(hash32[7*8]);
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
const uint32_t *ptarget = work->target;
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const uint32_t last_nonce = max_nonce - 8;
|
|
||||||
__m512i *noncev = (__m512i*)vdata + 9;
|
|
||||||
uint32_t n = first_nonce;
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const uint32_t targ32_d7 = ptarget[7];
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
mm512_bswap32_intrlv80_8x64( vdata, pdata );
|
|
||||||
*noncev = mm512_intrlv_blend_32(
|
|
||||||
_mm512_set_epi32( n+7, 0, n+6, 0, n+5, 0, n+4, 0,
|
|
||||||
n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
|
||||||
do
|
|
||||||
{
|
|
||||||
x17_8way_hash( hash32, vdata );
|
|
||||||
|
|
||||||
for ( int lane = 0; lane < 8; lane++ )
|
|
||||||
if ( unlikely( ( hash32_d7[ lane ] <= targ32_d7 ) && !bench ) )
|
|
||||||
{
|
|
||||||
extr_lane_8x32( lane_hash, hash32, lane, 256 );
|
|
||||||
if ( likely( valid_hash( lane_hash, ptarget ) ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n + lane );
|
|
||||||
submit_solution( work, lane_hash, mythr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*noncev = _mm512_add_epi32( *noncev,
|
|
||||||
m512_const1_64( 0x0000000800000000 ) );
|
|
||||||
n += 8;
|
|
||||||
} while ( likely( ( n < last_nonce ) && !work_restart[thr_id].restart ) );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(X17_4WAY)
|
#elif defined(X17_4WAY)
|
||||||
@@ -300,7 +258,7 @@ union _x17_4way_context_overlay
|
|||||||
};
|
};
|
||||||
typedef union _x17_4way_context_overlay x17_4way_context_overlay;
|
typedef union _x17_4way_context_overlay x17_4way_context_overlay;
|
||||||
|
|
||||||
void x17_4way_hash( void *state, const void *input )
|
int x17_4way_hash( void *state, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint64_t vhash[8*4] __attribute__ ((aligned (64)));
|
uint64_t vhash[8*4] __attribute__ ((aligned (64)));
|
||||||
uint64_t vhashA[8*4] __attribute__ ((aligned (64)));
|
uint64_t vhashA[8*4] __attribute__ ((aligned (64)));
|
||||||
@@ -399,49 +357,8 @@ void x17_4way_hash( void *state, const void *input )
|
|||||||
haval256_5_4way_init( &ctx.haval );
|
haval256_5_4way_init( &ctx.haval );
|
||||||
haval256_5_4way_update( &ctx.haval, vhashB, 64 );
|
haval256_5_4way_update( &ctx.haval, vhashB, 64 );
|
||||||
haval256_5_4way_close( &ctx.haval, state );
|
haval256_5_4way_close( &ctx.haval, state );
|
||||||
}
|
|
||||||
|
|
||||||
int scanhash_x17_4way( struct work *work, uint32_t max_nonce,
|
return 1;
|
||||||
uint64_t *hashes_done, struct thr_info *mythr )
|
|
||||||
{
|
|
||||||
uint32_t hash32[8*4] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t vdata[20*4] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t *hash32_d7 = &(hash32[ 7*4 ]);
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
const uint32_t *ptarget = work->target;
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const uint32_t last_nonce = max_nonce - 4;
|
|
||||||
__m256i *noncev = (__m256i*)vdata + 9;
|
|
||||||
uint32_t n = first_nonce;
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const uint32_t targ32_d7 = ptarget[7];
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
mm256_bswap32_intrlv80_4x64( vdata, pdata );
|
|
||||||
*noncev = mm256_intrlv_blend_32(
|
|
||||||
_mm256_set_epi32( n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
|
||||||
do
|
|
||||||
{
|
|
||||||
x17_4way_hash( hash32, vdata );
|
|
||||||
|
|
||||||
for ( int lane = 0; lane < 4; lane++ )
|
|
||||||
if ( unlikely( hash32_d7[ lane ] <= targ32_d7 && !bench ) )
|
|
||||||
{
|
|
||||||
extr_lane_4x32( lane_hash, hash32, lane, 256 );
|
|
||||||
if ( valid_hash( lane_hash, ptarget ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n + lane );
|
|
||||||
submit_solution( work, lane_hash, mythr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*noncev = _mm256_add_epi32( *noncev,
|
|
||||||
m256_const1_64( 0x0000000400000000 ) );
|
|
||||||
n += 4;
|
|
||||||
} while ( likely( ( n <= last_nonce ) && !work_restart[thr_id].restart ) );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -3,13 +3,12 @@
|
|||||||
bool register_x17_algo( algo_gate_t* gate )
|
bool register_x17_algo( algo_gate_t* gate )
|
||||||
{
|
{
|
||||||
#if defined (X17_8WAY)
|
#if defined (X17_8WAY)
|
||||||
gate->scanhash = (void*)&scanhash_x17_8way;
|
gate->scanhash = (void*)&scanhash_8way_64in_32out;
|
||||||
gate->hash = (void*)&x17_8way_hash;
|
gate->hash = (void*)&x17_8way_hash;
|
||||||
#elif defined (X17_4WAY)
|
#elif defined (X17_4WAY)
|
||||||
gate->scanhash = (void*)&scanhash_x17_4way;
|
gate->scanhash = (void*)&scanhash_4way_64in_32out;
|
||||||
gate->hash = (void*)&x17_4way_hash;
|
gate->hash = (void*)&x17_4way_hash;
|
||||||
#else
|
#else
|
||||||
gate->scanhash = (void*)&scanhash_x17;
|
|
||||||
gate->hash = (void*)&x17_hash;
|
gate->hash = (void*)&x17_hash;
|
||||||
#endif
|
#endif
|
||||||
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
||||||
|
@@ -14,20 +14,15 @@ bool register_x17_algo( algo_gate_t* gate );
|
|||||||
|
|
||||||
#if defined(X17_8WAY)
|
#if defined(X17_8WAY)
|
||||||
|
|
||||||
void x17_8way_hash( void *state, const void *input );
|
int x17_8way_hash( void *state, const void *input, int thr_id );
|
||||||
int scanhash_x17_8way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
#elif defined(X17_4WAY)
|
#elif defined(X17_4WAY)
|
||||||
|
|
||||||
void x17_4way_hash( void *state, const void *input );
|
int x17_4way_hash( void *state, const void *input, int thr_id );
|
||||||
int scanhash_x17_4way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void x17_hash( void *state, const void *input );
|
int x17_hash( void *state, const void *input, int thr_id );
|
||||||
int scanhash_x17( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ union _x17_context_overlay
|
|||||||
};
|
};
|
||||||
typedef union _x17_context_overlay x17_context_overlay;
|
typedef union _x17_context_overlay x17_context_overlay;
|
||||||
|
|
||||||
void x17_hash(void *output, const void *input)
|
int x17_hash(void *output, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
// unsigned char hash[64 * 4] __attribute__((aligned(64))) = {0};
|
// unsigned char hash[64 * 4] __attribute__((aligned(64))) = {0};
|
||||||
unsigned char hash[64] __attribute__((aligned(64)));
|
unsigned char hash[64] __attribute__((aligned(64)));
|
||||||
@@ -143,36 +143,8 @@ void x17_hash(void *output, const void *input)
|
|||||||
sph_haval256_5_init(&ctx.haval);
|
sph_haval256_5_init(&ctx.haval);
|
||||||
sph_haval256_5( &ctx.haval, (const void*)hash, 64 );
|
sph_haval256_5( &ctx.haval, (const void*)hash, 64 );
|
||||||
sph_haval256_5_close( &ctx.haval, output );
|
sph_haval256_5_close( &ctx.haval, output );
|
||||||
}
|
|
||||||
|
|
||||||
int scanhash_x17( struct work *work, uint32_t max_nonce,
|
return 1;
|
||||||
uint64_t *hashes_done, struct thr_info *mythr)
|
|
||||||
{
|
|
||||||
uint32_t edata[20] __attribute__((aligned(64)));
|
|
||||||
uint32_t hash64[8] __attribute__((aligned(64)));
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
uint32_t *ptarget = work->target;
|
|
||||||
uint32_t n = pdata[19] - 1;
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
mm128_bswap32_80( edata, pdata );
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
edata[19] = n;
|
|
||||||
x17_hash( hash64, edata );
|
|
||||||
if ( unlikely( valid_hash( hash64, ptarget ) && !bench ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n );
|
|
||||||
submit_solution( work, hash64, mythr );
|
|
||||||
}
|
|
||||||
n++;
|
|
||||||
} while ( n < max_nonce && !work_restart[thr_id].restart );
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
pdata[19] = n;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -57,7 +57,7 @@ union _xevan_8way_context_overlay
|
|||||||
} __attribute__ ((aligned (64)));
|
} __attribute__ ((aligned (64)));
|
||||||
typedef union _xevan_8way_context_overlay xevan_8way_context_overlay;
|
typedef union _xevan_8way_context_overlay xevan_8way_context_overlay;
|
||||||
|
|
||||||
void xevan_8way_hash( void *output, const void *input )
|
int xevan_8way_hash( void *output, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint64_t vhash[16<<3] __attribute__ ((aligned (128)));
|
uint64_t vhash[16<<3] __attribute__ ((aligned (128)));
|
||||||
uint64_t vhashA[16<<3] __attribute__ ((aligned (64)));
|
uint64_t vhashA[16<<3] __attribute__ ((aligned (64)));
|
||||||
@@ -395,50 +395,8 @@ void xevan_8way_hash( void *output, const void *input )
|
|||||||
haval256_5_8way_init( &ctx.haval );
|
haval256_5_8way_init( &ctx.haval );
|
||||||
haval256_5_8way_update( &ctx.haval, vhashA, dataLen );
|
haval256_5_8way_update( &ctx.haval, vhashA, dataLen );
|
||||||
haval256_5_8way_close( &ctx.haval, output );
|
haval256_5_8way_close( &ctx.haval, output );
|
||||||
}
|
|
||||||
|
|
||||||
int scanhash_xevan_8way( struct work *work, uint32_t max_nonce,
|
return 1;
|
||||||
uint64_t *hashes_done, struct thr_info *mythr )
|
|
||||||
{
|
|
||||||
uint32_t hash[8*8] __attribute__ ((aligned (128)));
|
|
||||||
uint32_t vdata[20*8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t *hashd7 = &(hash[7*8]);
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
const uint32_t *ptarget = work->target;
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const uint32_t last_nonce = max_nonce - 8;
|
|
||||||
__m512i *noncev = (__m512i*)vdata + 9;
|
|
||||||
uint32_t n = first_nonce;
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const uint32_t targ32 = ptarget[7];
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
mm512_bswap32_intrlv80_8x64( vdata, pdata );
|
|
||||||
*noncev = mm512_intrlv_blend_32(
|
|
||||||
_mm512_set_epi32( n+7, 0, n+6, 0, n+5, 0, n+4, 0,
|
|
||||||
n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
|
||||||
do
|
|
||||||
{
|
|
||||||
xevan_8way_hash( hash, vdata );
|
|
||||||
|
|
||||||
for ( int lane = 0; lane < 8; lane++ )
|
|
||||||
if ( unlikely( ( hashd7[ lane ] <= targ32 ) && !bench ) )
|
|
||||||
{
|
|
||||||
extr_lane_8x32( lane_hash, hash, lane, 256 );
|
|
||||||
if ( likely( valid_hash( lane_hash, ptarget ) ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n + lane );
|
|
||||||
submit_solution( work, lane_hash, mythr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*noncev = _mm512_add_epi32( *noncev,
|
|
||||||
m512_const1_64( 0x0000000800000000 ) );
|
|
||||||
n += 8;
|
|
||||||
} while ( likely( ( n < last_nonce ) && !work_restart[thr_id].restart ) );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(XEVAN_4WAY)
|
#elif defined(XEVAN_4WAY)
|
||||||
@@ -465,7 +423,7 @@ union _xevan_4way_context_overlay
|
|||||||
};
|
};
|
||||||
typedef union _xevan_4way_context_overlay xevan_4way_context_overlay;
|
typedef union _xevan_4way_context_overlay xevan_4way_context_overlay;
|
||||||
|
|
||||||
void xevan_4way_hash( void *output, const void *input )
|
int xevan_4way_hash( void *output, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint64_t hash0[16] __attribute__ ((aligned (64)));
|
uint64_t hash0[16] __attribute__ ((aligned (64)));
|
||||||
uint64_t hash1[16] __attribute__ ((aligned (64)));
|
uint64_t hash1[16] __attribute__ ((aligned (64)));
|
||||||
@@ -540,10 +498,10 @@ void xevan_4way_hash( void *output, const void *input )
|
|||||||
|
|
||||||
dintrlv_4x64( hash0, hash1, hash2, hash3, vhash, dataLen<<3 );
|
dintrlv_4x64( hash0, hash1, hash2, hash3, vhash, dataLen<<3 );
|
||||||
|
|
||||||
sph_fugue512_full( &ctx.fugue, hash0, hash0, 64 );
|
sph_fugue512_full( &ctx.fugue, hash0, hash0, dataLen );
|
||||||
sph_fugue512_full( &ctx.fugue, hash1, hash1, 64 );
|
sph_fugue512_full( &ctx.fugue, hash1, hash1, dataLen );
|
||||||
sph_fugue512_full( &ctx.fugue, hash2, hash2, 64 );
|
sph_fugue512_full( &ctx.fugue, hash2, hash2, dataLen );
|
||||||
sph_fugue512_full( &ctx.fugue, hash3, hash3, 64 );
|
sph_fugue512_full( &ctx.fugue, hash3, hash3, dataLen );
|
||||||
|
|
||||||
// Parallel 4way 32 bit
|
// Parallel 4way 32 bit
|
||||||
intrlv_4x32( vhash, hash0, hash1, hash2, hash3, dataLen<<3 );
|
intrlv_4x32( vhash, hash0, hash1, hash2, hash3, dataLen<<3 );
|
||||||
@@ -637,10 +595,10 @@ void xevan_4way_hash( void *output, const void *input )
|
|||||||
|
|
||||||
dintrlv_4x64( hash0, hash1, hash2, hash3, vhash, dataLen<<3 );
|
dintrlv_4x64( hash0, hash1, hash2, hash3, vhash, dataLen<<3 );
|
||||||
|
|
||||||
sph_fugue512_full( &ctx.fugue, hash0, hash0, 64 );
|
sph_fugue512_full( &ctx.fugue, hash0, hash0, dataLen );
|
||||||
sph_fugue512_full( &ctx.fugue, hash1, hash1, 64 );
|
sph_fugue512_full( &ctx.fugue, hash1, hash1, dataLen );
|
||||||
sph_fugue512_full( &ctx.fugue, hash2, hash2, 64 );
|
sph_fugue512_full( &ctx.fugue, hash2, hash2, dataLen );
|
||||||
sph_fugue512_full( &ctx.fugue, hash3, hash3, 64 );
|
sph_fugue512_full( &ctx.fugue, hash3, hash3, dataLen );
|
||||||
|
|
||||||
intrlv_4x32( vhash, hash0, hash1, hash2, hash3, dataLen<<3 );
|
intrlv_4x32( vhash, hash0, hash1, hash2, hash3, dataLen<<3 );
|
||||||
|
|
||||||
@@ -666,49 +624,8 @@ void xevan_4way_hash( void *output, const void *input )
|
|||||||
haval256_5_4way_init( &ctx.haval );
|
haval256_5_4way_init( &ctx.haval );
|
||||||
haval256_5_4way_update( &ctx.haval, vhashA, dataLen );
|
haval256_5_4way_update( &ctx.haval, vhashA, dataLen );
|
||||||
haval256_5_4way_close( &ctx.haval, output );
|
haval256_5_4way_close( &ctx.haval, output );
|
||||||
}
|
|
||||||
|
|
||||||
int scanhash_xevan_4way( struct work *work, uint32_t max_nonce,
|
return 1;
|
||||||
uint64_t *hashes_done, struct thr_info *mythr )
|
|
||||||
{
|
|
||||||
uint32_t hash[16*4] __attribute__ ((aligned (128)));
|
|
||||||
uint32_t vdata[20*4] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t lane_hash[8] __attribute__ ((aligned (64)));
|
|
||||||
uint32_t *hashd7 = &(hash[7<<2]);
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
uint32_t *ptarget = work->target;
|
|
||||||
int thr_id = mythr->id;
|
|
||||||
__m256i *noncev = (__m256i*)vdata + 9;
|
|
||||||
const uint32_t targ32 = ptarget[7];
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const uint32_t last_nonce = max_nonce - 4;
|
|
||||||
uint32_t n = first_nonce;
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
if ( bench ) ptarget[7] = 0x0cff;
|
|
||||||
|
|
||||||
mm256_bswap32_intrlv80_4x64( vdata, pdata );
|
|
||||||
*noncev = mm256_intrlv_blend_32(
|
|
||||||
_mm256_set_epi32( n+3, 0, n+2, 0, n+1, 0, n, 0 ), *noncev );
|
|
||||||
do {
|
|
||||||
xevan_4way_hash( hash, vdata );
|
|
||||||
for ( int lane = 0; lane < 4; lane++ )
|
|
||||||
if ( unlikely( hashd7[ lane ] <= targ32 ) && ! bench )
|
|
||||||
{
|
|
||||||
extr_lane_4x32( lane_hash, hash, lane, 256 );
|
|
||||||
if ( valid_hash( lane_hash, ptarget ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n + lane );
|
|
||||||
submit_solution( work, lane_hash, mythr );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*noncev = _mm256_add_epi32( *noncev,
|
|
||||||
m256_const1_64( 0x0000000400000000 ) );
|
|
||||||
n += 4;
|
|
||||||
} while ( likely( ( n < last_nonce ) && !work_restart[thr_id].restart ) );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -3,14 +3,13 @@
|
|||||||
bool register_xevan_algo( algo_gate_t* gate )
|
bool register_xevan_algo( algo_gate_t* gate )
|
||||||
{
|
{
|
||||||
#if defined (XEVAN_8WAY)
|
#if defined (XEVAN_8WAY)
|
||||||
gate->scanhash = (void*)&scanhash_xevan_8way;
|
gate->scanhash = (void*)&scanhash_8way_64in_32out;
|
||||||
gate->hash = (void*)&xevan_8way_hash;
|
gate->hash = (void*)&xevan_8way_hash;
|
||||||
#elif defined (XEVAN_4WAY)
|
#elif defined (XEVAN_4WAY)
|
||||||
gate->scanhash = (void*)&scanhash_xevan_4way;
|
gate->scanhash = (void*)&scanhash_4way_64in_32out;
|
||||||
gate->hash = (void*)&xevan_4way_hash;
|
gate->hash = (void*)&xevan_4way_hash;
|
||||||
#else
|
#else
|
||||||
init_xevan_ctx();
|
init_xevan_ctx();
|
||||||
gate->scanhash = (void*)&scanhash_xevan;
|
|
||||||
gate->hash = (void*)&xevan_hash;
|
gate->hash = (void*)&xevan_hash;
|
||||||
#endif
|
#endif
|
||||||
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
gate->optimizations = SSE2_OPT | AES_OPT | AVX2_OPT | AVX512_OPT | VAES_OPT;
|
||||||
|
@@ -14,26 +14,15 @@ bool register_xevan_algo( algo_gate_t* gate );
|
|||||||
|
|
||||||
#if defined(XEVAN_8WAY)
|
#if defined(XEVAN_8WAY)
|
||||||
|
|
||||||
void xevan_8way_hash( void *state, const void *input );
|
int xevan_8way_hash( void *state, const void *input, int thr_id );
|
||||||
|
|
||||||
int scanhash_xevan_8way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
#elif defined(XEVAN_4WAY)
|
#elif defined(XEVAN_4WAY)
|
||||||
|
|
||||||
void xevan_4way_hash( void *state, const void *input );
|
int xevan_4way_hash( void *state, const void *input, int thr_id );
|
||||||
|
|
||||||
int scanhash_xevan_4way( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
|
|
||||||
//void init_xevan_4way_ctx();
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void xevan_hash( void *state, const void *input );
|
int xevan_hash( void *state, const void *input, int trh_id );
|
||||||
|
|
||||||
int scanhash_xevan( struct work *work, uint32_t max_nonce,
|
|
||||||
uint64_t *hashes_done, struct thr_info *mythr );
|
|
||||||
|
|
||||||
void init_xevan_ctx();
|
void init_xevan_ctx();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -83,7 +83,7 @@ void init_xevan_ctx()
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void xevan_hash(void *output, const void *input)
|
int xevan_hash(void *output, const void *input, int thr_id )
|
||||||
{
|
{
|
||||||
uint32_t _ALIGN(64) hash[32]; // 128 bytes required
|
uint32_t _ALIGN(64) hash[32]; // 128 bytes required
|
||||||
const int dataLen = 128;
|
const int dataLen = 128;
|
||||||
@@ -218,36 +218,8 @@ void xevan_hash(void *output, const void *input)
|
|||||||
sph_haval256_5_close(&ctx.haval, hash);
|
sph_haval256_5_close(&ctx.haval, hash);
|
||||||
|
|
||||||
memcpy(output, hash, 32);
|
memcpy(output, hash, 32);
|
||||||
}
|
|
||||||
|
|
||||||
int scanhash_xevan( struct work *work, uint32_t max_nonce,
|
return 1;
|
||||||
uint64_t *hashes_done, struct thr_info *mythr)
|
|
||||||
{
|
|
||||||
uint32_t edata[20] __attribute__((aligned(64)));
|
|
||||||
uint32_t hash64[8] __attribute__((aligned(64)));
|
|
||||||
uint32_t *pdata = work->data;
|
|
||||||
uint32_t *ptarget = work->target;
|
|
||||||
uint32_t n = pdata[19];
|
|
||||||
const uint32_t first_nonce = pdata[19];
|
|
||||||
const int thr_id = mythr->id;
|
|
||||||
const bool bench = opt_benchmark;
|
|
||||||
|
|
||||||
mm128_bswap32_80( edata, pdata );
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
edata[19] = n;
|
|
||||||
xevan_hash( hash64, edata );
|
|
||||||
if ( unlikely( valid_hash( hash64, ptarget ) && !bench ) )
|
|
||||||
{
|
|
||||||
pdata[19] = bswap_32( n );
|
|
||||||
submit_solution( work, hash64, mythr );
|
|
||||||
}
|
|
||||||
n++;
|
|
||||||
} while ( n < max_nonce && !work_restart[thr_id].restart );
|
|
||||||
pdata[19] = n;
|
|
||||||
*hashes_done = n - first_nonce;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -445,7 +445,7 @@ bool register_yescrypt_algo( algo_gate_t* gate )
|
|||||||
|
|
||||||
YESCRYPT_P = 1;
|
YESCRYPT_P = 1;
|
||||||
|
|
||||||
applog( LOG_NOTICE,"Yescrypt parameters: N= %d, R= %d.", YESCRYPT_N,
|
applog( LOG_NOTICE,"Yescrypt parameters: N= %d, R= %d", YESCRYPT_N,
|
||||||
YESCRYPT_R );
|
YESCRYPT_R );
|
||||||
if ( yescrypt_client_key )
|
if ( yescrypt_client_key )
|
||||||
applog( LOG_NOTICE,"Key= \"%s\"\n", yescrypt_client_key );
|
applog( LOG_NOTICE,"Key= \"%s\"\n", yescrypt_client_key );
|
||||||
|
@@ -139,7 +139,7 @@ bool register_yespower_algo( algo_gate_t* gate )
|
|||||||
yespower_params.perslen = 0;
|
yespower_params.perslen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
applog( LOG_NOTICE,"Yespower parameters: N= %d, R= %d.", yespower_params.N,
|
applog( LOG_NOTICE,"Yespower parameters: N= %d, R= %d", yespower_params.N,
|
||||||
yespower_params.r );
|
yespower_params.r );
|
||||||
if ( yespower_params.pers )
|
if ( yespower_params.pers )
|
||||||
applog( LOG_NOTICE,"Key= \"%s\"\n", yespower_params.pers );
|
applog( LOG_NOTICE,"Key= \"%s\"\n", yespower_params.pers );
|
||||||
@@ -264,7 +264,7 @@ bool register_power2b_algo( algo_gate_t* gate )
|
|||||||
yespower_params.pers = "Now I am become Death, the destroyer of worlds";
|
yespower_params.pers = "Now I am become Death, the destroyer of worlds";
|
||||||
yespower_params.perslen = 46;
|
yespower_params.perslen = 46;
|
||||||
|
|
||||||
applog( LOG_NOTICE,"yespower-b2b parameters: N= %d, R= %d.", yespower_params.N,
|
applog( LOG_NOTICE,"yespower-b2b parameters: N= %d, R= %d", yespower_params.N,
|
||||||
yespower_params.r );
|
yespower_params.r );
|
||||||
applog( LOG_NOTICE,"Key= \"%s\"", yespower_params.pers );
|
applog( LOG_NOTICE,"Key= \"%s\"", yespower_params.pers );
|
||||||
applog( LOG_NOTICE,"Key length= %d\n", yespower_params.perslen );
|
applog( LOG_NOTICE,"Key length= %d\n", yespower_params.perslen );
|
||||||
|
@@ -76,7 +76,7 @@ typedef struct {
|
|||||||
unsigned char uc[32];
|
unsigned char uc[32];
|
||||||
} yespower_binary_t __attribute__ ((aligned (64)));
|
} yespower_binary_t __attribute__ ((aligned (64)));
|
||||||
|
|
||||||
yespower_params_t yespower_params;
|
extern yespower_params_t yespower_params;
|
||||||
|
|
||||||
//SHA256_CTX sha256_prehash_ctx;
|
//SHA256_CTX sha256_prehash_ctx;
|
||||||
extern __thread SHA256_CTX sha256_prehash_ctx;
|
extern __thread SHA256_CTX sha256_prehash_ctx;
|
||||||
|
@@ -4,13 +4,20 @@
|
|||||||
# during develpment. However the information contained may provide compilation
|
# during develpment. However the information contained may provide compilation
|
||||||
# tips to users.
|
# tips to users.
|
||||||
|
|
||||||
rm cpuminer-avx512 cpuminer-avx2 cpuminer-aes-avx cpuminer-aes-sse42 cpuminer-sse42 cpuminer-ssse3 cpuminer-sse2 cpuminer-zen > /dev/null
|
rm cpuminer-avx512-sha-vaes cpuminer-avx512 cpuminer-avx2 cpuminer-aes-avx cpuminer-aes-sse42 cpuminer-sse42 cpuminer-ssse3 cpuminer-sse2 cpuminer-zen > /dev/null
|
||||||
|
|
||||||
make distclean || echo clean
|
make distclean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
./autogen.sh || echo done
|
./autogen.sh || echo done
|
||||||
CFLAGS="-O3 -march=skylake-avx512 -Wall" ./configure --with-curl
|
CFLAGS="-O3 -march=icelake-client -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
|
strip -s cpuminer.exe
|
||||||
|
mv cpuminer.exe cpuminer-avx512-sha-vaes.exe
|
||||||
|
strip -s cpuminer
|
||||||
|
mv cpuminer cpuminer-avx512-sha-vaes
|
||||||
|
|
||||||
|
CFLAGS="-O3 -march=skylake-avx512 -Wall -fno-common" ./configure --with-curl
|
||||||
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe cpuminer-avx512.exe
|
mv cpuminer.exe cpuminer-avx512.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
@@ -19,8 +26,8 @@ mv cpuminer cpuminer-avx512
|
|||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
# GCC 9 doesn't include AES with core-avx2
|
# GCC 9 doesn't include AES with core-avx2
|
||||||
CFLAGS="-O3 -march=core-avx2 -maes -Wall" ./configure --with-curl
|
CFLAGS="-O3 -march=core-avx2 -maes -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe cpuminer-avx2.exe
|
mv cpuminer.exe cpuminer-avx2.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
@@ -28,17 +35,17 @@ mv cpuminer cpuminer-avx2
|
|||||||
|
|
||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -march=corei7-avx -maes -Wall" ./configure --with-curl
|
CFLAGS="-O3 -march=corei7-avx -maes -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe cpuminer-avx.exe
|
mv cpuminer.exe cpuminer-avx.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
mv cpuminer cpuminer-aes-avx
|
mv cpuminer cpuminer-avx
|
||||||
|
|
||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -maes -msse4.2 -Wall" ./configure --with-curl
|
CFLAGS="-O3 -maes -msse4.2 -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe cpuminer-aes-sse42.exe
|
mv cpuminer.exe cpuminer-aes-sse42.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
@@ -46,8 +53,8 @@ mv cpuminer cpuminer-aes-sse42
|
|||||||
|
|
||||||
#make clean || echo clean
|
#make clean || echo clean
|
||||||
#rm -f config.status
|
#rm -f config.status
|
||||||
#CFLAGS="-O3 -march=corei7 -Wall" ./configure --with-curl
|
#CFLAGS="-O3 -march=corei7 -Wall -fno-common" ./configure --with-curl
|
||||||
#make -j 16
|
#make -j 8
|
||||||
#strip -s cpuminer.exe
|
#strip -s cpuminer.exe
|
||||||
#mv cpuminer.exe cpuminer-sse42.exe
|
#mv cpuminer.exe cpuminer-sse42.exe
|
||||||
#strip -s cpuminer
|
#strip -s cpuminer
|
||||||
@@ -55,8 +62,8 @@ mv cpuminer cpuminer-aes-sse42
|
|||||||
|
|
||||||
#make clean || echo clean
|
#make clean || echo clean
|
||||||
#rm -f config.status
|
#rm -f config.status
|
||||||
#CFLAGS="-O3 -march=core2 -Wall" ./configure --with-curl
|
#CFLAGS="-O3 -march=core2 -Wall -fno-common" ./configure --with-curl
|
||||||
#make -j 16
|
#make -j 8
|
||||||
#strip -s cpuminer.exe
|
#strip -s cpuminer.exe
|
||||||
#mv cpuminer.exe cpuminer-ssse3.exe
|
#mv cpuminer.exe cpuminer-ssse3.exe
|
||||||
#strip -s cpuminer
|
#strip -s cpuminer
|
||||||
@@ -64,8 +71,8 @@ mv cpuminer cpuminer-aes-sse42
|
|||||||
|
|
||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -msse2 -Wall" ./configure --with-curl
|
CFLAGS="-O3 -msse2 -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe cpuminer-sse2.exe
|
mv cpuminer.exe cpuminer-sse2.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
@@ -73,8 +80,8 @@ mv cpuminer cpuminer-sse2
|
|||||||
|
|
||||||
make clean || echo done
|
make clean || echo done
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -march=znver1 -Wall" ./configure --with-curl
|
CFLAGS="-O3 -march=znver1 -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe cpuminer-zen.exe
|
mv cpuminer.exe cpuminer-zen.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
@@ -82,8 +89,8 @@ mv cpuminer cpuminer-zen
|
|||||||
|
|
||||||
make clean || echo done
|
make clean || echo done
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -march=native -Wall" ./configure --with-curl
|
CFLAGS="-O3 -march=native -Wall -fno-common" ./configure --with-curl
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
strip -s cpuminer
|
strip -s cpuminer
|
||||||
|
|
||||||
|
27
build-no-common.sh
Executable file
27
build-no-common.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#if [ "$OS" = "Windows_NT" ]; then
|
||||||
|
# ./mingw64.sh
|
||||||
|
# exit 0
|
||||||
|
#fi
|
||||||
|
|
||||||
|
# Linux build
|
||||||
|
|
||||||
|
make distclean || echo clean
|
||||||
|
|
||||||
|
rm -f config.status
|
||||||
|
./autogen.sh || echo done
|
||||||
|
|
||||||
|
# Ubuntu 10.04 (gcc 4.4)
|
||||||
|
# extracflags="-O3 -march=native -Wall -D_REENTRANT -funroll-loops -fvariable-expansion-in-unroller -fmerge-all-constants -fbranch-target-load-optimize2 -fsched2-use-superblocks -falign-loops=16 -falign-functions=16 -falign-jumps=16 -falign-labels=16"
|
||||||
|
|
||||||
|
# Debian 7.7 / Ubuntu 14.04 (gcc 4.7+)
|
||||||
|
#extracflags="$extracflags -Ofast -flto -fuse-linker-plugin -ftree-loop-if-convert-stores"
|
||||||
|
|
||||||
|
#CFLAGS="-O3 -march=native -Wall" ./configure --with-curl --with-crypto=$HOME/usr
|
||||||
|
CFLAGS="-O3 -march=native -Wall -fno-common" ./configure --with-curl
|
||||||
|
#CFLAGS="-O3 -march=native -Wall" CXXFLAGS="$CFLAGS -std=gnu++11" ./configure --with-curl
|
||||||
|
|
||||||
|
make -j 4
|
||||||
|
|
||||||
|
strip -s cpuminer
|
@@ -3,8 +3,8 @@
|
|||||||
# imake clean and rm all the targetted executables.
|
# imake clean and rm all the targetted executables.
|
||||||
# tips to users.
|
# tips to users.
|
||||||
|
|
||||||
rm cpuminer-avx512 cpuminer-avx2 cpuminer-aes-avx cpuminer-aes-sse42 cpuminer-sse2 cpuminer-zen > /dev/null
|
rm cpuminer-avx512-sha-vaes cpuminer-avx512 cpuminer-avx2 cpuminer-avx cpuminer-aes-sse42 cpuminer-sse2 cpuminer-zen > /dev/null
|
||||||
|
|
||||||
rm cpuminer-avx512.exe cpuminer-avx2.exe cpuminer-aes-avx.exe cpuminer-aes-sse42.exe cpuminer-sse2.exe cpuminer-zen.exe > /dev/null
|
rm cpuminer-avx512-sha-vaes.exe cpuminer-avx512.exe cpuminer-avx2.exe cpuminer-avx.exe cpuminer-aes-sse42.exe cpuminer-sse2.exe cpuminer-zen.exe > /dev/null
|
||||||
|
|
||||||
make distclean > /dev/null
|
make distclean > /dev/null
|
||||||
|
211
configure
vendored
211
configure
vendored
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for cpuminer-opt 3.12.8.1.
|
# Generated by GNU Autoconf 2.69 for cpuminer-opt 3.14.3.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
||||||
@@ -577,8 +577,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='cpuminer-opt'
|
PACKAGE_NAME='cpuminer-opt'
|
||||||
PACKAGE_TARNAME='cpuminer-opt'
|
PACKAGE_TARNAME='cpuminer-opt'
|
||||||
PACKAGE_VERSION='3.12.8.1'
|
PACKAGE_VERSION='3.14.3'
|
||||||
PACKAGE_STRING='cpuminer-opt 3.12.8.1'
|
PACKAGE_STRING='cpuminer-opt 3.14.3'
|
||||||
PACKAGE_BUGREPORT=''
|
PACKAGE_BUGREPORT=''
|
||||||
PACKAGE_URL=''
|
PACKAGE_URL=''
|
||||||
|
|
||||||
@@ -667,7 +667,6 @@ am__nodep
|
|||||||
AMDEPBACKSLASH
|
AMDEPBACKSLASH
|
||||||
AMDEP_FALSE
|
AMDEP_FALSE
|
||||||
AMDEP_TRUE
|
AMDEP_TRUE
|
||||||
am__quote
|
|
||||||
am__include
|
am__include
|
||||||
DEPDIR
|
DEPDIR
|
||||||
OBJEXT
|
OBJEXT
|
||||||
@@ -757,7 +756,8 @@ PACKAGE_VERSION
|
|||||||
PACKAGE_TARNAME
|
PACKAGE_TARNAME
|
||||||
PACKAGE_NAME
|
PACKAGE_NAME
|
||||||
PATH_SEPARATOR
|
PATH_SEPARATOR
|
||||||
SHELL'
|
SHELL
|
||||||
|
am__quote'
|
||||||
ac_subst_files=''
|
ac_subst_files=''
|
||||||
ac_user_opts='
|
ac_user_opts='
|
||||||
enable_option_checking
|
enable_option_checking
|
||||||
@@ -1332,7 +1332,7 @@ if test "$ac_init_help" = "long"; then
|
|||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures cpuminer-opt 3.12.8.1 to adapt to many kinds of systems.
|
\`configure' configures cpuminer-opt 3.14.3 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@@ -1404,7 +1404,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of cpuminer-opt 3.12.8.1:";;
|
short | recursive ) echo "Configuration of cpuminer-opt 3.14.3:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@@ -1509,7 +1509,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
cpuminer-opt configure 3.12.8.1
|
cpuminer-opt configure 3.14.3
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
@@ -2012,7 +2012,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by cpuminer-opt $as_me 3.12.8.1, which was
|
It was created by cpuminer-opt $as_me 3.14.3, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
@@ -2507,7 +2507,7 @@ ac_config_headers="$ac_config_headers cpuminer-config.h"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
am__api_version='1.15'
|
am__api_version='1.16'
|
||||||
|
|
||||||
# Find a good install program. We prefer a C program (faster),
|
# Find a good install program. We prefer a C program (faster),
|
||||||
# so one script is as good as another. But avoid the broken or
|
# so one script is as good as another. But avoid the broken or
|
||||||
@@ -2993,7 +2993,7 @@ fi
|
|||||||
|
|
||||||
# Define the identity of the package.
|
# Define the identity of the package.
|
||||||
PACKAGE='cpuminer-opt'
|
PACKAGE='cpuminer-opt'
|
||||||
VERSION='3.12.8.1'
|
VERSION='3.14.3'
|
||||||
|
|
||||||
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
cat >>confdefs.h <<_ACEOF
|
||||||
@@ -3023,8 +3023,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
|
|||||||
|
|
||||||
# For better backward compatibility. To be removed once Automake 1.9.x
|
# For better backward compatibility. To be removed once Automake 1.9.x
|
||||||
# dies out for good. For more background, see:
|
# dies out for good. For more background, see:
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||||
mkdir_p='$(MKDIR_P)'
|
mkdir_p='$(MKDIR_P)'
|
||||||
|
|
||||||
# We need awk for the "check" target (and possibly the TAP driver). The
|
# We need awk for the "check" target (and possibly the TAP driver). The
|
||||||
@@ -3075,7 +3075,7 @@ END
|
|||||||
Aborting the configuration process, to ensure you take notice of the issue.
|
Aborting the configuration process, to ensure you take notice of the issue.
|
||||||
|
|
||||||
You can download and install GNU coreutils to get an 'rm' implementation
|
You can download and install GNU coreutils to get an 'rm' implementation
|
||||||
that behaves properly: <http://www.gnu.org/software/coreutils/>.
|
that behaves properly: <https://www.gnu.org/software/coreutils/>.
|
||||||
|
|
||||||
If you want to complete the configuration process using your problematic
|
If you want to complete the configuration process using your problematic
|
||||||
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
||||||
@@ -3115,45 +3115,45 @@ DEPDIR="${am__leading_dot}deps"
|
|||||||
|
|
||||||
ac_config_commands="$ac_config_commands depfiles"
|
ac_config_commands="$ac_config_commands depfiles"
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
|
||||||
am_make=${MAKE-make}
|
$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
|
||||||
cat > confinc << 'END'
|
cat > confinc.mk << 'END'
|
||||||
am__doit:
|
am__doit:
|
||||||
@echo this is the am__doit target
|
@echo this is the am__doit target >confinc.out
|
||||||
.PHONY: am__doit
|
.PHONY: am__doit
|
||||||
END
|
END
|
||||||
# If we don't find an include directive, just comment out the code.
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
|
|
||||||
$as_echo_n "checking for style of include used by $am_make... " >&6; }
|
|
||||||
am__include="#"
|
am__include="#"
|
||||||
am__quote=
|
am__quote=
|
||||||
_am_result=none
|
# BSD make does it like this.
|
||||||
# First try GNU make style include.
|
echo '.include "confinc.mk" # ignored' > confmf.BSD
|
||||||
echo "include confinc" > confmf
|
# Other make implementations (GNU, Solaris 10, AIX) do it like this.
|
||||||
# Ignore all kinds of additional output from 'make'.
|
echo 'include confinc.mk # ignored' > confmf.GNU
|
||||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
_am_result=no
|
||||||
*the\ am__doit\ target*)
|
for s in GNU BSD; do
|
||||||
am__include=include
|
{ echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
|
||||||
am__quote=
|
(${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
|
||||||
_am_result=GNU
|
ac_status=$?
|
||||||
;;
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
esac
|
(exit $ac_status); }
|
||||||
# Now try BSD make style include.
|
case $?:`cat confinc.out 2>/dev/null` in #(
|
||||||
if test "$am__include" = "#"; then
|
'0:this is the am__doit target') :
|
||||||
echo '.include "confinc"' > confmf
|
case $s in #(
|
||||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
BSD) :
|
||||||
*the\ am__doit\ target*)
|
am__include='.include' am__quote='"' ;; #(
|
||||||
am__include=.include
|
*) :
|
||||||
am__quote="\""
|
am__include='include' am__quote='' ;;
|
||||||
_am_result=BSD
|
esac ;; #(
|
||||||
|
*) :
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
if test "$am__include" != "#"; then
|
||||||
|
_am_result="yes ($s style)"
|
||||||
|
break
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
|
fi
|
||||||
$as_echo "$_am_result" >&6; }
|
done
|
||||||
rm -f confinc confmf
|
rm -f confinc.* confmf.*
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
|
||||||
|
$as_echo "${_am_result}" >&6; }
|
||||||
|
|
||||||
# Check whether --enable-dependency-tracking was given.
|
# Check whether --enable-dependency-tracking was given.
|
||||||
if test "${enable_dependency_tracking+set}" = set; then :
|
if test "${enable_dependency_tracking+set}" = set; then :
|
||||||
@@ -6690,7 +6690,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by cpuminer-opt $as_me 3.12.8.1, which was
|
This file was extended by cpuminer-opt $as_me 3.14.3, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@@ -6756,7 +6756,7 @@ _ACEOF
|
|||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
cpuminer-opt config.status 3.12.8.1
|
cpuminer-opt config.status 3.14.3
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
@@ -6875,7 +6875,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
|||||||
#
|
#
|
||||||
# INIT-COMMANDS
|
# INIT-COMMANDS
|
||||||
#
|
#
|
||||||
AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
|
AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
|
||||||
|
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
@@ -7489,29 +7489,35 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
|
|||||||
# Older Autoconf quotes --file arguments for eval, but not when files
|
# Older Autoconf quotes --file arguments for eval, but not when files
|
||||||
# are listed without --file. Let's play safe and only enable the eval
|
# are listed without --file. Let's play safe and only enable the eval
|
||||||
# if we detect the quoting.
|
# if we detect the quoting.
|
||||||
case $CONFIG_FILES in
|
# TODO: see whether this extra hack can be removed once we start
|
||||||
*\'*) eval set x "$CONFIG_FILES" ;;
|
# requiring Autoconf 2.70 or later.
|
||||||
*) set x $CONFIG_FILES ;;
|
case $CONFIG_FILES in #(
|
||||||
esac
|
*\'*) :
|
||||||
|
eval set x "$CONFIG_FILES" ;; #(
|
||||||
|
*) :
|
||||||
|
set x $CONFIG_FILES ;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac
|
||||||
shift
|
shift
|
||||||
for mf
|
# Used to flag and report bootstrapping failures.
|
||||||
|
am_rc=0
|
||||||
|
for am_mf
|
||||||
do
|
do
|
||||||
# Strip MF so we end up with the name of the file.
|
# Strip MF so we end up with the name of the file.
|
||||||
mf=`echo "$mf" | sed -e 's/:.*$//'`
|
am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
|
||||||
# Check whether this is an Automake generated Makefile or not.
|
# Check whether this is an Automake generated Makefile which includes
|
||||||
# We used to match only the files named 'Makefile.in', but
|
# dependency-tracking related rules and includes.
|
||||||
# some people rename them; so instead we look at the file content.
|
# Grep'ing the whole file directly is not great: AIX grep has a line
|
||||||
# Grep'ing the first line is not enough: some people post-process
|
|
||||||
# each Makefile.in and add a new line on top of each file to say so.
|
|
||||||
# Grep'ing the whole file is not good either: AIX grep has a line
|
|
||||||
# limit of 2048, but all sed's we know have understand at least 4000.
|
# limit of 2048, but all sed's we know have understand at least 4000.
|
||||||
if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
|
sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
|
||||||
dirpart=`$as_dirname -- "$mf" ||
|
|| continue
|
||||||
$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
am_dirpart=`$as_dirname -- "$am_mf" ||
|
||||||
X"$mf" : 'X\(//\)[^/]' \| \
|
$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
X"$mf" : 'X\(//\)$' \| \
|
X"$am_mf" : 'X\(//\)[^/]' \| \
|
||||||
X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
|
X"$am_mf" : 'X\(//\)$' \| \
|
||||||
$as_echo X"$mf" |
|
X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
$as_echo X"$am_mf" |
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
s//\1/
|
s//\1/
|
||||||
q
|
q
|
||||||
@@ -7529,53 +7535,48 @@ $as_echo X"$mf" |
|
|||||||
q
|
q
|
||||||
}
|
}
|
||||||
s/.*/./; q'`
|
s/.*/./; q'`
|
||||||
else
|
am_filepart=`$as_basename -- "$am_mf" ||
|
||||||
continue
|
$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
|
||||||
fi
|
X"$am_mf" : 'X\(//\)$' \| \
|
||||||
# Extract the definition of DEPDIR, am__include, and am__quote
|
X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
# from the Makefile without running 'make'.
|
$as_echo X/"$am_mf" |
|
||||||
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
|
sed '/^.*\/\([^/][^/]*\)\/*$/{
|
||||||
test -z "$DEPDIR" && continue
|
|
||||||
am__include=`sed -n 's/^am__include = //p' < "$mf"`
|
|
||||||
test -z "$am__include" && continue
|
|
||||||
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
|
|
||||||
# Find all dependency output files, they are included files with
|
|
||||||
# $(DEPDIR) in their names. We invoke sed twice because it is the
|
|
||||||
# simplest approach to changing $(DEPDIR) to its actual value in the
|
|
||||||
# expansion.
|
|
||||||
for file in `sed -n "
|
|
||||||
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
|
|
||||||
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
|
|
||||||
# Make sure the directory exists.
|
|
||||||
test -f "$dirpart/$file" && continue
|
|
||||||
fdir=`$as_dirname -- "$file" ||
|
|
||||||
$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$file" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$file" : 'X\(//\)$' \| \
|
|
||||||
X"$file" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
$as_echo X"$file" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
s//\1/
|
||||||
q
|
q
|
||||||
}
|
}
|
||||||
/^X\(\/\/\)[^/].*/{
|
/^X\/\(\/\/\)$/{
|
||||||
s//\1/
|
s//\1/
|
||||||
q
|
q
|
||||||
}
|
}
|
||||||
/^X\(\/\/\)$/{
|
/^X\/\(\/\).*/{
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
s//\1/
|
||||||
q
|
q
|
||||||
}
|
}
|
||||||
s/.*/./; q'`
|
s/.*/./; q'`
|
||||||
as_dir=$dirpart/$fdir; as_fn_mkdir_p
|
{ echo "$as_me:$LINENO: cd "$am_dirpart" \
|
||||||
# echo "creating $dirpart/$file"
|
&& sed -e '/# am--include-marker/d' "$am_filepart" \
|
||||||
echo '# dummy' > "$dirpart/$file"
|
| $MAKE -f - am--depfiles" >&5
|
||||||
done
|
(cd "$am_dirpart" \
|
||||||
|
&& sed -e '/# am--include-marker/d' "$am_filepart" \
|
||||||
|
| $MAKE -f - am--depfiles) >&5 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } || am_rc=$?
|
||||||
done
|
done
|
||||||
|
if test $am_rc -ne 0; then
|
||||||
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
as_fn_error $? "Something went wrong bootstrapping makefile fragments
|
||||||
|
for automatic dependency tracking. Try re-running configure with the
|
||||||
|
'--disable-dependency-tracking' option to at least be able to build
|
||||||
|
the package (albeit without support for automatic dependency tracking).
|
||||||
|
See \`config.log' for more details" "$LINENO" 5; }
|
||||||
|
fi
|
||||||
|
{ am_dirpart=; unset am_dirpart;}
|
||||||
|
{ am_filepart=; unset am_filepart;}
|
||||||
|
{ am_mf=; unset am_mf;}
|
||||||
|
{ am_rc=; unset am_rc;}
|
||||||
|
rm -f conftest-deps.mk
|
||||||
}
|
}
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
AC_INIT([cpuminer-opt], [3.12.8.1])
|
AC_INIT([cpuminer-opt], [3.14.3])
|
||||||
|
|
||||||
AC_PREREQ([2.59c])
|
AC_PREREQ([2.59c])
|
||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
|
771
cpu-miner.c
771
cpu-miner.c
File diff suppressed because it is too large
Load Diff
57
miner.h
57
miner.h
@@ -83,6 +83,8 @@ enum {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern bool is_power_of_2( int n );
|
||||||
|
|
||||||
static inline bool is_windows(void)
|
static inline bool is_windows(void)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@@ -313,6 +315,10 @@ size_t address_to_script( unsigned char *out, size_t outsz, const char *addr );
|
|||||||
int timeval_subtract( struct timeval *result, struct timeval *x,
|
int timeval_subtract( struct timeval *result, struct timeval *x,
|
||||||
struct timeval *y);
|
struct timeval *y);
|
||||||
|
|
||||||
|
// Segwit BEGIN
|
||||||
|
extern void memrev(unsigned char *p, size_t len);
|
||||||
|
// Segwit END
|
||||||
|
|
||||||
// Bitcoin formula for converting difficulty to an equivalent
|
// Bitcoin formula for converting difficulty to an equivalent
|
||||||
// number of hashes.
|
// number of hashes.
|
||||||
//
|
//
|
||||||
@@ -324,12 +330,12 @@ int timeval_subtract( struct timeval *result, struct timeval *x,
|
|||||||
|
|
||||||
#define EXP16 65536.
|
#define EXP16 65536.
|
||||||
#define EXP32 4294967296.
|
#define EXP32 4294967296.
|
||||||
const long double exp32; // 2**32
|
extern const long double exp32; // 2**32
|
||||||
const long double exp48; // 2**48
|
extern const long double exp48; // 2**48
|
||||||
const long double exp64; // 2**64
|
extern const long double exp64; // 2**64
|
||||||
const long double exp96; // 2**96
|
extern const long double exp96; // 2**96
|
||||||
const long double exp128; // 2**128
|
extern const long double exp128; // 2**128
|
||||||
const long double exp160; // 2**160
|
extern const long double exp160; // 2**160
|
||||||
|
|
||||||
bool fulltest( const uint32_t *hash, const uint32_t *target );
|
bool fulltest( const uint32_t *hash, const uint32_t *target );
|
||||||
bool valid_hash( const void*, const void* );
|
bool valid_hash( const void*, const void* );
|
||||||
@@ -374,36 +380,25 @@ void cpu_brand_string( char* s );
|
|||||||
float cpu_temp( int core );
|
float cpu_temp( int core );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct work {
|
struct work
|
||||||
|
{
|
||||||
|
uint32_t target[8] __attribute__ ((aligned (64)));
|
||||||
uint32_t data[48] __attribute__ ((aligned (64)));
|
uint32_t data[48] __attribute__ ((aligned (64)));
|
||||||
uint32_t target[8] __attribute__ ((aligned (64)));
|
|
||||||
|
|
||||||
double targetdiff;
|
double targetdiff;
|
||||||
// double shareratio;
|
|
||||||
double sharediff;
|
double sharediff;
|
||||||
double stratum_diff;
|
double stratum_diff;
|
||||||
|
|
||||||
int height;
|
int height;
|
||||||
char *txs;
|
char *txs;
|
||||||
char *workid;
|
char *workid;
|
||||||
|
|
||||||
char *job_id;
|
char *job_id;
|
||||||
size_t xnonce2_len;
|
size_t xnonce2_len;
|
||||||
unsigned char *xnonce2;
|
unsigned char *xnonce2;
|
||||||
bool sapling;
|
bool sapling;
|
||||||
bool stale;
|
bool stale;
|
||||||
|
|
||||||
// x16rt
|
|
||||||
uint32_t merkleroothash[8];
|
|
||||||
uint32_t witmerkleroothash[8];
|
|
||||||
uint32_t denom10[8];
|
|
||||||
uint32_t denom100[8];
|
|
||||||
uint32_t denom1000[8];
|
|
||||||
uint32_t denom10000[8];
|
|
||||||
|
|
||||||
} __attribute__ ((aligned (64)));
|
} __attribute__ ((aligned (64)));
|
||||||
|
|
||||||
struct stratum_job {
|
struct stratum_job
|
||||||
|
{
|
||||||
unsigned char prevhash[32];
|
unsigned char prevhash[32];
|
||||||
unsigned char final_sapling_hash[32];
|
unsigned char final_sapling_hash[32];
|
||||||
char *job_id;
|
char *job_id;
|
||||||
@@ -417,7 +412,7 @@ struct stratum_job {
|
|||||||
unsigned char ntime[4];
|
unsigned char ntime[4];
|
||||||
double diff;
|
double diff;
|
||||||
bool clean;
|
bool clean;
|
||||||
// for x16rt
|
// for x16rt-veil
|
||||||
unsigned char extra[64];
|
unsigned char extra[64];
|
||||||
unsigned char denom10[32];
|
unsigned char denom10[32];
|
||||||
unsigned char denom100[32];
|
unsigned char denom100[32];
|
||||||
@@ -551,15 +546,16 @@ enum algos {
|
|||||||
ALGO_LYRA2RE,
|
ALGO_LYRA2RE,
|
||||||
ALGO_LYRA2REV2,
|
ALGO_LYRA2REV2,
|
||||||
ALGO_LYRA2REV3,
|
ALGO_LYRA2REV3,
|
||||||
ALGO_LYRA2Z,
|
ALGO_LYRA2Z,
|
||||||
ALGO_LYRA2Z330,
|
ALGO_LYRA2Z330,
|
||||||
ALGO_M7M,
|
ALGO_M7M,
|
||||||
|
ALGO_MINOTAUR,
|
||||||
ALGO_MYR_GR,
|
ALGO_MYR_GR,
|
||||||
ALGO_NEOSCRYPT,
|
ALGO_NEOSCRYPT,
|
||||||
ALGO_NIST5,
|
ALGO_NIST5,
|
||||||
ALGO_PENTABLAKE,
|
ALGO_PENTABLAKE,
|
||||||
ALGO_PHI1612,
|
ALGO_PHI1612,
|
||||||
ALGO_PHI2,
|
ALGO_PHI2,
|
||||||
ALGO_POLYTIMOS,
|
ALGO_POLYTIMOS,
|
||||||
ALGO_POWER2B,
|
ALGO_POWER2B,
|
||||||
ALGO_QUARK,
|
ALGO_QUARK,
|
||||||
@@ -642,10 +638,11 @@ static const char* const algo_names[] = {
|
|||||||
"lyra2re",
|
"lyra2re",
|
||||||
"lyra2rev2",
|
"lyra2rev2",
|
||||||
"lyra2rev3",
|
"lyra2rev3",
|
||||||
"lyra2z",
|
"lyra2z",
|
||||||
"lyra2z330",
|
"lyra2z330",
|
||||||
"m7m",
|
"m7m",
|
||||||
"myr-gr",
|
"minotaur",
|
||||||
|
"myr-gr",
|
||||||
"neoscrypt",
|
"neoscrypt",
|
||||||
"nist5",
|
"nist5",
|
||||||
"pentablake",
|
"pentablake",
|
||||||
@@ -750,6 +747,7 @@ extern double opt_diff_factor;
|
|||||||
extern double opt_target_factor;
|
extern double opt_target_factor;
|
||||||
extern bool opt_randomize;
|
extern bool opt_randomize;
|
||||||
extern bool allow_mininginfo;
|
extern bool allow_mininginfo;
|
||||||
|
extern pthread_rwlock_t g_work_lock;
|
||||||
extern time_t g_work_time;
|
extern time_t g_work_time;
|
||||||
extern bool opt_stratum_stats;
|
extern bool opt_stratum_stats;
|
||||||
extern int num_cpus;
|
extern int num_cpus;
|
||||||
@@ -802,7 +800,8 @@ Options:\n\
|
|||||||
lyra2z330 Lyra2 330 rows\n\
|
lyra2z330 Lyra2 330 rows\n\
|
||||||
m7m Magi (XMG)\n\
|
m7m Magi (XMG)\n\
|
||||||
myr-gr Myriad-Groestl\n\
|
myr-gr Myriad-Groestl\n\
|
||||||
neoscrypt NeoScrypt(128, 2, 1)\n\
|
minotaur Ringcoin (RNG)\n\
|
||||||
|
neoscrypt NeoScrypt(128, 2, 1)\n\
|
||||||
nist5 Nist5\n\
|
nist5 Nist5\n\
|
||||||
pentablake 5 x blake512\n\
|
pentablake 5 x blake512\n\
|
||||||
phi1612 phi\n\
|
phi1612 phi\n\
|
||||||
|
@@ -375,10 +375,10 @@ static inline void memcpy_512( __m512i *dst, const __m512i *src, const int n )
|
|||||||
|
|
||||||
// Generic for odd rotations
|
// Generic for odd rotations
|
||||||
#define mm512_ror_x64( v, n ) _mm512_alignr_epi64( v, v, n )
|
#define mm512_ror_x64( v, n ) _mm512_alignr_epi64( v, v, n )
|
||||||
#define mm512_rol_x64( v, n ) _mm512_alignr_epi64( v, v, 8-n )
|
#define mm512_rol_x64( v, n ) _mm512_alignr_epi64( v, v, 8-(n) )
|
||||||
|
|
||||||
#define mm512_ror_x32( v, n ) _mm512_alignr_epi32( v, v, n )
|
#define mm512_ror_x32( v, n ) _mm512_alignr_epi32( v, v, n )
|
||||||
#define mm512_rol_x32( v, n ) _mm512_alignr_epi32( v, v, 16-n )
|
#define mm512_rol_x32( v, n ) _mm512_alignr_epi32( v, v, 16-(n) )
|
||||||
|
|
||||||
#define mm512_ror_1x16( v ) \
|
#define mm512_ror_1x16( v ) \
|
||||||
_mm512_permutexvar_epi16( m512_const_64( \
|
_mm512_permutexvar_epi16( m512_const_64( \
|
||||||
|
24
util.c
24
util.c
@@ -81,6 +81,15 @@ struct thread_q {
|
|||||||
pthread_cond_t cond;
|
pthread_cond_t cond;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool is_power_of_2( int n )
|
||||||
|
{
|
||||||
|
while ( n > 1 )
|
||||||
|
{
|
||||||
|
if ( n % 2 != 0 ) return false;
|
||||||
|
n = n / 2;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void applog2( int prio, const char *fmt, ... )
|
void applog2( int prio, const char *fmt, ... )
|
||||||
{
|
{
|
||||||
@@ -609,6 +618,8 @@ json_t *json_rpc_call(CURL *curl, const char *url,
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// want_stratum is useless, and so is this code it seems. Nothing in
|
||||||
|
// hi appears to be set.
|
||||||
/* If X-Stratum was found, activate Stratum */
|
/* If X-Stratum was found, activate Stratum */
|
||||||
if (want_stratum && hi.stratum_url &&
|
if (want_stratum && hi.stratum_url &&
|
||||||
!strncasecmp(hi.stratum_url, "stratum+tcp://", 14)) {
|
!strncasecmp(hi.stratum_url, "stratum+tcp://", 14)) {
|
||||||
@@ -747,6 +758,19 @@ err_out:
|
|||||||
return cfg;
|
return cfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Segwit BEGIN
|
||||||
|
void memrev(unsigned char *p, size_t len)
|
||||||
|
{
|
||||||
|
unsigned char c, *q;
|
||||||
|
for (q = p + len - 1; p < q; p++, q--) {
|
||||||
|
c = *p;
|
||||||
|
*p = *q;
|
||||||
|
*q = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Segwit END
|
||||||
|
|
||||||
|
|
||||||
void cbin2hex(char *out, const char *in, size_t len)
|
void cbin2hex(char *out, const char *in, size_t len)
|
||||||
{
|
{
|
||||||
if (out) {
|
if (out) {
|
||||||
|
@@ -10,13 +10,10 @@
|
|||||||
# define some local variables
|
# define some local variables
|
||||||
|
|
||||||
export LOCAL_LIB="$HOME/usr/lib"
|
export LOCAL_LIB="$HOME/usr/lib"
|
||||||
|
|
||||||
export CONFIGURE_ARGS="--with-curl=$LOCAL_LIB/curl --with-crypto=$LOCAL_LIB/openssl --host=x86_64-w64-mingw32"
|
export CONFIGURE_ARGS="--with-curl=$LOCAL_LIB/curl --with-crypto=$LOCAL_LIB/openssl --host=x86_64-w64-mingw32"
|
||||||
|
|
||||||
export MINGW_LIB="/usr/x86_64-w64-mingw32/lib"
|
export MINGW_LIB="/usr/x86_64-w64-mingw32/lib"
|
||||||
|
# set correct gcc version
|
||||||
export GCC_MINGW_LIB="/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32"
|
export GCC_MINGW_LIB="/usr/lib/gcc/x86_64-w64-mingw32/9.3-win32"
|
||||||
|
|
||||||
# used by GCC
|
# used by GCC
|
||||||
export LDFLAGS="-L$LOCAL_LIB/curl/lib/.libs -L$LOCAL_LIB/gmp/.libs -L$LOCAL_LIB/openssl"
|
export LDFLAGS="-L$LOCAL_LIB/curl/lib/.libs -L$LOCAL_LIB/gmp/.libs -L$LOCAL_LIB/openssl"
|
||||||
|
|
||||||
@@ -43,19 +40,27 @@ cp $LOCAL_LIB/curl/lib/.libs/libcurl-4.dll release/
|
|||||||
|
|
||||||
# Start building...
|
# Start building...
|
||||||
|
|
||||||
make distclean || echo clean
|
./clean-all.sh || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
./autogen.sh || echo done
|
./autogen.sh || echo done
|
||||||
|
CFLAGS="-O3 -march=icelake-client -Wall" ./configure $CONFIGURE_ARGS
|
||||||
|
make -j 8
|
||||||
|
strip -s cpuminer.exe
|
||||||
|
mv cpuminer.exe release/cpuminer-avx512-sha-vaes.exe
|
||||||
|
|
||||||
|
make clean || echo clean
|
||||||
|
rm -f config.status
|
||||||
CFLAGS="-O3 -march=znver1 -Wall" ./configure $CONFIGURE_ARGS
|
CFLAGS="-O3 -march=znver1 -Wall" ./configure $CONFIGURE_ARGS
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe release/cpuminer-zen.exe
|
mv cpuminer.exe release/cpuminer-zen.exe
|
||||||
|
|
||||||
# mingw won't compile avx512 without -fno-asynchronous-unwind-tables
|
# mingw won't compile avx512 without -fno-asynchronous-unwind-tables
|
||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -march=skylake-avx512 -Wall -fno-asynchronous-unwind-tables" ./configure $CONFIGURE_ARGS
|
CFLAGS="-O3 -march=skylake-avx512 -Wall" ./configure $CONFIGURE_ARGS
|
||||||
make -j 16
|
#CFLAGS="-O3 -march=skylake-avx512 -Wall -fno-asynchronous-unwind-tables" ./configure $CONFIGURE_ARGS
|
||||||
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe release/cpuminer-avx512.exe
|
mv cpuminer.exe release/cpuminer-avx512.exe
|
||||||
|
|
||||||
@@ -63,7 +68,7 @@ make clean || echo clean
|
|||||||
rm -f config.status
|
rm -f config.status
|
||||||
# GCC 9 doesn't include AES in -march=core-avx2
|
# GCC 9 doesn't include AES in -march=core-avx2
|
||||||
CFLAGS="-O3 -march=core-avx2 -maes -Wall" ./configure $CONFIGURE_ARGS
|
CFLAGS="-O3 -march=core-avx2 -maes -Wall" ./configure $CONFIGURE_ARGS
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe release/cpuminer-avx2.exe
|
mv cpuminer.exe release/cpuminer-avx2.exe
|
||||||
|
|
||||||
@@ -71,7 +76,7 @@ make clean || echo clean
|
|||||||
rm -f config.status
|
rm -f config.status
|
||||||
# -march=corei7-avx still includes aes, but just in case
|
# -march=corei7-avx still includes aes, but just in case
|
||||||
CFLAGS="-O3 -march=corei7-avx -maes -Wall" ./configure $CONFIGURE_ARGS
|
CFLAGS="-O3 -march=corei7-avx -maes -Wall" ./configure $CONFIGURE_ARGS
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe release/cpuminer-avx.exe
|
mv cpuminer.exe release/cpuminer-avx.exe
|
||||||
|
|
||||||
@@ -80,7 +85,7 @@ make clean || echo clean
|
|||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -march=westmere -Wall" ./configure $CONFIGURE_ARGS
|
CFLAGS="-O3 -march=westmere -Wall" ./configure $CONFIGURE_ARGS
|
||||||
#CFLAGS="-O3 -maes -msse4.2 -Wall" ./configure $CONFIGURE_ARGS
|
#CFLAGS="-O3 -maes -msse4.2 -Wall" ./configure $CONFIGURE_ARGS
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe release/cpuminer-aes-sse42.exe
|
mv cpuminer.exe release/cpuminer-aes-sse42.exe
|
||||||
|
|
||||||
@@ -102,7 +107,7 @@ mv cpuminer.exe release/cpuminer-aes-sse42.exe
|
|||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
rm -f config.status
|
rm -f config.status
|
||||||
CFLAGS="-O3 -msse2 -Wall" ./configure $CONFIGURE_ARGS
|
CFLAGS="-O3 -msse2 -Wall" ./configure $CONFIGURE_ARGS
|
||||||
make -j 16
|
make -j 8
|
||||||
strip -s cpuminer.exe
|
strip -s cpuminer.exe
|
||||||
mv cpuminer.exe release/cpuminer-sse2.exe
|
mv cpuminer.exe release/cpuminer-sse2.exe
|
||||||
make clean || echo clean
|
make clean || echo clean
|
||||||
|
Reference in New Issue
Block a user