@ -38,6 +38,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# include "utility.hpp"
# include "../randomx.h"
# include "../blake2/endian.h"
# include "../common.hpp"
# ifdef _WIN32
# include <windows.h>
# include <VersionHelpers.h>
# endif
const uint8_t blockTemplate_ [ ] = {
0x07 , 0x07 , 0xf7 , 0xa4 , 0xf0 , 0xd6 , 0x05 , 0xb3 , 0x03 , 0x26 , 0x08 , 0x16 , 0xba , 0x3f , 0x10 , 0x90 , 0x2e , 0x1a , 0x14 ,
@ -84,6 +89,19 @@ void printUsage(const char* executable) {
std : : cout < < " --seed S seed for cache initialization (default: 0) " < < std : : endl ;
}
struct MemoryException : public std : : exception {
} ;
struct CacheAllocException : public MemoryException {
const char * what ( ) const throw ( ) {
return " Cache allocation failed " ;
}
} ;
struct DatasetAllocException : public MemoryException {
const char * what ( ) const throw ( ) {
return " Dataset allocation failed " ;
}
} ;
void mine ( randomx_vm * vm , std : : atomic < uint32_t > & atomicNonce , AtomicHash & result , uint32_t noncesCount , int thread ) {
uint64_t hash [ RANDOMX_HASH_SIZE / sizeof ( uint64_t ) ] ;
uint8_t blockTemplate [ sizeof ( blockTemplate_ ) ] ;
@ -118,7 +136,7 @@ int main(int argc, char** argv) {
store32 ( & seed , seedValue ) ;
std : : cout < < " RandomX benchmark " < < std : : endl ;
std : : cout < < " RandomX benchmark v1.0.4 " < < std : : endl ;
if ( help | | ( ! miningMode & & ! verificationMode ) ) {
printUsage ( argv [ 0 ] ) ;
@ -171,19 +189,20 @@ int main(int argc, char** argv) {
std : : cout < < " ... " < < std : : endl ;
try {
if ( jit & & ! RANDOMX_HAVE_COMPILER ) {
throw std : : runtime_error ( " JIT compilation is not supported on this platform " ) ;
}
Stopwatch sw ( true ) ;
cache = randomx_alloc_cache ( flags ) ;
if ( cache = = nullptr ) {
if ( jit ) {
throw std : : runtime_error ( " JIT compilation is not supported or cache allocation failed " ) ;
}
throw std : : runtime_error ( " Cache allocation failed " ) ;
throw CacheAllocException ( ) ;
}
randomx_init_cache ( cache , & seed , sizeof ( seed ) ) ;
if ( miningMode ) {
dataset = randomx_alloc_dataset ( flags ) ;
if ( dataset = = nullptr ) {
throw std : : runtime_error ( " Dataset allocation failed " ) ;
throw DatasetAllocException ( ) ;
}
uint32_t datasetItemCount = randomx_dataset_item_count ( ) ;
if ( initThreadCount > 1 ) {
@ -241,7 +260,7 @@ int main(int argc, char** argv) {
std : : cout < < " Calculated result: " ;
result . print ( std : : cout ) ;
if ( noncesCount = = 1000 & & seedValue = = 0 )
std : : cout < < " Reference result: a925d346195ef38048e714709e0b24a88fef565fa02fa97127e00fac08ee6eb8 " < < std : : endl ;
std : : cout < < " Reference result: 38d47ea494480bff8d621189e8e92747288bb1da6c75dc401f2ab4b6807b6010 " < < std : : endl ;
if ( ! miningMode ) {
std : : cout < < " Performance: " < < 1000 * elapsed / noncesCount < < " ms per hash " < < std : : endl ;
}
@ -249,6 +268,20 @@ int main(int argc, char** argv) {
std : : cout < < " Performance: " < < noncesCount / elapsed < < " hashes per second " < < std : : endl ;
}
}
catch ( MemoryException & e ) {
std : : cout < < " ERROR: " < < e . what ( ) < < std : : endl ;
if ( largePages ) {
# ifdef _WIN32
std : : cout < < " To use large pages, please enable the \" Lock Pages in Memory \" policy and reboot. " < < std : : endl ;
if ( ! IsWindows8OrGreater ( ) ) {
std : : cout < < " Additionally, you have to run the benchmark from elevated command prompt. " < < std : : endl ;
}
# else
std : : cout < < " To use large pages, please run: sudo sysctl -w vm.nr_hugepages=1250 " < < std : : endl ;
# endif
}
return 1 ;
}
catch ( std : : exception & e ) {
std : : cout < < " ERROR: " < < e . what ( ) < < std : : endl ;
return 1 ;