Use new method to set affinity.

This commit is contained in:
XMRig 2018-04-13 09:27:37 +07:00
parent c1800094d0
commit 9ce9147dad
16 changed files with 82 additions and 82 deletions

View file

@ -31,7 +31,6 @@
#include "App.h" #include "App.h"
#include "core/Config.h" #include "core/Config.h"
#include "core/Controller.h" #include "core/Controller.h"
#include "Cpu.h"
#include "log/Log.h" #include "log/Log.h"
@ -39,11 +38,6 @@ void App::background()
{ {
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
const int64_t affinity = m_controller->config()->affinity();
if (affinity != -1L) {
Cpu::setAffinity(-1, affinity);
}
if (!m_controller->config()->isBackground()) { if (!m_controller->config()->isBackground()) {
return; return;
} }

View file

@ -27,18 +27,12 @@
#include "App.h" #include "App.h"
#include "Cpu.h"
#include "core/Controller.h" #include "core/Controller.h"
#include "core/Config.h" #include "core/Config.h"
void App::background() void App::background()
{ {
const int64_t affinity = m_controller->config()->affinity();
if (affinity != -1L) {
Cpu::setAffinity(-1, affinity);
}
if (!m_controller->config()->isBackground()) { if (!m_controller->config()->isBackground()) {
return; return;
} }

View file

@ -42,7 +42,6 @@ public:
static int optimalThreadsCount(xmrig::Algo algo, bool doubleHash, int maxCpuUsage); static int optimalThreadsCount(xmrig::Algo algo, bool doubleHash, int maxCpuUsage);
static void init(); static void init();
static void setAffinity(int id, uint64_t mask);
static inline bool hasAES() { return (m_flags & AES) != 0; } static inline bool hasAES() { return (m_flags & AES) != 0; }
static inline bool isX64() { return (m_flags & X86_64) != 0; } static inline bool isX64() { return (m_flags & X86_64) != 0; }

View file

@ -52,28 +52,3 @@ void Cpu::init()
initCommon(); initCommon();
} }
void Cpu::setAffinity(int id, uint64_t mask)
{
cpu_set_t set;
CPU_ZERO(&set);
for (int i = 0; i < m_totalThreads; i++) {
if (mask & (1UL << i)) {
CPU_SET(i, &set);
}
}
if (id == -1) {
# ifndef __FreeBSD__
sched_setaffinity(0, sizeof(&set), &set);
# endif
} else {
# ifndef __ANDROID__
pthread_setaffinity_np(pthread_self(), sizeof(&set), &set);
# else
sched_setaffinity(gettid(), sizeof(&set), &set);
# endif
}
}

View file

@ -39,14 +39,3 @@ void Cpu::init()
initCommon(); initCommon();
} }
void Cpu::setAffinity(int id, uint64_t mask)
{
if (id == -1) {
SetProcessAffinityMask(GetCurrentProcess(), mask);
}
else {
SetThreadAffinityMask(GetCurrentThread(), mask);
}
}

View file

@ -34,10 +34,10 @@
#endif #endif
#include "common/xmrig.h"
#include "crypto/CryptoNight.h" #include "crypto/CryptoNight.h"
#include "log/Log.h" #include "log/Log.h"
#include "Mem.h" #include "Mem.h"
#include "xmrig.h"
bool Mem::allocate(xmrig::Algo algo, int threads, bool doubleHash, bool enabled) bool Mem::allocate(xmrig::Algo algo, int threads, bool doubleHash, bool enabled)

View file

@ -29,16 +29,16 @@
#include "Platform.h" #include "Platform.h"
char *Platform::m_defaultConfigName = nullptr; char Platform::m_defaultConfigName[520] = { 0 };
char *Platform::m_userAgent = nullptr; xmrig::c_str Platform::m_userAgent;
const char *Platform::defaultConfigName() const char *Platform::defaultConfigName()
{ {
size_t size = 520; size_t size = 520;
if (m_defaultConfigName == nullptr) { if (*m_defaultConfigName) {
m_defaultConfigName = new char[size]; return m_defaultConfigName;
} }
if (uv_exepath(m_defaultConfigName, &size) < 0) { if (uv_exepath(m_defaultConfigName, &size) < 0) {
@ -58,5 +58,6 @@ const char *Platform::defaultConfigName()
} }
} }
*m_defaultConfigName = '\0';
return nullptr; return nullptr;
} }

