From c897fc04518b2701c7ec556a183406bae0760028 Mon Sep 17 00:00:00 2001 From: fireice-uk Date: Wed, 11 Oct 2017 23:53:31 +0100 Subject: [PATCH 1/6] cleanup and give a return from set_affinity --- xmrstak/backend/cpu/minethd.cpp | 41 ++++++++------------------------- xmrstak/backend/cpu/minethd.hpp | 2 +- 2 files changed, 11 insertions(+), 32 deletions(-) diff --git a/xmrstak/backend/cpu/minethd.cpp b/xmrstak/backend/cpu/minethd.cpp index 8a65a3b..1267a70 100644 --- a/xmrstak/backend/cpu/minethd.cpp +++ b/xmrstak/backend/cpu/minethd.cpp @@ -50,22 +50,8 @@ #include #include - #ifdef _WIN32 #include - -namespace xmrstak -{ -namespace cpu -{ -void minethd::thd_setaffinity(std::thread::native_handle_type h, uint64_t cpu_id) -{ - SetThreadAffinityMask(h, 1ULL << cpu_id); -} - -} // namespace cpu -} // namespace xmrstak - #else #include @@ -75,44 +61,37 @@ void minethd::thd_setaffinity(std::thread::native_handle_type h, uint64_t cpu_id #define SYSCTL_CORE_COUNT "machdep.cpu.core_count" #elif defined(__FreeBSD__) #include -#endif +#endif //__APPLE__ + +#endif //_WIN32 namespace xmrstak { namespace cpu { -void minethd::thd_setaffinity(std::thread::native_handle_type h, uint64_t cpu_id) +bool minethd::thd_setaffinity(std::thread::native_handle_type h, uint64_t cpu_id) { -#if defined(__APPLE__) +#if defined(_WIN32) + return SetThreadAffinityMask(h, 1ULL << cpu_id) != 0; +#elif defined(__APPLE__) thread_port_t mach_thread; thread_affinity_policy_data_t policy = { static_cast(cpu_id) }; mach_thread = pthread_mach_thread_np(h); - thread_policy_set(mach_thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1); + return thread_policy_set(mach_thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1) == KERN_SUCCESS; #elif defined(__FreeBSD__) cpuset_t mn; CPU_ZERO(&mn); CPU_SET(cpu_id, &mn); - pthread_setaffinity_np(h, sizeof(cpuset_t), &mn); + return pthread_setaffinity_np(h, sizeof(cpuset_t), &mn) == 0; #else cpu_set_t mn; CPU_ZERO(&mn); CPU_SET(cpu_id, &mn); - pthread_setaffinity_np(h, sizeof(cpu_set_t), &mn); + return pthread_setaffinity_np(h, sizeof(cpu_set_t), &mn) == 0; #endif } -} // namespace cpu -} // namespace xmrstak - -#endif // _WIN32 - - -namespace xmrstak -{ -namespace cpu -{ - minethd::minethd(miner_work& pWork, size_t iNo, bool double_work, bool no_prefetch, int64_t affinity) { oWork = pWork; diff --git a/xmrstak/backend/cpu/minethd.hpp b/xmrstak/backend/cpu/minethd.hpp index 58d378e..584fb0d 100644 --- a/xmrstak/backend/cpu/minethd.hpp +++ b/xmrstak/backend/cpu/minethd.hpp @@ -24,7 +24,7 @@ public: typedef void (*cn_hash_fun)(const void*, size_t, void*, cryptonight_ctx*); static cn_hash_fun func_selector(bool bHaveAes, bool bNoPrefetch); - static void thd_setaffinity(std::thread::native_handle_type h, uint64_t cpu_id); + static bool thd_setaffinity(std::thread::native_handle_type h, uint64_t cpu_id); static cryptonight_ctx* minethd_alloc_ctx(); From da070d425916cbcbfd53e166a69c34ca7987ba72 Mon Sep 17 00:00:00 2001 From: fireice-uk Date: Wed, 11 Oct 2017 23:59:17 +0100 Subject: [PATCH 2/6] print warning --- xmrstak/backend/cpu/minethd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xmrstak/backend/cpu/minethd.cpp b/xmrstak/backend/cpu/minethd.cpp index 1267a70..6ee356e 100644 --- a/xmrstak/backend/cpu/minethd.cpp +++ b/xmrstak/backend/cpu/minethd.cpp @@ -305,7 +305,8 @@ void minethd::pin_thd_affinity() #if defined(__APPLE__) printer::inst()->print_msg(L1, "WARNING on MacOS thread affinity is only advisory."); #endif - thd_setaffinity(oWorkThd.native_handle(), affinity); + if(!thd_setaffinity(oWorkThd.native_handle(), affinity)) + printer::inst()->print_msg(L1, "WARNING setting affinity failed."); } void minethd::work_main() From 329a6d9ad172b5c9c4296a5762b039abac1881cb Mon Sep 17 00:00:00 2001 From: fireice-uk Date: Thu, 12 Oct 2017 00:02:43 +0100 Subject: [PATCH 3/6] swap order --- xmrstak/backend/cpu/minethd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xmrstak/backend/cpu/minethd.cpp b/xmrstak/backend/cpu/minethd.cpp index 6ee356e..1f0f2b1 100644 --- a/xmrstak/backend/cpu/minethd.cpp +++ b/xmrstak/backend/cpu/minethd.cpp @@ -299,14 +299,14 @@ void minethd::pin_thd_affinity() //Lock is needed because we need to use oWorkThd std::lock_guard lock(work_thd_mtx); - // pin memory to NUMA node - bindMemoryToNUMANode(affinity); - #if defined(__APPLE__) printer::inst()->print_msg(L1, "WARNING on MacOS thread affinity is only advisory."); #endif if(!thd_setaffinity(oWorkThd.native_handle(), affinity)) printer::inst()->print_msg(L1, "WARNING setting affinity failed."); + + // pin memory to NUMA node + bindMemoryToNUMANode(affinity); } void minethd::work_main() From 73482f3065af13de1140308f65371d059df7decf Mon Sep 17 00:00:00 2001 From: fireice-uk Date: Thu, 12 Oct 2017 12:38:14 +0100 Subject: [PATCH 4/6] Affinity - fix B --- xmrstak/backend/cpu/minethd.cpp | 16 +++++++++------- xmrstak/backend/cpu/minethd.hpp | 1 - 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/xmrstak/backend/cpu/minethd.cpp b/xmrstak/backend/cpu/minethd.cpp index 1f0f2b1..51091bf 100644 --- a/xmrstak/backend/cpu/minethd.cpp +++ b/xmrstak/backend/cpu/minethd.cpp @@ -106,6 +106,9 @@ minethd::minethd(miner_work& pWork, size_t iNo, bool double_work, bool no_prefet oWorkThd = std::thread(&minethd::double_work_main, this); else oWorkThd = std::thread(&minethd::work_main, this); + + if(!thd_setaffinity(oWorkThd.native_handle(), affinity)) + printer::inst()->print_msg(L1, "WARNING setting affinity failed."); } cryptonight_ctx* minethd::minethd_alloc_ctx() @@ -258,7 +261,13 @@ std::vector minethd::thread_starter(uint32_t threadOffset, miner_work pvThreads.push_back(thd); if(cfg.iCpuAff >= 0) + { +#if defined(__APPLE__) + printer::inst()->print_msg(L1, "WARNING on MacOS thread affinity is only advisory."); +#endif + printer::inst()->print_msg(L1, "Starting %s thread, affinity: %d.", cfg.bDoubleMode ? "double" : "single", (int)cfg.iCpuAff); + } else printer::inst()->print_msg(L1, "Starting %s thread, no affinity.", cfg.bDoubleMode ? "double" : "single"); } @@ -296,15 +305,8 @@ minethd::cn_hash_fun minethd::func_selector(bool bHaveAes, bool bNoPrefetch) void minethd::pin_thd_affinity() { - //Lock is needed because we need to use oWorkThd std::lock_guard lock(work_thd_mtx); -#if defined(__APPLE__) - printer::inst()->print_msg(L1, "WARNING on MacOS thread affinity is only advisory."); -#endif - if(!thd_setaffinity(oWorkThd.native_handle(), affinity)) - printer::inst()->print_msg(L1, "WARNING setting affinity failed."); - // pin memory to NUMA node bindMemoryToNUMANode(affinity); } diff --git a/xmrstak/backend/cpu/minethd.hpp b/xmrstak/backend/cpu/minethd.hpp index 584fb0d..ad75d07 100644 --- a/xmrstak/backend/cpu/minethd.hpp +++ b/xmrstak/backend/cpu/minethd.hpp @@ -46,7 +46,6 @@ private: miner_work oWork; void pin_thd_affinity(); - // Held by the creating context to prevent a race cond with oWorkThd = std::thread(...) std::mutex work_thd_mtx; std::thread oWorkThd; From 8bbdd45b9e63f6622ee2eac8f9dd0cd881a78aa4 Mon Sep 17 00:00:00 2001 From: fireice-uk Date: Thu, 12 Oct 2017 12:52:50 +0100 Subject: [PATCH 5/6] Affinity - fix C --- xmrstak/backend/cpu/minethd.cpp | 9 ++++++--- xmrstak/backend/cpu/minethd.hpp | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/xmrstak/backend/cpu/minethd.cpp b/xmrstak/backend/cpu/minethd.cpp index 51091bf..3059891 100644 --- a/xmrstak/backend/cpu/minethd.cpp +++ b/xmrstak/backend/cpu/minethd.cpp @@ -101,12 +101,15 @@ minethd::minethd(miner_work& pWork, size_t iNo, bool double_work, bool no_prefet bNoPrefetch = no_prefetch; this->affinity = affinity; - std::lock_guard lock(work_thd_mtx); + std::future order_guard = order_fix.get_future(); + if(double_work) oWorkThd = std::thread(&minethd::double_work_main, this); else oWorkThd = std::thread(&minethd::work_main, this); + order_guard.wait(); + if(!thd_setaffinity(oWorkThd.native_handle(), affinity)) printer::inst()->print_msg(L1, "WARNING setting affinity failed."); } @@ -305,8 +308,6 @@ minethd::cn_hash_fun minethd::func_selector(bool bHaveAes, bool bNoPrefetch) void minethd::pin_thd_affinity() { - std::lock_guard lock(work_thd_mtx); - // pin memory to NUMA node bindMemoryToNUMANode(affinity); } @@ -316,6 +317,8 @@ void minethd::work_main() if(affinity >= 0) //-1 means no affinity pin_thd_affinity(); + order_fix.set_value(); + cn_hash_fun hash_fun; cryptonight_ctx* ctx; uint64_t iCount = 0; diff --git a/xmrstak/backend/cpu/minethd.hpp b/xmrstak/backend/cpu/minethd.hpp index ad75d07..c023fcb 100644 --- a/xmrstak/backend/cpu/minethd.hpp +++ b/xmrstak/backend/cpu/minethd.hpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include namespace xmrstak { @@ -46,7 +46,7 @@ private: miner_work oWork; void pin_thd_affinity(); - std::mutex work_thd_mtx; + std::promise order_fix; std::thread oWorkThd; int64_t affinity; From 4253e7a0289bcaed1ecab7616f3405dfebb190e4 Mon Sep 17 00:00:00 2001 From: fireice-uk Date: Tue, 17 Oct 2017 19:44:18 +0100 Subject: [PATCH 6/6] rm pin_thd_affinity --- xmrstak/backend/cpu/minethd.cpp | 10 ++-------- xmrstak/backend/cpu/minethd.hpp | 1 - 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/xmrstak/backend/cpu/minethd.cpp b/xmrstak/backend/cpu/minethd.cpp index 3059891..eb395a5 100644 --- a/xmrstak/backend/cpu/minethd.cpp +++ b/xmrstak/backend/cpu/minethd.cpp @@ -306,16 +306,10 @@ minethd::cn_hash_fun minethd::func_selector(bool bHaveAes, bool bNoPrefetch) return func_table[digit.to_ulong()]; } -void minethd::pin_thd_affinity() -{ - // pin memory to NUMA node - bindMemoryToNUMANode(affinity); -} - void minethd::work_main() { if(affinity >= 0) //-1 means no affinity - pin_thd_affinity(); + bindMemoryToNUMANode(affinity); order_fix.set_value(); @@ -414,7 +408,7 @@ uint32_t* minethd::prep_double_work(uint8_t bDoubleWorkBlob[sizeof(miner_work::b void minethd::double_work_main() { if(affinity >= 0) //-1 means no affinity - pin_thd_affinity(); + bindMemoryToNUMANode(affinity); cn_hash_fun_dbl hash_fun; cryptonight_ctx* ctx0; diff --git a/xmrstak/backend/cpu/minethd.hpp b/xmrstak/backend/cpu/minethd.hpp index c023fcb..5ffd44e 100644 --- a/xmrstak/backend/cpu/minethd.hpp +++ b/xmrstak/backend/cpu/minethd.hpp @@ -45,7 +45,6 @@ private: static miner_work oGlobalWork; miner_work oWork; - void pin_thd_affinity(); std::promise order_fix; std::thread oWorkThd;