Merge pull request #2773 from patricklodder/1.14.6-fix-scrypt-sse2

Fix and enable scrypt sse2 integration
This commit is contained in:
chromatic 2022-07-26 11:43:04 -07:00 committed by GitHub
commit 4f00f033f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 39 additions and 10 deletions

View File

@ -170,7 +170,7 @@ jobs:
run-bench: true
run-tests: true
dep-opts: "AVX2=1"
config-opts: "--with-intel-avx2 --enable-gui=qt5 --enable-zmq --enable-glibc-back-compat --enable-reduce-exports"
config-opts: "--enable-scrypt-sse2 --with-intel-avx2 --enable-gui=qt5 --enable-zmq --enable-glibc-back-compat --enable-reduce-exports"
goal: install
runs-on: ${{ matrix.os }}

View File

@ -177,6 +177,12 @@ AC_ARG_ENABLE([zmq],
[use_zmq=$enableval],
[use_zmq=yes])
AC_ARG_ENABLE([scrypt-sse2],
[AS_HELP_STRING([--enable-scrypt-sse2],
[Build with scrypt sse2 implementation (default is no)])],
[use_scrypt_sse2=$enableval],
[use_scrypt_sse2=no])
AC_ARG_WITH([intel-avx2],
[AS_HELP_STRING([--with-intel-avx2],
[Build with intel avx2 (default is no)])],
@ -725,6 +731,11 @@ BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRA
fi
# Configure Scrypt SSE2
if test x$use_scrypt_sse2 = xyes; then
AC_DEFINE(USE_SSE2, 1, [Define this symbol if SSE2 works])
fi
if test x$intel_avx2 = xyes; then
case $host in
x86_64-*-linux*)
@ -1028,6 +1039,7 @@ AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes])
AM_CONDITIONAL([WORDS_BIGENDIAN],[test x$ac_cv_c_bigendian = xyes])
AM_CONDITIONAL([USE_SCRYPT_SSE2], [test x$use_scrypt_sse2 = xyes])
AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version])
AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version])

View File

@ -267,6 +267,11 @@ crypto_libdogecoin_crypto_a_SOURCES = \
crypto/sha512.cpp \
crypto/sha512.h
# only include SSE2 scrypt sources if USE_SCRYPT_SSE2 is defined
if USE_SCRYPT_SSE2
crypto_libdogecoin_crypto_a_SOURCES += crypto/scrypt-sse2.cpp
endif
# consensus: shared between all executables that validate any consensus rules.
libdogecoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libdogecoin_consensus_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

View File

@ -222,10 +222,11 @@ void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scrat
// By default, set to generic scrypt function. This will prevent crash in case when scrypt_detect_sse2() wasn't called
void (*scrypt_1024_1_1_256_sp_detected)(const char *input, char *output, char *scratchpad) = &scrypt_1024_1_1_256_sp_generic;
void scrypt_detect_sse2()
bool scrypt_detect_sse2()
{
bool fUsingSSE2;
#if defined(USE_SSE2_ALWAYS)
printf("scrypt: using scrypt-sse2 as built.\n");
fUsingSSE2 = true;
#else // USE_SSE2_ALWAYS
// 32bit x86 Linux or Windows, detect cpuid features
unsigned int cpuid_edx=0;
@ -243,14 +244,16 @@ void scrypt_detect_sse2()
if (cpuid_edx & 1<<26)
{
scrypt_1024_1_1_256_sp_detected = &scrypt_1024_1_1_256_sp_sse2;
printf("scrypt: using scrypt-sse2 as detected.\n");
fUsingSSE2 = true;
}
else
{
scrypt_1024_1_1_256_sp_detected = &scrypt_1024_1_1_256_sp_generic;
printf("scrypt: using scrypt-generic, SSE2 unavailable.\n");
fUsingSSE2 = false;
}
#endif // USE_SSE2_ALWAYS
return fUsingSSE2;
}
#endif

View File

@ -1,8 +1,12 @@
#ifndef SCRYPT_H
#define SCRYPT_H
#ifndef BITCOIN_CRYPTO_SCRYPT_H
#define BITCOIN_CRYPTO_SCRYPT_H
#include <stdlib.h>
#include <stdint.h>
#if defined(HAVE_CONFIG_H)
#include "bitcoin-config.h" // for USE_SSE2
#endif
static const int SCRYPT_SCRATCHPAD_SIZE = 131072 + 63;
void scrypt_1024_1_1_256(const char *input, char *output);
@ -16,7 +20,7 @@ void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scrat
#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_detected((input), (output), (scratchpad))
#endif
void scrypt_detect_sse2();
bool scrypt_detect_sse2();
void scrypt_1024_1_1_256_sp_sse2(const char *input, char *output, char *scratchpad);
extern void (*scrypt_1024_1_1_256_sp_detected)(const char *input, char *output, char *scratchpad);
#else
@ -44,4 +48,4 @@ static inline void le32enc(void *pp, uint32_t x)
p[3] = (x >> 24) & 0xff;
}
#endif
#endif
#endif // BITCOIN_CRYPTO_SCRYPT_H

View File

@ -17,6 +17,7 @@
#include "checkpoints.h"
#include "compat/sanity.h"
#include "consensus/validation.h"
#include "crypto/scrypt.h" // for scrypt_detect_sse2
#include "httpserver.h"
#include "httprpc.h"
#include "key.h"
@ -1231,7 +1232,11 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
int64_t nStart;
#if defined(USE_SSE2)
scrypt_detect_sse2();
if (scrypt_detect_sse2()) {
LogPrintf("scrypt: using SSE2 implementation\n");
} else {
LogPrintf("scrypt: using generic implementation\n");
}
#endif
// ********************************************************* Step 5: verify wallet database integrity