View file

@ -25,20 +25,26 @@
#define __PLATFORM_H__ #define __PLATFORM_H__
#include <stdint.h>
#include "common/utils/c_str.h"
class Platform class Platform
{ {
public: public:
static bool setThreadAffinity(uint64_t cpu_id);
static const char *defaultConfigName(); static const char *defaultConfigName();
static void init(const char *userAgent); static void init(const char *userAgent);
static void release();
static void setProcessPriority(int priority); static void setProcessPriority(int priority);
static void setThreadPriority(int priority); static void setThreadPriority(int priority);
static inline const char *userAgent() { return m_userAgent; } static inline const char *userAgent() { return m_userAgent.data(); }
private: private:
static char *m_defaultConfigName; static char m_defaultConfigName[520];
static char *m_userAgent; static xmrig::c_str m_userAgent;
}; };

View file

@ -22,6 +22,8 @@
*/ */
#include <mach/thread_act.h>
#include <mach/thread_policy.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/resource.h> #include <sys/resource.h>
@ -53,15 +55,24 @@ static inline char *createUserAgent()
} }
void Platform::init(const char *userAgent) bool Platform::setThreadAffinity(uint64_t cpu_id)
{ {
m_userAgent = userAgent ? strdup(userAgent) : createUserAgent(); thread_port_t mach_thread;
thread_affinity_policy_data_t policy = { static_cast<integer_t>(cpu_id) };
mach_thread = pthread_mach_thread_np(pthread_self());
return thread_policy_set(mach_thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1) == KERN_SUCCESS;
} }
void Platform::release() void Platform::init(const char *userAgent)
{ {
delete [] m_userAgent; if (userAgent) {
m_userAgent = userAgent;
}
else {
m_userAgent = createUserAgent();
}
} }

View file

@ -21,6 +21,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifdef __FreeBSD__
# include <sys/types.h>
# include <sys/param.h>
# include <sys/cpuset.h>
# include <pthread_np.h>
#endif
#include <sched.h> #include <sched.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -37,6 +45,11 @@
#endif #endif
#ifdef __FreeBSD__
typedef cpuset_t cpu_set_t;
#endif
static inline char *createUserAgent() static inline char *createUserAgent()
{ {
const size_t max = 160; const size_t max = 160;
@ -63,15 +76,28 @@ static inline char *createUserAgent()
} }
void Platform::init(const char *userAgent) bool Platform::setThreadAffinity(uint64_t cpu_id)
{ {
m_userAgent = userAgent ? strdup(userAgent) : createUserAgent(); cpu_set_t mn;
CPU_ZERO(&mn);
CPU_SET(cpu_id, &mn);
# ifndef __ANDROID__
return pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &mn) == 0;
# else
return sched_setaffinity(gettid(), sizeof(cpu_set_t), &mn) == 0;
# endif
} }
void Platform::release() void Platform::init(const char *userAgent)
{ {
delete [] m_userAgent; if (userAgent) {
m_userAgent = userAgent;
}
else {
m_userAgent = createUserAgent();
}
} }

View file

