summaryrefslogtreecommitdiffstats
path: root/xmrstak/backend/amd/minethd.cpp
diff options
context:
space:
mode:
authorfireice-uk <fireice-uk@users.noreply.github.com>2017-10-27 17:19:00 +0100
committerGitHub <noreply@github.com>2017-10-27 17:19:00 +0100
commit91b307859ea97cc1abdb17da01b94919d3521803 (patch)
tree604e06aac65134610405c75610735e08ac5398a4 /xmrstak/backend/amd/minethd.cpp
parent847831e5f11a31bf2b04bc737534b08d1bb18e91 (diff)
parentb5a7e4eb7f271cf0ae6a6085ee6e2a4466013e17 (diff)
downloadxmr-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/amd/minethd.cpp')
-rw-r--r--xmrstak/backend/amd/minethd.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/xmrstak/backend/amd/minethd.cpp b/xmrstak/backend/amd/minethd.cpp
index 4cbac6d..e262e0e 100644
--- a/xmrstak/backend/amd/minethd.cpp
+++ b/xmrstak/backend/amd/minethd.cpp
@@ -34,6 +34,7 @@
#include "xmrstak/misc/executor.hpp"
#include "xmrstak/misc/environment.hpp"
#include "xmrstak/params.hpp"
+#include "xmrstak/backend/cpu/hwlocMemory.hpp"
#include <assert.h>
#include <cmath>
@@ -46,7 +47,7 @@ namespace xmrstak
namespace amd
{
-minethd::minethd(miner_work& pWork, size_t iNo, GpuContext* ctx)
+minethd::minethd(miner_work& pWork, size_t iNo, GpuContext* ctx, const jconf::thd_cfg cfg)
{
oWork = pWork;
bQuit = 0;
@@ -55,8 +56,17 @@ minethd::minethd(miner_work& pWork, size_t iNo, GpuContext* ctx)
iHashCount = 0;
iTimestamp = 0;
pGpuCtx = ctx;
+ 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.");
}
extern "C" {
@@ -122,21 +132,20 @@ std::vector<iBackend*>* minethd::thread_starter(uint32_t threadOffset, miner_wor
for (i = 0; i < n; i++)
{
jconf::inst()->GetThreadConfig(i, cfg);
- minethd* thd = new minethd(pWork, i + threadOffset, &vGpuData[i]);
-
+
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 AMD GPU thread %d, affinity: %d.", i, (int)cfg.cpu_aff);
}
+ else
+ printer::inst()->print_msg(L1, "Starting AMD GPU thread %d, no affinity.", i);
+ minethd* thd = new minethd(pWork, i + threadOffset, &vGpuData[i], 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;
@@ -166,6 +175,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();
OpenPOWER on IntegriCloud