diff options
author | fireice-uk <fireice-uk@users.noreply.github.com> | 2017-10-27 17:19:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-27 17:19:00 +0100 |
commit | 91b307859ea97cc1abdb17da01b94919d3521803 (patch) | |
tree | 604e06aac65134610405c75610735e08ac5398a4 /xmrstak/backend/nvidia/minethd.cpp | |
parent | 847831e5f11a31bf2b04bc737534b08d1bb18e91 (diff) | |
parent | b5a7e4eb7f271cf0ae6a6085ee6e2a4466013e17 (diff) | |
download | xmr-stak-91b307859ea97cc1abdb17da01b94919d3521803.zip xmr-stak-91b307859ea97cc1abdb17da01b94919d3521803.tar.gz |
Merge pull request #69 from psychocrypt/topic-threadAffinity
thread affinity for non cpu backends
Diffstat (limited to 'xmrstak/backend/nvidia/minethd.cpp')
-rw-r--r-- | xmrstak/backend/nvidia/minethd.cpp | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/xmrstak/backend/nvidia/minethd.cpp b/xmrstak/backend/nvidia/minethd.cpp index 7549c86..cf58a21 100644 --- a/xmrstak/backend/nvidia/minethd.cpp +++ b/xmrstak/backend/nvidia/minethd.cpp @@ -31,6 +31,7 @@ #include "xmrstak/misc/executor.hpp" #include "xmrstak/jconf.hpp" #include "xmrstak/misc/environment.hpp" +#include "xmrstak/backend/cpu/hwlocMemory.hpp" #include <assert.h> #include <cmath> @@ -73,8 +74,17 @@ minethd::minethd(miner_work& pWork, size_t iNo, const jconf::thd_cfg& cfg) ctx.device_threads = (int)cfg.threads; ctx.device_bfactor = (int)cfg.bfactor; ctx.device_bsleep = (int)cfg.bsleep; + this->affinity = cfg.cpu_aff; + + std::future<void> order_guard = order_fix.get_future(); oWorkThd = std::thread(&minethd::work_main, this); + + order_guard.wait(); + + if(affinity >= 0) //-1 means no affinity + if(!cpu::minethd::thd_setaffinity(oWorkThd.native_handle(), affinity)) + printer::inst()->print_msg(L1, "WARNING setting affinity failed."); } @@ -147,22 +157,21 @@ std::vector<iBackend*>* minethd::thread_starter(uint32_t threadOffset, miner_wor for (i = 0; i < n; i++) { jconf::inst()->GetGPUThreadConfig(i, cfg); - minethd* thd = new minethd(pWork, i + threadOffset, cfg); if(cfg.cpu_aff >= 0) { #if defined(__APPLE__) printer::inst()->print_msg(L1, "WARNING on MacOS thread affinity is only advisory."); #endif - cpu::minethd::thd_setaffinity(thd->oWorkThd.native_handle(), cfg.cpu_aff); - } + printer::inst()->print_msg(L1, "Starting NVIDIA GPU thread %d, affinity: %d.", i, (int)cfg.cpu_aff); + } + else + printer::inst()->print_msg(L1, "Starting NVIDIA GPU thread %d, no affinity.", i); + + minethd* thd = new minethd(pWork, i + threadOffset, cfg); pvThreads->push_back(thd); - if(cfg.cpu_aff >= 0) - printer::inst()->print_msg(L1, "Starting GPU thread, affinity: %d.", (int)cfg.cpu_aff); - else - printer::inst()->print_msg(L1, "Starting GPU thread, no affinity."); } return pvThreads; @@ -191,6 +200,11 @@ void minethd::consume_work() void minethd::work_main() { + if(affinity >= 0) //-1 means no affinity + bindMemoryToNUMANode(affinity); + + order_fix.set_value(); + uint64_t iCount = 0; cryptonight_ctx* cpu_ctx; cpu_ctx = cpu::minethd::minethd_alloc_ctx(); |