summaryrefslogtreecommitdiffstats
path: root/xmrstak
diff options
context:
space:
mode:
Diffstat (limited to 'xmrstak')
-rw-r--r--xmrstak/backend/cpu/hwlocMemory.cpp64
-rw-r--r--xmrstak/backend/cpu/hwlocMemory.hpp56
-rw-r--r--xmrstak/backend/nvidia/minethd.cpp16
-rw-r--r--xmrstak/backend/nvidia/minethd.hpp2
-rw-r--r--xmrstak/backend/nvidia/nvcc_code/cryptonight.hpp4
-rw-r--r--xmrstak/backend/nvidia/nvcc_code/cuda_core.cu28
-rw-r--r--xmrstak/config.tpl8
-rw-r--r--xmrstak/jconf.cpp13
-rw-r--r--xmrstak/misc/console.cpp6
-rw-r--r--xmrstak/misc/console.hpp2
10 files changed, 122 insertions, 77 deletions
diff --git a/xmrstak/backend/cpu/hwlocMemory.cpp b/xmrstak/backend/cpu/hwlocMemory.cpp
new file mode 100644
index 0000000..94d2b53
--- /dev/null
+++ b/xmrstak/backend/cpu/hwlocMemory.cpp
@@ -0,0 +1,64 @@
+#include "xmrstak/backend/cpu/hwlocMemory.hpp"
+
+#ifndef CONF_NO_HWLOC
+
+#include "xmrstak/misc/console.hpp"
+
+#include <hwloc.h>
+
+/** pin memory to NUMA node
+ *
+ * Set the default memory policy for the current thread to bind memory to the
+ * NUMA node.
+ *
+ * @param puId core id
+ */
+void bindMemoryToNUMANode( size_t puId )
+{
+ int depth;
+ hwloc_topology_t topology;
+
+ hwloc_topology_init(&topology);
+ hwloc_topology_load(topology);
+
+ if(!hwloc_topology_get_support(topology)->membind->set_thisthread_membind)
+ {
+ printer::inst()->print_msg(L0, "hwloc: set_thisthread_membind not supported");
+ hwloc_topology_destroy(topology);
+ return;
+ }
+
+ depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PU);
+
+ for( size_t i = 0;
+ i < hwloc_get_nbobjs_by_depth(topology, depth);
+ i++ )
+ {
+ hwloc_obj_t pu = hwloc_get_obj_by_depth(topology, depth, i);
+ if( pu->os_index == puId )
+ {
+ if( 0 > hwloc_set_membind_nodeset(
+ topology,
+ pu->nodeset,
+ HWLOC_MEMBIND_BIND,
+ HWLOC_MEMBIND_THREAD))
+ {
+ printer::inst()->print_msg(L0, "hwloc: can't bind memory");
+ }
+ else
+ {
+ printer::inst()->print_msg(L0, "hwloc: memory pinned");
+ break;
+ }
+ }
+ }
+
+ hwloc_topology_destroy(topology);
+}
+#else
+
+void bindMemoryToNUMANode( size_t )
+{
+}
+
+#endif
diff --git a/xmrstak/backend/cpu/hwlocMemory.hpp b/xmrstak/backend/cpu/hwlocMemory.hpp
index 69742be..2130c2c 100644
--- a/xmrstak/backend/cpu/hwlocMemory.hpp
+++ b/xmrstak/backend/cpu/hwlocMemory.hpp
@@ -1,10 +1,6 @@
#pragma once
-#include "xmrstak/misc/console.hpp"
-
-#ifndef CONF_NO_HWLOC
-
-#include <hwloc.h>
+#include <cstddef>
/** pin memory to NUMA node
*
@@ -13,52 +9,4 @@
*
* @param puId core id
*/
-void bindMemoryToNUMANode( size_t puId )
-{
- int depth;
- hwloc_topology_t topology;
-
- hwloc_topology_init(&topology);
- hwloc_topology_load(topology);
-
- if(!hwloc_topology_get_support(topology)->membind->set_thisthread_membind)
- {
- printer::inst()->print_msg(L0, "hwloc: set_thisthread_membind not supported");
- hwloc_topology_destroy(topology);
- return;
- }
-
- depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PU);
-
- for( size_t i = 0;
- i < hwloc_get_nbobjs_by_depth(topology, depth);
- i++ )
- {
- hwloc_obj_t pu = hwloc_get_obj_by_depth(topology, depth, i);
- if( pu->os_index == puId )
- {
- if( 0 > hwloc_set_membind_nodeset(
- topology,
- pu->nodeset,
- HWLOC_MEMBIND_BIND,
- HWLOC_MEMBIND_THREAD))
- {
- printer::inst()->print_msg(L0, "hwloc: can't bind memory");
- }
- else
- {
- printer::inst()->print_msg(L0, "hwloc: memory pinned");
- break;
- }
- }
- }
-
- hwloc_topology_destroy(topology);
-}
-#else
-
-void bindMemoryToNUMANode( size_t )
-{
-}
-
-#endif
+void bindMemoryToNUMANode( size_t puId );
diff --git a/xmrstak/backend/nvidia/minethd.cpp b/xmrstak/backend/nvidia/minethd.cpp
index 0bc6214..0cf9a42 100644
--- a/xmrstak/backend/nvidia/minethd.cpp
+++ b/xmrstak/backend/nvidia/minethd.cpp
@@ -222,7 +222,6 @@ void minethd::work_main()
}
bool mineMonero = strcmp_i(::jconf::inst()->GetCurrency(), "monero");
- bool useAEON = strcmp_i(::jconf::inst()->GetCurrency(), "aeon");
while (bQuit == 0)
{
@@ -261,18 +260,9 @@ void minethd::work_main()
uint32_t foundCount;
cryptonight_extra_cpu_prepare(&ctx, iNonce);
-#ifndef CONF_NO_MONERO
- if(mineMonero)
- {
- cryptonight_core_cpu_hash<MONERO_ITER, MONERO_MASK, 19>(&ctx);
- }
-#endif
-#ifndef CONF_NO_AEON
- if(useAEON)
- {
- cryptonight_core_cpu_hash<MONERO_ITER, MONERO_MASK, 18>(&ctx);
- }
-#endif
+
+ cryptonight_core_cpu_hash(&ctx, mineMonero);
+
cryptonight_extra_cpu_final(&ctx, iNonce, oWork.iTarget, &foundCount, foundNonce);
for(size_t i = 0; i < foundCount; i++)
diff --git a/xmrstak/backend/nvidia/minethd.hpp b/xmrstak/backend/nvidia/minethd.hpp
index d1fce40..f6d989c 100644
--- a/xmrstak/backend/nvidia/minethd.hpp
+++ b/xmrstak/backend/nvidia/minethd.hpp
@@ -4,7 +4,7 @@
#include "jconf.hpp"
#include "nvcc_code/cryptonight.hpp"
-#include "xmrstak/backend/cpu/crypto/cryptonight.h"
+#include "xmrstak/backend/cpu/minethd.hpp"
#include "xmrstak/backend/iBackend.hpp"
#include "xmrstak/misc/environment.hpp"
diff --git a/xmrstak/backend/nvidia/nvcc_code/cryptonight.hpp b/xmrstak/backend/nvidia/nvcc_code/cryptonight.hpp
index 4e0ace7..0cfdaac 100644
--- a/xmrstak/backend/nvidia/nvcc_code/cryptonight.hpp
+++ b/xmrstak/backend/nvidia/nvcc_code/cryptonight.hpp
@@ -44,6 +44,4 @@ void cryptonight_extra_cpu_prepare(nvid_ctx* ctx, uint32_t startNonce);
void cryptonight_extra_cpu_final(nvid_ctx* ctx, uint32_t startNonce, uint64_t target, uint32_t* rescount, uint32_t *resnonce);
}
-template<size_t ITERATIONS, size_t THREAD_SHIFT, uint32_t MASK>
-void cryptonight_core_cpu_hash(nvid_ctx* ctx);
-
+void cryptonight_core_cpu_hash(nvid_ctx* ctx, bool mineMonero);
diff --git a/xmrstak/backend/nvidia/nvcc_code/cuda_core.cu b/xmrstak/backend/nvidia/nvcc_code/cuda_core.cu
index 5bea230..a92fa8c 100644
--- a/xmrstak/backend/nvidia/nvcc_code/cuda_core.cu
+++ b/xmrstak/backend/nvidia/nvcc_code/cuda_core.cu
@@ -1,3 +1,5 @@
+#include "xmrstak/backend/cryptonight.hpp"
+
#include <stdio.h>
#include <stdint.h>
#include <string.h>
@@ -92,7 +94,7 @@ __device__ __forceinline__ void storeGlobal32( T* addr, T const & val )
asm volatile( "st.global.cg.u32 [%0], %1;" : : "l"( addr ), "r"( val ) );
}
-template<size_t ITERATIONS, size_t THREAD_SHIFT>
+template<size_t ITERATIONS, uint32_t THREAD_SHIFT>
__global__ void cryptonight_core_gpu_phase1( int threads, int bfactor, int partidx, uint32_t * __restrict__ long_state, uint32_t * __restrict__ ctx_state, uint32_t * __restrict__ ctx_key1 )
{
__shared__ uint32_t sharedMemory[1024];
@@ -168,7 +170,7 @@ __forceinline__ __device__ uint32_t shuffle(volatile uint32_t* ptr,const uint32_
#ifdef XMR_STAK_THREADS
__launch_bounds__( XMR_STAK_THREADS * 4 )
#endif
-template<size_t ITERATIONS, size_t THREAD_SHIFT, uint32_t MASK>
+template<size_t ITERATIONS, uint32_t THREAD_SHIFT, uint32_t MASK>
__global__ void cryptonight_core_gpu_phase2( int threads, int bfactor, int partidx, uint32_t * d_long_state, uint32_t * d_ctx_a, uint32_t * d_ctx_b )
{
__shared__ uint32_t sharedMemory[1024];
@@ -257,7 +259,7 @@ __global__ void cryptonight_core_gpu_phase2( int threads, int bfactor, int parti
}
}
-template<size_t ITERATIONS, size_t THREAD_SHIFT>
+template<size_t ITERATIONS, uint32_t THREAD_SHIFT>
__global__ void cryptonight_core_gpu_phase3( int threads, int bfactor, int partidx, const uint32_t * __restrict__ long_state, uint32_t * __restrict__ d_ctx_state, uint32_t * __restrict__ d_ctx_key2 )
{
__shared__ uint32_t sharedMemory[1024];
@@ -292,8 +294,8 @@ __global__ void cryptonight_core_gpu_phase3( int threads, int bfactor, int parti
MEMCPY8( d_ctx_state + thread * 50 + sub + 16, text, 2 );
}
-template<size_t ITERATIONS, size_t THREAD_SHIFT, uint32_t MASK>
-void cryptonight_core_cpu_hash(nvid_ctx* ctx)
+template<size_t ITERATIONS, uint32_t MASK, uint32_t THREAD_SHIFT>
+void cryptonight_core_gpu_hash(nvid_ctx* ctx)
{
dim3 grid( ctx->device_blocks );
dim3 block( ctx->device_threads );
@@ -349,3 +351,19 @@ void cryptonight_core_cpu_hash(nvid_ctx* ctx)
ctx->d_ctx_state, ctx->d_ctx_key2 ));
}
}
+
+void cryptonight_core_cpu_hash(nvid_ctx* ctx, bool mineMonero)
+{
+#ifndef CONF_NO_MONERO
+ if(mineMonero)
+ {
+ cryptonight_core_gpu_hash<MONERO_ITER, MONERO_MASK, 19u>(ctx);
+ }
+#endif
+#ifndef CONF_NO_AEON
+ if(!mineMonero)
+ {
+ cryptonight_core_gpu_hash<AEON_ITER, AEON_MASK, 18u>(ctx);
+ }
+#endif
+}
diff --git a/xmrstak/config.tpl b/xmrstak/config.tpl
index 032d483..3308354 100644
--- a/xmrstak/config.tpl
+++ b/xmrstak/config.tpl
@@ -140,6 +140,14 @@ R"===(
"daemon_mode" : false,
/*
+ * Buffered output control.
+ * When running the miner through a pipe, standard output is buffered. This means that the pipe won't read
+ * each output line immediately. This can cause delays when running in background.
+ * Set this option to true to flush stdout after each line, so it can be read immediately.
+ */
+ "flush_stdout" : false,
+
+/*
* Output file
*
* output_file - This option will log all output to a file.
diff --git a/xmrstak/jconf.cpp b/xmrstak/jconf.cpp
index 4b23ed5..c82865d 100644
--- a/xmrstak/jconf.cpp
+++ b/xmrstak/jconf.cpp
@@ -48,7 +48,7 @@ using namespace rapidjson;
*/
enum configEnum {
bTlsMode, bTlsSecureAlgo, sTlsFingerprint, sPoolAddr, sWalletAddr, sPoolPwd,sCurrency,
- iCallTimeout, iNetRetry, iGiveUpLimit, iVerboseLevel, iAutohashTime,
+ iCallTimeout, iNetRetry, iGiveUpLimit, iVerboseLevel, iAutohashTime,bFlushStdout,
bDaemonMode, sOutputFile, iHttpdPort, bPreferIpv4, bNiceHashMode, bAesOverride, sUseSlowMem };
struct configVal {
@@ -72,6 +72,7 @@ configVal oConfigValues[] = {
{ iGiveUpLimit, "giveup_limit", kNumberType },
{ iVerboseLevel, "verbose_level", kNumberType },
{ iAutohashTime, "h_print_time", kNumberType },
+ { bFlushStdout, "flush_stdout", kTrueType},
{ bDaemonMode, "daemon_mode", kTrueType },
{ sOutputFile, "output_file", kStringType },
{ iHttpdPort, "httpd_port", kNumberType },
@@ -448,5 +449,15 @@ bool jconf::parse_config(const char* sFilename)
}
#endif // _WIN32
+ if (prv->configValues[bFlushStdout]->IsBool())
+ {
+ bool bflush = prv->configValues[bFlushStdout]->GetBool();
+ printer::inst()->set_flush_stdout(bflush);
+ if (bflush)
+ {
+ printer::inst()->print_msg(L0, "Flush stdout forced.");
+ }
+ }
+
return true;
}
diff --git a/xmrstak/misc/console.cpp b/xmrstak/misc/console.cpp
index ba34bb3..ce63bcb 100644
--- a/xmrstak/misc/console.cpp
+++ b/xmrstak/misc/console.cpp
@@ -156,6 +156,7 @@ printer::printer()
{
verbose_level = LINF;
logfile = nullptr;
+ b_flush_stdout = false;
}
bool printer::open_logfile(const char* file)
@@ -193,6 +194,11 @@ void printer::print_msg(verbosity verbose, const char* fmt, ...)
std::unique_lock<std::mutex> lck(print_mutex);
fputs(buf, stdout);
+ if (b_flush_stdout)
+ {
+ fflush(stdout);
+ }
+
if(logfile != nullptr)
{
fputs(buf, logfile);
diff --git a/xmrstak/misc/console.hpp b/xmrstak/misc/console.hpp
index 4d5be78..97e86bd 100644
--- a/xmrstak/misc/console.hpp
+++ b/xmrstak/misc/console.hpp
@@ -35,6 +35,7 @@ public:
};
inline void set_verbose_level(size_t level) { verbose_level = (verbosity)level; }
+ inline void set_flush_stdout(bool status) { b_flush_stdout = status; }
void print_msg(verbosity verbose, const char* fmt, ...);
void print_str(const char* str);
bool open_logfile(const char* file);
@@ -44,6 +45,7 @@ private:
std::mutex print_mutex;
verbosity verbose_level;
+ bool b_flush_stdout;
FILE* logfile;
};
OpenPOWER on IntegriCloud