mirror of
https://github.com/xmrig/xmrig.git
synced 2025-02-04 04:06:44 +00:00
Use new method to set affinity.
This commit is contained in:
parent
c1800094d0
commit
9ce9147dad
16 changed files with 82 additions and 82 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue