mirror of
https://github.com/xmrig/xmrig.git
synced 2024-11-17 08:17:40 +00:00
Extended "numa" option for RandomX.
This commit is contained in:
parent
f34031a984
commit
7508411faf
8 changed files with 189 additions and 55 deletions
|
@ -66,6 +66,16 @@ if (WITH_RANDOMX)
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
if (CMAKE_CXX_COMPILER_ID MATCHES Clang)
|
||||||
set_source_files_properties(src/crypto/randomx/jit_compiler_x86.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-const-variable)
|
set_source_files_properties(src/crypto/randomx/jit_compiler_x86.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-const-variable)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (WITH_HWLOC)
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/rx/RxConfig_hwloc.cpp
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
list(APPEND SOURCES_CRYPTO
|
||||||
|
src/crypto/rx/RxConfig_basic.cpp
|
||||||
|
)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
remove_definitions(/DXMRIG_ALGO_RANDOMX)
|
remove_definitions(/DXMRIG_ALGO_RANDOMX)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
std::vector<uint32_t> HwlocCpuInfo::m_nodeIndexes;
|
|
||||||
uint32_t HwlocCpuInfo::m_features = 0;
|
uint32_t HwlocCpuInfo::m_features = 0;
|
||||||
|
|
||||||
|
|
||||||
|
@ -185,11 +184,11 @@ xmrig::HwlocCpuInfo::HwlocCpuInfo()
|
||||||
m_features |= SET_THISTHREAD_MEMBIND;
|
m_features |= SET_THISTHREAD_MEMBIND;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nodeIndexes.reserve(m_nodes);
|
m_nodeset.reserve(m_nodes);
|
||||||
hwloc_obj_t node = nullptr;
|
hwloc_obj_t node = nullptr;
|
||||||
|
|
||||||
while ((node = hwloc_get_next_obj_by_type(m_topology, HWLOC_OBJ_NUMANODE, node)) != nullptr) {
|
while ((node = hwloc_get_next_obj_by_type(m_topology, HWLOC_OBJ_NUMANODE, node)) != nullptr) {
|
||||||
m_nodeIndexes.emplace_back(node->os_index);
|
m_nodeset.emplace_back(node->os_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,9 @@ public:
|
||||||
~HwlocCpuInfo() override;
|
~HwlocCpuInfo() override;
|
||||||
|
|
||||||
static inline bool has(Feature feature) { return m_features & feature; }
|
static inline bool has(Feature feature) { return m_features & feature; }
|
||||||
static inline const std::vector<uint32_t> &nodeIndexes() { return m_nodeIndexes; }
|
|
||||||
|
inline const std::vector<uint32_t> &nodeset() const { return m_nodeset; }
|
||||||
|
inline hwloc_topology_t topology() const { return m_topology; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override;
|
CpuThreads threads(const Algorithm &algorithm, uint32_t limit) const override;
|
||||||
|
@ -67,7 +69,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
void processTopLevelCache(hwloc_obj_t obj, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const;
|
void processTopLevelCache(hwloc_obj_t obj, const Algorithm &algorithm, CpuThreads &threads, size_t limit) const;
|
||||||
|
|
||||||
static std::vector<uint32_t> m_nodeIndexes;
|
|
||||||
static uint32_t m_features;
|
static uint32_t m_features;
|
||||||
|
|
||||||
char m_backend[20] = { 0 };
|
char m_backend[20] = { 0 };
|
||||||
|
@ -76,6 +78,7 @@ private:
|
||||||
size_t m_cores = 0;
|
size_t m_cores = 0;
|
||||||
size_t m_nodes = 0;
|
size_t m_nodes = 0;
|
||||||
size_t m_packages = 0;
|
size_t m_packages = 0;
|
||||||
|
std::vector<uint32_t> m_nodeset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -104,13 +104,13 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void initDataset(const RxSeed &seed, uint32_t threads, bool hugePages)
|
static void initDataset(const RxSeed &seed, const std::vector<uint32_t> &nodeset, uint32_t threads, bool hugePages)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
LOG_INFO("%s" MAGENTA_BOLD("init dataset%s") " algo " WHITE_BOLD("%s (") CYAN_BOLD("%u") WHITE_BOLD(" threads)") BLACK_BOLD(" seed %s..."),
|
LOG_INFO("%s" MAGENTA_BOLD("init dataset%s") " algo " WHITE_BOLD("%s (") CYAN_BOLD("%u") WHITE_BOLD(" threads)") BLACK_BOLD(" seed %s..."),
|
||||||
tag,
|
tag,
|
||||||
false ? "s" : "", // FIXME
|
nodeset.size() > 1 ? "s" : "",
|
||||||
seed.algorithm().shortName(),
|
seed.algorithm().shortName(),
|
||||||
threads,
|
threads,
|
||||||
Buffer::toHex(seed.data().data(), 8).data()
|
Buffer::toHex(seed.data().data(), 8).data()
|
||||||
|
@ -168,7 +168,7 @@ bool xmrig::Rx::init(const Job &job, const RxConfig &config, bool hugePages, IRx
|
||||||
|
|
||||||
d_ptr->setState(job, listener);
|
d_ptr->setState(job, listener);
|
||||||
|
|
||||||
std::thread thread(RxPrivate::initDataset, job, config.threads(), hugePages);
|
std::thread thread(RxPrivate::initDataset, job, config.nodeset(), config.threads(), hugePages);
|
||||||
thread.detach();
|
thread.detach();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -25,51 +25,6 @@
|
||||||
|
|
||||||
#include "crypto/rx/RxConfig.h"
|
#include "crypto/rx/RxConfig.h"
|
||||||
#include "backend/cpu/Cpu.h"
|
#include "backend/cpu/Cpu.h"
|
||||||
#include "base/io/json/Json.h"
|
|
||||||
#include "rapidjson/document.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
|
||||||
|
|
||||||
static const char *kInit = "init";
|
|
||||||
static const char *kNUMA = "numa";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const
|
|
||||||
{
|
|
||||||
using namespace rapidjson;
|
|
||||||
auto &allocator = doc.GetAllocator();
|
|
||||||
|
|
||||||
Value obj(kObjectType);
|
|
||||||
|
|
||||||
obj.AddMember(StringRef(kInit), m_threads, allocator);
|
|
||||||
obj.AddMember(StringRef(kNUMA), m_numa, allocator);
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool xmrig::RxConfig::read(const rapidjson::Value &value)
|
|
||||||
{
|
|
||||||
if (value.IsObject()) {
|
|
||||||
m_numa = Json::getBool(value, kNUMA, m_numa);
|
|
||||||
m_threads = Json::getInt(value, kInit, m_threads);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XMRIG_FEATURE_HWLOC
|
|
||||||
bool xmrig::RxConfig::isNUMA() const
|
|
||||||
{
|
|
||||||
return m_numa && Cpu::info()->nodes() > 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t xmrig::RxConfig::threads() const
|
uint32_t xmrig::RxConfig::threads() const
|
||||||
|
|
|
@ -29,6 +29,9 @@
|
||||||
#include "rapidjson/fwd.h"
|
#include "rapidjson/fwd.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
namespace xmrig {
|
namespace xmrig {
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,9 +42,9 @@ public:
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_HWLOC
|
# ifdef XMRIG_FEATURE_HWLOC
|
||||||
bool isNUMA() const;
|
std::vector<uint32_t> nodeset() const;
|
||||||
# else
|
# else
|
||||||
inline constexpr bool isNUMA() const { return false; }
|
inline std::vector<uint32_t> nodeset() const { return std::vector<uint32_t>(); }
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
uint32_t threads() const;
|
uint32_t threads() const;
|
||||||
|
@ -49,6 +52,11 @@ public:
|
||||||
private:
|
private:
|
||||||
bool m_numa = true;
|
bool m_numa = true;
|
||||||
int m_threads = -1;
|
int m_threads = -1;
|
||||||
|
|
||||||
|
# ifdef XMRIG_FEATURE_HWLOC
|
||||||
|
std::vector<uint32_t> m_nodeset;
|
||||||
|
# endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
59
src/crypto/rx/RxConfig_basic.cpp
Normal file
59
src/crypto/rx/RxConfig_basic.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "crypto/rx/RxConfig.h"
|
||||||
|
#include "base/io/json/Json.h"
|
||||||
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
static const char *kInit = "init";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const
|
||||||
|
{
|
||||||
|
using namespace rapidjson;
|
||||||
|
auto &allocator = doc.GetAllocator();
|
||||||
|
|
||||||
|
Value obj(kObjectType);
|
||||||
|
obj.AddMember(StringRef(kInit), m_threads, allocator);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::RxConfig::read(const rapidjson::Value &value)
|
||||||
|
{
|
||||||
|
if (value.IsObject()) {
|
||||||
|
m_threads = Json::getInt(value, kInit, m_threads);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
100
src/crypto/rx/RxConfig_hwloc.cpp
Normal file
100
src/crypto/rx/RxConfig_hwloc.cpp
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/* XMRig
|
||||||
|
* Copyright 2010 Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
* Copyright 2012-2014 pooler <pooler@litecoinpool.org>
|
||||||
|
* Copyright 2014 Lucas Jones <https://github.com/lucasjones>
|
||||||
|
* Copyright 2014-2016 Wolf9466 <https://github.com/OhGodAPet>
|
||||||
|
* Copyright 2016 Jay D Dee <jayddee246@gmail.com>
|
||||||
|
* Copyright 2017-2018 XMR-Stak <https://github.com/fireice-uk>, <https://github.com/psychocrypt>
|
||||||
|
* Copyright 2018-2019 SChernykh <https://github.com/SChernykh>
|
||||||
|
* Copyright 2016-2019 XMRig <https://github.com/xmrig>, <support@xmrig.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "backend/cpu/Cpu.h"
|
||||||
|
#include "backend/cpu/platform/HwlocCpuInfo.h"
|
||||||
|
#include "base/io/json/Json.h"
|
||||||
|
#include "crypto/rx/RxConfig.h"
|
||||||
|
#include "rapidjson/document.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace xmrig {
|
||||||
|
|
||||||
|
static const char *kInit = "init";
|
||||||
|
static const char *kNUMA = "numa";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rapidjson::Value xmrig::RxConfig::toJSON(rapidjson::Document &doc) const
|
||||||
|
{
|
||||||
|
using namespace rapidjson;
|
||||||
|
auto &allocator = doc.GetAllocator();
|
||||||
|
|
||||||
|
Value obj(kObjectType);
|
||||||
|
|
||||||
|
obj.AddMember(StringRef(kInit), m_threads, allocator);
|
||||||
|
|
||||||
|
if (!m_nodeset.empty()) {
|
||||||
|
Value numa(kArrayType);
|
||||||
|
|
||||||
|
for (uint32_t i : m_nodeset) {
|
||||||
|
numa.PushBack(i, allocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.AddMember(StringRef(kNUMA), numa, allocator);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
obj.AddMember(StringRef(kNUMA), m_numa, allocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool xmrig::RxConfig::read(const rapidjson::Value &value)
|
||||||
|
{
|
||||||
|
if (value.IsObject()) {
|
||||||
|
m_threads = Json::getInt(value, kInit, m_threads);
|
||||||
|
|
||||||
|
const auto &numa = Json::getValue(value, kNUMA);
|
||||||
|
if (numa.IsArray()) {
|
||||||
|
m_nodeset.reserve(numa.Size());
|
||||||
|
|
||||||
|
for (const auto &node : numa.GetArray()) {
|
||||||
|
if (node.IsUint()) {
|
||||||
|
m_nodeset.emplace_back(node.GetUint());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (numa.IsBool()) {
|
||||||
|
m_numa = numa.GetBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<uint32_t> xmrig::RxConfig::nodeset() const
|
||||||
|
{
|
||||||
|
if (!m_nodeset.empty()) {
|
||||||
|
return m_nodeset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (m_numa && Cpu::info()->nodes() > 1) ? static_cast<HwlocCpuInfo *>(Cpu::info())->nodeset() : std::vector<uint32_t>();
|
||||||
|
}
|
Loading…
Reference in a new issue