@ -27,9 +27,11 @@
#include <uv.h> #include <uv.h>
#include "log/Log.h"
#include "Platform.h" #include "Platform.h"
#include "version.h" #include "version.h"
#ifdef XMRIG_NVIDIA_PROJECT #ifdef XMRIG_NVIDIA_PROJECT
# include "nvidia/cryptonight.h" # include "nvidia/cryptonight.h"
#endif #endif
@ -82,16 +84,24 @@ static inline char *createUserAgent()
} }
void Platform::init(const char *userAgent) bool Platform::setThreadAffinity(uint64_t cpu_id)
{ {
m_userAgent = userAgent ? strdup(userAgent) : createUserAgent(); if (cpu_id >= 64) {
LOG_ERR("Unable to set affinity. Windows supports only affinity up to 63.");
}
return SetThreadAffinityMask(GetCurrentThread(), 1ULL << cpu_id) != 0;
} }
void Platform::release() void Platform::init(const char *userAgent)
{ {
delete [] m_defaultConfigName; if (userAgent) {
delete [] m_userAgent; m_userAgent = userAgent;
}
else {
m_userAgent = createUserAgent();
}
} }
@ -131,7 +141,6 @@ void Platform::setProcessPriority(int priority)
} }
void Platform::setThreadPriority(int priority) void Platform::setThreadPriority(int priority)
{ {
if (priority == -1) { if (priority == -1) {

View file

@ -73,7 +73,6 @@ xmrig::Controller::Controller()
xmrig::Controller::~Controller() xmrig::Controller::~Controller()
{ {
ConfigLoader::release(); ConfigLoader::release();
Platform::release();
delete d_ptr; delete d_ptr;
} }

View file

@ -25,8 +25,7 @@
#include "workers/Handle.h" #include "workers/Handle.h"
Handle::Handle(xmrig::IThread *config, size_t totalThreads, size_t totalWays, int64_t affinity) : Handle::Handle(xmrig::IThread *config, size_t totalThreads, size_t totalWays) :
m_affinity(affinity),
m_worker(nullptr), m_worker(nullptr),
m_totalThreads(totalThreads), m_totalThreads(totalThreads),
m_totalWays(totalWays), m_totalWays(totalWays),

View file

@ -38,11 +38,10 @@ class IWorker;
class Handle class Handle
{ {
public: public:
Handle(xmrig::IThread *config, size_t totalThreads, size_t totalWays, int64_t affinity); Handle(xmrig::IThread *config, size_t totalThreads, size_t totalWays);
void join(); void join();
void start(void (*callback) (void *)); void start(void (*callback) (void *));
inline int64_t affinity() const { return m_affinity; }
inline IWorker *worker() const { return m_worker; } inline IWorker *worker() const { return m_worker; }
inline size_t threadId() const { return m_config->index(); } inline size_t threadId() const { return m_config->index(); }
inline size_t totalThreads() const { return m_totalThreads; } inline size_t totalThreads() const { return m_totalThreads; }
@ -51,7 +50,6 @@ public:
inline xmrig::IThread *config() const { return m_config; } inline xmrig::IThread *config() const { return m_config; }
private: private:
int64_t m_affinity;
IWorker *m_worker; IWorker *m_worker;
size_t m_totalThreads; size_t m_totalThreads;
size_t m_totalWays; size_t m_totalWays;

View file

@ -42,11 +42,11 @@ Worker::Worker(Handle *handle) :
m_sequence(0), m_sequence(0),
m_thread(static_cast<xmrig::CpuThread *>(handle->config())) m_thread(static_cast<xmrig::CpuThread *>(handle->config()))
{ {
if (Cpu::threads() > 1 && handle->affinity() != -1L) { if (Cpu::threads() > 1 && m_thread->affinity() != -1L) {
Cpu::setAffinity(m_id, handle->affinity()); Platform::setThreadAffinity(m_thread->affinity());
} }
Platform::setThreadPriority(handle->config()->priority()); Platform::setThreadPriority(m_thread->priority());
m_ctx = Mem::create(m_id); m_ctx = Mem::create(m_id);
} }

View file

@ -130,7 +130,7 @@ void Workers::start(xmrig::Controller *controller)
uv_timer_start(&m_timer, Workers::onTick, 500, 500); uv_timer_start(&m_timer, Workers::onTick, 500, 500);
for (xmrig::IThread *thread : threads) { for (xmrig::IThread *thread : threads) {
Handle *handle = new Handle(thread, threads.size(), totalWays, controller->config()->affinity()); Handle *handle = new Handle(thread, threads.size(), totalWays);
m_workers.push_back(handle); m_workers.push_back(handle);
handle->start(Workers::onReady); handle->start(Workers::onReady);
} }